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

作者:一天一篇Python库 时间:2023-01-29 08:56:22 

怀旧滤镜实现原理

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

怀旧风格的设计主要是在图像的颜色空间进行处理。以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();

}

来源:https://liyuanjinglyj.blog.csdn.net/article/details/115118465

标签:OpenCV,怀旧滤镜,连环画滤镜
0
投稿

猜你喜欢

  • 定格动画浅析(一)

    2009-07-30 12:50:00
  • Python GUI库Tkiner使用方法代码示例

    2022-03-26 04:51:29
  • 网页禁用右键实现代码(JavaScript代码)

    2024-02-26 09:46:23
  • 防止表单重复提交的巧妙方法

    2009-03-09 18:32:00
  • BOM中location对象的属性和方法

    2024-04-16 09:55:07
  • 通过numba模块给Python代码提速的方法详解

    2022-02-02 09:15:19
  • 悟道WEB标准:统一思想,遵循标准

    2009-10-11 16:38:00
  • Django + Uwsgi + Nginx 实现生产环境部署的方法

    2023-01-01 06:02:49
  • Perl 哈希Hash用法之入门教程

    2023-11-06 22:57:17
  • 详解Python Socket网络编程

    2022-09-05 14:04:16
  • Python实现快速排序的方法详解

    2022-08-29 13:08:35
  • python操作XML格式文件的一些常见方法

    2023-02-10 00:06:12
  • Excel VBA连接并操作Oracle

    2009-08-08 22:58:00
  • Golang轻量级IoC容器安装使用示例

    2023-07-23 14:49:12
  • Python 调用C++封装的进一步探索交流

    2022-10-29 22:43:43
  • css样式表滤镜全接触

    2007-10-26 12:48:00
  • 详解重置Django migration的常见方式

    2022-10-30 13:21:17
  • Python爬虫PyQuery库基本用法入门教程

    2022-06-26 05:13:02
  • js实现限定范围拖拽的示例

    2024-04-29 13:38:55
  • 来自腾讯的一个不固定高度得消息的滚动特效

    2024-04-17 10:19:34
  • asp之家 网络编程 m.aspxhome.com