双边滤波产生水彩画风格

双边滤波是一种可以保留边缘的滤波器同高斯滤波不同的是,双边滤波不尽可以达到预期的模糊效果,而且可以保留边缘,而美术上水彩画的特点是颜色水润,平滑,考色彩的差异来突出边缘,通过与双边滤波器的特点相比较,选用其来进行水彩风格化也就不意外了。 由于不同的图片特征不同,所以处理时滤波的次数也就不同,因此为了达到预期的效果,所以通过用户交互来决定滤波次数,从而决定最终的处理结果。 开源的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"]srcImage[/caption] 处理后的图像: [caption id="attachment_38" align="aligncenter" width="500" caption="dstImage"]dstImage[/caption]    
posted @ 2011-09-10 11:54  zyqhi  阅读(465)  评论(0编辑  收藏  举报