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

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为1440,预计阅读4分钟

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

颜色减淡进行融合

上面这行代码也是在网上看到的,实现了颜色减淡的效果,致敬大牛。

颜色减淡效果

完整代码

#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;
}

换几张图的效果

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

C++ OpenCV输出中文

C++ OpenCV标记函数drawMarker的使用

Unity3D使用Timeline实现过场动画

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值