OpenCV图像转素描
我们在一些相机APP的功能里会看到有把照片转换为素描效果的,看起来就很高大上的感觉,今天我们也用OpenCV实现一下这个效果。
实现效果
先上一张经典的Lena的图片转换为素描效果的图片,左边是原图的效果,右边就是我们通过OpenCV的几行代码实现的一个素描的效果。
实现流程
微卡智享
图像转为素描的流程其实也挺简单的,一共就是四步即可实现。
# | 实现流程 |
---|---|
1 | 图像去色(转为灰度图) |
2 | 图像取反 |
3 | 将取反后的图像进行高斯模糊 |
4 | 去色后的图像(灰度图)和取反模糊后的图像以混合模式为颜色减淡进行融合 |
代码实现
微卡智享
新建一个opencvsrctosumiao的项目,配置参见《VS2017配置OpenCV通用属性》
01
图像去色
02
图像取反
实现图像取反可以有三种方式:
- 遍历像素值直接用255去减
gray_inverse = Scalar(255, 255, 255) - gray;
- 使用subtract函数
subtract(Scalar(255, 255, 255), gray, gray_inverse);
- 通地位运算直接取反
gray_inverse = ~gray;
取反后的效果
03
将取反后的图像进行高斯模糊
对取反后的图像我们做一个高斯模糊,上图中的Size(15,15)和后面的两个50的参数可以自己根据实际情况设置,我这边试了几个后觉得这个效果还不错,就采用这两个值了。
高斯模糊后的效果
04
颜色减淡进行融合
上面这行代码也是在网上看到的,实现了颜色减淡的效果,致敬大牛。
颜色减淡效果
完整代码
代码语言:javascript复制#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat gray, gray_inverse,dst;
Mat src = imread("E:/DCIM/test3.jpg");
if (!src.data) {
cout << "读取图像失败" << endl;
return -1;
}
imshow("src", src);
//1.转为灰度图
cvtColor(src, gray, COLOR_BGRA2GRAY);
//2.图像取反,三种取反的方法
//2.1 遍历像素直接用255去减
//gray_inverse = Scalar(255, 255, 255) - gray;
//2.2 用subtract函数
//subtract(Scalar(255, 255, 255), gray, gray_inverse);
//2.3 位运算直接取反
gray_inverse = ~gray;
imshow("gray_inverse", gray_inverse);
//3 高斯模糊
GaussianBlur(gray_inverse, gray_inverse, Size(15, 15), 50, 50);
imshow("GaussianBlur", gray_inverse);
//4 颜色减淡混合
divide(gray, 255 - gray_inverse, dst, 255);
imshow("dst", dst);
waitKey(0);
return 0;
}
换几张图的效果
完