OpenCV-Python实现怀旧滤镜与连环画滤镜


Posted in Python onJune 09, 2021

怀旧滤镜实现原理

不管是荣耀华为手机还是其他的手机,我们都可以找到相机中的怀旧效果,这是手机中常用的一种滤镜效果。

怀旧风格的设计主要是在图像的颜色空间进行处理。以BGR为例,对B、G、R这3个通道的颜色数值进行处理,让图像有一种泛黄的怀旧效果。设计的转换公式如下:

B=0.272r+0.534g+0.131*b

G=0.349r+0.686g+0.168*b

R=0.393r+0.769g+0.189*b

计算公式中的小写的bgr是原图像的RGB通道的颜色,结果BGR是怀旧变换后的值。需要注意的是,颜色值的范围在[0,255],需要在程序中约束一下。

实现怀旧滤镜

既然我们已经了解了其实现的原理公式。下面我们直接上代码实现该功能,具体代码如下所示:

def cowboy_effect(img):
    new_img = img.copy()
    h, w, n = img.shape
    for i in range(w):
        for j in range(h):
            b = img[j, i, 0]
            g = img[j, i, 1]
            r = img[j, i, 2]
            B = int(0.272 * r + 0.534 * g + 0.131 * b)
            G = int(0.349 * r + 0.686 * g + 0.168 * b)
            R = int(0.393 * r + 0.769 * g + 0.189 * b)
            new_img[j, i, 0] = max(0, min(B, 255))
            new_img[j, i, 1] = max(0, min(G, 255))
            new_img[j, i, 2] = max(0, min(R, 255))
    return new_img


if __name__ == "__main__":
    img = cv2.imread("48.jpg")
    cv2.imshow("0", img)
    cv2.imshow("1", cowboy_effect(img))
    cv2.waitKey()
    cv2.destroyAllWindows()

运行之后,效果如下:

OpenCV-Python实现怀旧滤镜与连环画滤镜

连环画滤镜原理

从怀旧滤镜就可以看出来,其实相机的各种滤镜效果就是对RGB的颜色通道进行计算处理。既然怀旧滤镜有公式,那么肯定的连环画滤镜也有公式。它的具体公式如下:

R = |g ? b + g + r| * r / 256

G = |b ? g + b + r| * r / 256

B = |b ? g + b + r| * g / 256

实现连环画滤镜

有了公式,下面直接套用公式即可。具体代码如下所示:

# 连环画滤镜
def comics_effect(img):
    new_img = img.copy()
    h, w, n = img.shape
    for i in range(w):
        for j in range(h):
            b = img[j, i, 0]
            g = img[j, i, 1]
            r = img[j, i, 2]
            R = int(int(abs(g - b + g + r)) * r / 256)
            G = int(int(abs(b - g + b + r)) * r / 256)
            B = int(int(abs(b - g + b + r)) * g / 256)
            new_img[j, i, 0] = R
            new_img[j, i, 1] = G
            new_img[j, i, 2] = B
    return new_img


if __name__ == "__main__":
    img = cv2.imread("48.jpg")
    cv2.imshow("0", img)
    cv2.imshow("1", comics_effect(img))
    cv2.waitKey()
    cv2.destroyAllWindows()

运行之后,效果如下:

OpenCV-Python实现怀旧滤镜与连环画滤镜

综上所述,基本上所有的基础滤镜都是通过对RGB通道的颜色值进行公式计算得到的。当然,要是数学很好,又对算法情有独钟的读者,可以自己自研滤镜算法丰富滤镜的效果。

熔铸算法

r = r*128/(g+b +1);
g = g*128/(r+b +1);
b = b*128/(g+r +1);

冰冻算法

r = (r-g-b)*3/2;
g = (g-r-b)*3/2;
b = (b-g-r)*3/2;

#include <math.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#define MAXSIZE (32768)
using namespace cv;
using namespace std;
 
