图像滤波

各种方法的图像平滑 
void   cvSmooth
const CvArr*      src
CvArr*                dst,
int                      smoothtype=CV_GAUSSIAN,
int                      param1=3
int                      param2=0
double               param3=0
double               param4=0                );
src 
输入图像. 
dst 
输出图像. 
smoothtype 
平滑方法: 
CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。 
CV_BLUR (simple blur) - 对每个象素param1×param2邻域 求和并做尺度变换 1/(param1?param2). 
CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 
CV_MEDIAN (median blur) - 对图像进行核大小为param1×param1 的中值滤波 (i.e. 邻域是方的). 
CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 关于双向滤波,可参考 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html 
CV_BLUR_NO_SCALE   简单无缩放模糊    8UC1(in)16S32FC1(out) none
CV_BLUR                      简单模糊               8U32FC1C3                  in-place
CV_GAUSSIAN              高斯滤波              8U32FC1C3                  none
CV_MEDIAN                中值滤波              8UC1C3                        none
CV_BILATERAL             双向滤波              8UC1C3                         none
param1 
平滑操作的第一个参数. 
param2 
平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值 为零,则表示其被设定为param1。 
param3 
对应高斯参数的 Gaussian sigma ( 标准差). 如果为 ,则标准差由下面的核尺寸计算: 
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1  对应水平核,
n=param2 对应垂直核.
对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有 sigma 计算 (以保证足够精确的操作). 

函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。 

没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。 

简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮点图像。这两种方法可以(in-place)方式处理图像。 

中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像. 

#include "cv.h"
#include "highgui.h"
#include <stdlib.h>
#include <stdio.h>


int main(int argc, char **argv)
{
	// load source image
	// 1. color image
	IplImage *src_clr_img = cvLoadImage("lena.bmp", 1);
	if (NULL == src_clr_img)
	{
		perror("Lena.jpg");
		exit(1);
	}
	// 2. gray image
	IplImage *src_gray_img = cvCreateImage(cvGetSize(src_clr_img), IPL_DEPTH_8U, 1);
	cvCvtColor(src_clr_img, src_gray_img, CV_BGR2GRAY);
	// set destination image
	// 1.简单无缩放模糊
	// 支持输入8U1C;输出16S1C,32F1C
	IplImage *des_img_blur_noscale = cvCreateImage(cvGetSize(src_clr_img),
									IPL_DEPTH_16S, 1);
	// translate
	cvSmooth(src_gray_img, des_img_blur_noscale, CV_BLUR_NO_SCALE, 3, 3, 0.0, 0.0);
	// 2.简单模糊
	// 支持输入输出8U32F1C3C
	IplImage *des_img_blur = cvCreateImage(cvGetSize(src_clr_img), IPL_DEPTH_8U, 3);
	// translate
	cvSmooth(src_clr_img, des_img_blur, CV_BLUR, 3, 3, 0.0, 0.0);

	//3.高斯模糊
	// 支持输入输出8U32F1C3C
	IplImage *des_img_gauss = cvCreateImage(cvGetSize(src_clr_img), IPL_DEPTH_8U, 3);
	// translate
	cvSmooth(src_clr_img, des_img_gauss, CV_GAUSSIAN, 3, 3, 0.0, 0.0);

	// 4.中值滤波
	// 支持输入输出8UC1C3
	IplImage *des_img_median = cvCreateImage(cvGetSize(src_clr_img), IPL_DEPTH_8U, 3);
	// translate
	cvSmooth(src_clr_img, des_img_median, CV_MEDIAN, 3, 3, 0.0, 0.0);

	// 5.双边滤波
	// 支持输入输出8UC1C3
	IplImage *des_img_bilateral = cvCreateImage(cvSize(src_clr_img->width, src_clr_img->height),
		IPL_DEPTH_8U, 3);
	cvSmooth(src_clr_img, des_img_bilateral, CV_BILATERAL, 3, 3, 0.0, 0.0);

	// create window
	cvNamedWindow("src_clr", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("src_gray", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("des_gray_blur_noscale", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("des_clr_blur", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("des_clr_gauss", CV_WINDOW_AUTOSIZE);
	cvNamedWindow("des_clr_median", 1);
	cvNamedWindow("des_clr_bilateral", 1);
	// show image
	cvShowImage("src_clr", src_clr_img);
	cvShowImage("src_gray", src_gray_img);
	cvShowImage("des_gray_blur_noscale", des_img_blur_noscale);
	cvShowImage("des_clr_blur", des_img_blur);
	cvShowImage("des_clr_gauss", des_img_gauss);
	cvShowImage("des_clr_median", des_img_median);
	cvShowImage("des_clr_bilateral", des_img_bilateral);
	cvWaitKey(0);
	// release and destroy
	cvReleaseImage(&src_clr_img);
	cvReleaseImage(&src_gray_img);
	cvReleaseImage(&des_img_blur_noscale);
	cvReleaseImage(&des_img_blur);
	cvReleaseImage(&des_img_gauss);
	cvReleaseImage(&des_img_median);
	cvReleaseImage(&des_img_median);
	cvReleaseImage(&des_img_bilateral);
	cvDestroyAllWindows();

	return 0;
}















 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值