【计算机视觉学习】opencv基础(三)编码实现常见滤镜功能

前言

这是计算机视觉学习系列的第三篇文章,讲的是如何通过代码实现一些简单的滤镜功能。文章依然以经典的lena图作为操作示例。

基础版------基础色彩变换形成的风格

基本思路:我们可以通过将图片的色彩进行变换,为它赋予一种新的风格,这是最简单的一种滤镜实现方式。opencv已经提供了如下的一些颜色效果:

还提供了一段代码作为用法示例。相关代码这里就不全部复制粘贴了,感兴趣的uu自行查阅官方文档即可。核心代码其实就是这句:

cpp 复制代码
    applyColorMap(img_in, img_color, COLORMAP_DEEPGREEN);

其中,img_in是输入的原图像的Mat形式,img_color是处理后的Mat形式图像,COLORMAP_DEEPGREEN宏对应于上图列表中的不同的颜色。 以下是笔者认为比较好看的效果,风格也是我给命名的。正所谓萝卜青菜各有所爱,大家当看个乐子就好。

复古风:

明艳风:

冷艳风:

森系风:

进阶版------实现Lomo效果

说起Lomo效果,一些喜欢玩相机的朋友应该不会陌生。以下是摘自网络的介绍:

lomo摄影是指使用专门的lomo相机或者其他相机,通过前期或后期的手段,产生夸张色彩和鲜明特点的图片,以及对画面的理解和表达的摄影。

大致思路及主要代码

首先,我们来看一张实现后的效果图:

那么,如何实现这种效果呢?通过观察,我们可以发现和原图像相比,它有两个特点:

  • 暗指更暗,亮值更亮,形成的对比更明显。
  • 图片中有一个明显的光圈,突出了光圈以内的部分,光圈以外则是阴影。

相应地,可以通过以下步骤来分别实现上述效果:

  • 使用LUT(颜色查找表),利用曲线变幻来操纵红色通道。
    • 产生曲线的公式是这样的: <math xmlns="http://www.w3.org/1998/Math/MathML"> 1 1 + e − x − 0.5 s \frac{1}{1+e^-\frac{x-0.5}{s}} </math>1+e−sx−0.51
    • 对应的编码实现如下:
cpp 复制代码
    const double E = std::exp(1.0);
    Mat lut(1, 256, CV_8UC1);
    for (int i = 0; i < 256; i++)
    {
        float x = (float)i / 256.0;
        lut.at<uchar>(i) = cvRound(256 * (1 / (1 + pow(E, -((x - 0.5) / 0.1)))));
    }
  • 对图像进行暗晕效果处理。通俗来说,就是创建一个黑色背景的白色圆圈,并且对其进行模糊处理,从而实现类似于光晕的效果。编码实现如下:
cpp 复制代码
    Mat halo(img.rows, img.cols, CV_32FC3, Scalar(0.3, 0.3, 0.3));
    circle(halo, Point(img.cols / 2, img.rows / 2), img.cols / 3, Scalar(1, 1, 1), -1);
    blur(halo, halo, Size(img.cols / 3, img.cols / 3));

需要注意的通用点(非仅针对本效果)

那么,如何把上述的高对比图像与光晕相结合呢?其实很简单:把这两个矩阵相乘

但是需要注意元素数据类型转换的问题。因为输入图像的矩阵元素值是整型,而经过模糊处理后的图像元素值范围则在0~1之间:(图源自官方文档)

为了避免精度丢失,可以先将输入图像转为32位浮点数形式,矩阵相乘后再转回去。代码实现如下:

cpp 复制代码
    Mat tmp;
    result.convertTo(tmp, CV_32FC3);
    multiply(tmp, halo, tmp);
    tmp.convertTo(result, CV_8UC3);

参考资料

相关推荐
Moe4882 分钟前
合并Pdf、excel、图片、word为单个Pdf文件的工具类(拿来即用版)
java·后端
bcbnb3 分钟前
手机崩溃日志导出的工程化方法,构建多工具协同的跨平台日志获取与分析体系(iOS/Android 全场景 2025 进阶版)
后端
Java水解6 分钟前
为何最终我放弃了 Go 的 sync.Pool
后端·go
二川bro27 分钟前
第41节:第三阶段总结:打造一个AR家具摆放应用
后端·restful
aiopencode39 分钟前
苹果应用商店上架全流程 从证书体系到 IPA 上传的跨平台方法
后端
百***86051 小时前
Spring BOOT 启动参数
java·spring boot·后端
wei_shuo1 小时前
基于Linux平台的openGauss一主两备高可用集群部署与运维实践研究
后端
by__csdn1 小时前
微服务与单体那些事儿
java·后端·微服务·云原生·架构
天草二十六_简村人1 小时前
dify中级入门示例--使用知识库搭建智能客服机器人
后端·ai·云原生·ai编程
AndrewHZ1 小时前
【图像处理基石】图像连通域计算:原理、算法实现与应用全解析
图像处理·算法·计算机视觉·cv·算法原理·视觉算法·连通域计算