void casting(const Mat& src)
{
 Mat img;
 src.copyTo(img);
 int width=src.cols;
 int heigh=src.rows;
 Mat dst(img.size(),CV_8UC3);
 for (int y=0;y<heigh;y++)
 {
  uchar* imgP=img.ptr<uchar>(y);
  uchar* dstP=dst.ptr<uchar>(y);
  for (int x=0;x<width;x++)
  {
   float b0=imgP[3*x];
   float g0=imgP[3*x+1];
   float r0=imgP[3*x+2];
 
   float b = b0*255/(g0+r0+1);
   float g = g0*255/(b0+r0+1);
   float r = r0*255/(g0+b0+1);
 
   r = (r>255 ? 255 : (r<0? 0 : r));
   g = (g>255 ? 255 : (g<0? 0 : g));
   b = (b>255 ? 255 : (b<0? 0 : b));
 
   dstP[3*x] = (uchar)b;
   dstP[3*x+1] = (uchar)g;
   dstP[3*x+2] = (uchar)r;
  }
 }
 imshow("熔铸",dst);
 imwrite("D:/img/熔铸.jpg",dst);
 
}
 
void freezing(const Mat& src)
{
 Mat img;
 src.copyTo(img);
 int width=src.cols;
 int heigh=src.rows;
 Mat dst(img.size(),CV_8UC3);
 for (int y=0;y<heigh;y++)
 {
  uchar* imgP=img.ptr<uchar>(y);
  uchar* dstP=dst.ptr<uchar>(y);
  for (int x=0;x<width;x++)
  {
   float b0=imgP[3*x];
   float g0=imgP[3*x+1];
   float r0=imgP[3*x+2];
 
   float b = (b0-g0-r0)*3/2;
   float g = (g0-b0-r0)*3/2;
   float r = (r0-g0-b0)*3/2;
 
   r = (r>255 ? 255 : (r<0? -r : r));
   g = (g>255 ? 255 : (g<0? -g : g));
   b = (b>255 ? 255 : (b<0? -b : b));
//    r = (r>255 ? 255 : (r<0? 0 : r));
//    g = (g>255 ? 255 : (g<0? 0 : g));
//    b = (b>255 ? 255 : (b<0? 0 : b));
   dstP[3*x] = (uchar)b;
   dstP[3*x+1] = (uchar)g;
   dstP[3*x+2] = (uchar)r;
  }
 }
 imwrite("D:/img/冰冻.jpg",dst);
}
 
int main()
{
 Mat src = imread("D:/img/scene04.jpg",1);
 imshow("src",src);
 casting(src);
 freezing(src);
 
 waitKey();
 
}

到此这篇关于OpenCV-Python实现怀旧滤镜与连环画滤镜的文章就介绍到这了,更多相关OpenCV 怀旧滤镜与连环画滤镜内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python格式化css文件的方法
Mar 10 Python
Python多线程编程(三):threading.Thread类的重要函数和方法
Apr 05 Python
详解Python中for循环的使用
Apr 14 Python
Python中的rfind()方法使用详解
May 19 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
May 04 Python
基于树莓派的语音对话机器人
Jun 17 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
用python写测试数据文件过程解析
Sep 25 Python
python网络编程之五子棋游戏
May 14 Python
python实现批量移动文件
Apr 05 Python
如何用 Python 子进程关闭 Excel 自动化中的弹窗
May 07 Python
OpenCV-Python实现轮廓的特征值
Jun 09 #Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
Jun 09 #Python
Python的这些库,你知道多少?
OpenCV-Python使用cv2实现傅里叶变换
Python合并多张图片成PDF
Jun 09 #Python
Python3 多线程(连接池)操作MySQL插入数据
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
You might like
PHP模拟post提交数据方法汇总
2016/02/16 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
jQuery boxy弹出层插件中文演示及使用讲解
2011/02/24 Javascript
jQuery+css3实现文字跟随鼠标的上下抖动
2015/07/31 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
python通过ssh-powershell监控windows的方法
2015/06/02 Python
在Django框架中设置语言偏好的教程
2015/07/27 Python
Python使用剪切板的方法
2017/06/06 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
Python3 使用cookiejar管理cookie的方法
2018/12/28 Python
Python Flask框架扩展操作示例
2019/05/03 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
班班通校本培训方案
2014/03/12 职场文书
竞选村长演讲稿
2014/04/28 职场文书
医学生求职自荐书
2014/06/12 职场文书
超市啤酒狂欢夜策划方案范文!
2019/07/03 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书