作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
场景需求
今天心血来潮,想给女朋友做个素描图,就写个代码简单实现一下。
功能实现思路
首先加载下原图,进行高斯模糊得到blur图,将原图和blur图进行除法运算,可以提取出纹理图,纹理涂本身已经有些素描的感觉了;为了加深效果,需要进一步处理,取纹理图的反转图再与blur进行一次除法运算,可以得到反色系的纹理图,然后反转即可实现加深效果。上述效果的实现其实很大程度上依赖于divide除法运算中对0点的处理,即除以0或者0被除都为0 ,所以有时需要进行反转,如果不反转,最后得到的可能就是纯色图了。
C++测试代码
#include <iostream>
#include <opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 加载原始图片
Mat src = imread("cheng.jpg", 0);
// 高斯模糊
Mat blur;
GaussianBlur(src, blur, Size(15, 15), 0, 0);
// 提取纹理
Mat veins;
divide(src, blur, veins, 255);
// 加深处理
Mat deepenb, deepena;
divide(255-veins, blur, deepenb, 255);
deepena = 255 - deepenb;
imwrite("result.png", deepena);
imshow("gray", src);
imshow("blur", blur);
imshow("veins", veins);
imshow("result", deepena);
waitKey(0);
system("pause");
return 0;
}
测试效果
上述测试效果受高斯滤波的尺寸影响,素描图的实现方案有很多,我只是提供了一种比较简单的思路,我女朋友吐槽说有素描感觉,但是真正的素描图更有感觉,所以手绘还是牛逼。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容