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多线程中阻塞(join)与锁(Lock)使用误区解析
Apr 27 Python
python如何求解两数的最大公约数
Sep 27 Python
Python控制键盘鼠标pynput的详细用法
Jan 28 Python
python 执行终端/控制台命令的例子
Jul 12 Python
python__name__原理及用法详解
Nov 02 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
Python各种扩展名区别点整理
Feb 27 Python
python logging.info在终端没输出的解决
May 12 Python
打印tensorflow恢复模型中所有变量与操作节点方式
May 26 Python
浅谈pytorch中的BN层的注意事项
Jun 23 Python
利用scikitlearn画ROC曲线实例
Jul 02 Python
详解如何使用Pytest进行自动化测试
Jan 14 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
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
使用PHP开发留言板功能
2019/11/19 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
JavaScript判断窗口是否最小化的代码(跨浏览器)
2010/08/01 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
基于vue开发的在线付费课程应用过程
2018/01/25 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
用Python3创建httpServer的简单方法
2018/06/04 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
python多线程并发及测试框架案例
2019/10/15 Python
python在不同条件下的输入与输出
2020/02/13 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
报社实习生自荐信
2014/01/24 职场文书
社区工作感言
2014/02/21 职场文书
保险公司演讲稿
2014/09/02 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
化妆品促销活动总结
2015/05/07 职场文书
芙蓉镇观后感
2015/06/10 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang