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中捕捉详细异常信息的代码示例
Sep 18 Python
在Python中用keys()方法返回字典键的教程
May 21 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
TensorFlow实现随机训练和批量训练的方法
Apr 28 Python
python 接口实现 供第三方调用的例子
Aug 13 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
解决更改AUTH_USER_MODEL后出现的问题
May 14 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
详解Python小数据池和代码块缓存机制
Apr 07 Python
Python调用腾讯API实现人脸身份证比对功能
Apr 04 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读取纯真ip数据库使用示例
2014/01/26 PHP
php post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
DOM相关内容速查手册
2007/02/07 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
javascript数组详解
2014/10/22 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python 判断自定义对象类型
2009/03/21 Python
Python中的字符串替换操作示例
2016/06/27 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
Python+OpenCv制作证件图片生成器的操作方法
2019/08/21 Python
基于python使用tibco ems代码实例
2019/12/20 Python
pytorch 改变tensor尺寸的实现
2020/01/03 Python
keras实现调用自己训练的模型,并去掉全连接层
2020/06/09 Python
python实现斗地主分牌洗牌
2020/06/22 Python
自荐信格式
2013/12/01 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
大学生在校表现评语
2014/12/31 职场文书
先进个人评语大全
2015/01/04 职场文书
论文答谢词
2015/01/20 职场文书
永远是春天观后感
2015/06/12 职场文书
Redis可视化客户端小结
2021/06/10 Redis