原标题《用Python做个海量小姐姐素描图》,本文只介绍如何实现素描风格并贴出具体代码。

大概介绍

今天刷手机看到微信公众号上这篇文章,感觉蛮有意思的,里面贴出了大致思路和相关的OpenCV2片段代码。然后秉着好奇的心就想来试试看,没想到真的成功啦,下面就直接贴出效果图和具体代码,注释做分析。

原图素材

漫画风格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//代码思路:彩色原图 > 转化为灰度图 > 均值滤波模糊处理 > 自适应二值化为白底黑图

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;

int main()
{
Mat srcImage = imread("1.jpeg");
if (!srcImage.data)
{
cout << "读取图片错误,请重新输入正确路径!\n";
system("pause");
return -1;
}
imshow("ORIGINAL", srcImage);

Mat srcGray;
cvtColor(srcImage, srcGray, CV_RGB2GRAY);
imshow("GRAY", srcGray);

Mat tempImage;
medianBlur(srcGray,tempImage,5);

const int maxVal = 255; //初始化参数
int blockSize = 3; //取值3、5、7....等
int constValue = 2;
int adaptiveMethod = 0;
int thresholdType = 0;
/*
自适应阈值算法
0:ADAPTIVE_THRESH_MEAN_C
1:ADAPTIVE_THRESH_GAUSSIAN_C
--------------------------------------
阈值类型
0:THRESH_BINARY
1:THRESH_BINARY_INV
*/

Mat adapImage;
adaptiveThreshold(tempImage, adapImage, maxVal, adaptiveMethod, thresholdType, blockSize, constValue);

imshow("ADDAPTIVE", adapImage);
imwrite("adap.jpeg",adapImage);

waitKey(0);
return 0;
}

写实风格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//代码思路:彩色原图 > 转化为灰度图 > 高斯滤波模糊处理 > 灰度图与高斯图做个简单的减法

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;

int main()
{
Mat srcImage = imread("1.jpeg"); //载入图像
imshow("ORIGINAL",srcImage);

Mat grayImage;
cvtColor(srcImage, grayImage, CV_RGB2GRAY);
imshow("GRAY",grayImage);

Mat gaussImage;
GaussianBlur(grayImage,gaussImage,Size(21,21),0,0);
imshow("GAUSS",gaussImage);

Mat dstImage;
divide(grayImage,gaussImage,dstImage,255,-1);

imshow("DST",dstImage);
imwrite("DST.jpeg",dstImage);

waitKey(0);
return 0;
}

成功复现