场景需求
今天心血来潮,想给女朋友做个素描图,就写个代码简单实现一下。
功能实现思路
首先加载下原图,进行高斯模糊得到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; }
测试效果
图1 原图
图2 高斯滤波效果图
图3 纹理图
图4 最终效果图
上述测试效果受高斯滤波的尺寸影响,素描图的实现方案有很多,我只是提供了一种比较简单的思路,我女朋友吐槽说有素描感觉,但是真正的素描图更有感觉,所以手绘还是牛逼。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!