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写的贪吃蛇游戏例子
Jun 16 Python
在Python下使用Txt2Html实现网页过滤代理的教程
Apr 11 Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
使用py2exe在Windows下将Python程序转为exe文件
Mar 04 Python
Eclipse中Python开发环境搭建简单教程
Mar 23 Python
python实现最长公共子序列
May 22 Python
Python使用sort和class实现的多级排序功能示例
Aug 15 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
基于pandas中expand的作用详解
Dec 17 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
Jun 11 Python
Python中的 Set 与 dict
Mar 13 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完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
繁简字转换功能
2006/07/19 Javascript
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
input输入框的自动匹配(原生代码)
2013/03/19 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
浅析vue-router实现原理及两种模式
2020/02/11 Javascript
微信小程序文章详情功能完整实例
2020/06/03 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
python多维数组切片方法
2018/04/13 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
pandas实现导出数据的四种方式
2020/12/13 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
2021/03/03 Python
自动化系在校本科生求职信
2013/10/23 职场文书
广告学专业毕业生自荐信
2014/05/28 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
导游带团欢迎词
2015/09/30 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
调解协议书范本
2016/03/21 职场文书
Mysql 如何实现多张无关联表查询数据并分页
2021/06/05 MySQL
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