二维图像滤波实现

引言

通过对opencv中cvFilter2D函数对图像做卷积运算实现二维图像滤波。本节主要介绍相关知识。

预备知识

函数cvFilter2D对图像做卷积运算

格式

/* Convolves the image with the kernel */
CVAPI(void) cvFilter2D( const CvArr* src, CvArr* dst, const CvMat* kernel,
                        CvPoint anchor CV_DEFAULT(cvPoint(-1,-1)));
参数

  • src : 输入图像
  • dst : 输出图像
  • kernel : 卷积核,单通道浮点矩阵。如果想将不同的核应用于不同的通道,则先用函数cvSplit将图像分解到单个色彩通道上,然后再单独处理。
  • anchor : 核的锚点,表示一个被滤波的点在核内的位置。锚点应处于核内部。默认置为(-1,-1)表示锚点在核中心。

说明

函数cvFilter2D对图像进行线性滤波,支持替换方式操作。当核运算部分超出输入图像时,边界外面的像素值等于离它最近的图像像素值

参考代码

IplImage * ImagePixel::ImageFiltering(IplImage* pImg ){
	if(!pImg){
		printf("ERROR: Load File in ImageFiltering(..).\n");
		exit(0);
	}
	IplImage *src = cvCreateImage(cvGetSize(pImg),pImg->depth,1);
	if(pImg->nChannels ==1)
		src = cvCloneImage(pImg);
	if(pImg->nChannels ==3)
		cvCvtColor(pImg,src,CV_BGR2GRAY);
    float k[9] = { 1.f/16, 2.f/16, 1.f/16,
                   2.f/16, 4.f/16, 2.f/16,
                   1.f/16, 2.f/16, 1.f/16};   // 这里高斯核滤波器归一化
    CvMat Km = cvMat( 3, 3, CV_32F, k );
	IplImage* dst = cvCloneImage( src );
    
	cvFilter2D( src, dst, &Km, cvPoint(-1,-1));
	return dst;
}

测试输出结果

二维图像滤波实现_第1张图片 二维图像滤波实现_第2张图片

(a) 原始图像                                      (b)二维图像的滤波效果


关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博和新浪微博songzi_tea.


你可能感兴趣的:(opencv,图像滤波)