OpenCV实现图像转换为素描效果

2020-11-13 10:20:48 浏览数 (1)

OpenCV图像转素描

我们在一些相机APP的功能里会看到有把照片转换为素描效果的,看起来就很高大上的感觉,今天我们也用OpenCV实现一下这个效果。

实现效果

先上一张经典的Lena的图片转换为素描效果的图片,左边是原图的效果,右边就是我们通过OpenCV的几行代码实现的一个素描的效果。

实现流程

微卡智享

图像转为素描的流程其实也挺简单的,一共就是四步即可实现。

#

实现流程

1

图像去色(转为灰度图)

2

图像取反

3

将取反后的图像进行高斯模糊

4

去色后的图像(灰度图)和取反模糊后的图像以混合模式为颜色减淡进行融合

代码实现

微卡智享

新建一个opencvsrctosumiao的项目,配置参见《VS2017配置OpenCV通用属性》

01

图像去色

02

图像取反

实现图像取反可以有三种方式:

  • 遍历像素值直接用255去减
代码语言:javascript复制
gray_inverse = Scalar(255, 255, 255) - gray;
  • 使用subtract函数
代码语言:javascript复制
subtract(Scalar(255, 255, 255), gray, gray_inverse);
  • 通地位运算直接取反
代码语言:javascript复制
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;
}

换几张图的效果

0 人点赞