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入门篇之函数
Oct 20 Python
Python中实现常量(Const)功能
Jan 28 Python
Python中的下划线详解
Jun 24 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
python 获取当天凌晨零点的时间戳方法
May 22 Python
Python使用sort和class实现的多级排序功能示例
Aug 15 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 Python
Python如何使用ElementTree解析xml
Oct 12 Python
Django缓存Cache使用详解
Nov 30 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中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
PHP代码保护--Zend Guard的使用详解
2013/06/03 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
php实现网站留言板功能
2015/11/04 PHP
PDO::exec讲解
2019/01/28 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
Python学生成绩管理系统简洁版
2020/04/05 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
python调用摄像头显示图像的实例
2018/08/03 Python
matplotlib实现区域颜色填充
2019/03/18 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
linux面试题参考答案(8)
2015/08/11 面试题
行政办公室岗位职责
2014/03/18 职场文书
婚前保证书
2014/04/29 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
民主生活会发言材料
2014/10/20 职场文书
安全保证书格式
2015/02/28 职场文书
小学班主任个人总结
2015/03/03 职场文书
工作年限证明模板
2015/06/15 职场文书
Vue的过滤器你真了解吗
2022/02/24 Vue.js