双边滤波产生水彩画风格
双边滤波是一种可以保留边缘的滤波器同高斯滤波不同的是,双边滤波不尽可以达到预期的模糊效果,而且可以保留边缘,而美术上水彩画的特点是颜色水润,平滑,考色彩的差异来突出边缘,通过与双边滤波器的特点相比较,选用其来进行水彩风格化也就不意外了。
由于不同的图片特征不同,所以处理时滤波的次数也就不同,因此为了达到预期的效果,所以通过用户交互来决定滤波次数,从而决定最终的处理结果。
开源的opencv开发包里面的函数cvSmooth()提供了双边滤波的算法,本文将直接采用,全部代码如下文所示,所用到的库由opencv提供。
代码:
/* * 独在异乡为异客,每逢佳节倍思亲 */ //所需要的库 #pragma comment(lib, "opencv_imgproc220d.lib") #pragma comment(lib, "opencv_highgui220d.lib") #pragma comment(lib, "opencv_core220d.lib") #include "cv.h" #include "highgui.h" #include <algorithm> IplImage *pImg; IplImage *src, *dst; IplImage *tempImg; //保存上次的处理结果 int tempPos = 0; //保存上次的位置 //工具条 void track_bar(int pos) { int p; if (pos >= tempPos) p = pos - tempPos; else { src = cvCloneImage(pImg); p = 0; } tempPos = pos; // printf("%d\n", pos); for (int i = p; i < pos; i++) { cvSmooth(src, dst, CV_BILATERAL, 7, 7, 35, 9); //参数三越大,越接近高斯滤波 swap(src, dst); } // cvSaveImage("m.jpg", src); cvShowImage("src", src); cvWaitKey(0); } int main( int argc, char** argv ) { if (argv[1]) { pImg = cvLoadImage(argv[1]); } else pImg = cvLoadImage("hehua.jpg"); dst = cvCloneImage(pImg); src = cvCloneImage(pImg); int *pos = new int; cvNamedWindow("src", 1); cvCreateTrackbar("trackbar", "src", pos, 20, track_bar); cvShowImage("pImg", pImg); cvShowImage("src", src); cvWaitKey(0); }原图如下: [caption id="attachment_36" align="aligncenter" width="496" caption="srcImage"][/caption] 处理后的图像: [caption id="attachment_38" align="aligncenter" width="500" caption="dstImage"][/caption]