opencv学习笔记(四)高斯滤波

来源:互联网 发布:ubuntu 安装 sublime 编辑:程序博客网 时间:2024/05/20 05:24

上代码:

#include "highgui.h"
#include "cv.h"


void example2_4( IplImage* image )
{
IplImage* out = cvCreateImage(cvGetSize(image),IPL_DEPTH_8U,3);
cvSmooth( image, out, CV_GAUSSIAN, 3, 3 );
cvShowImage( "Example4-out", out );
cvReleaseImage( &out );
cvWaitKey(0);
cvDestroyWindow( "Example4-in" );
cvDestroyWindow( "Example-out" );
}


int main(int argc, char ** argv)
{
IplImage* img=cvLoadImage("a.jpg");
cvNamedWindow("Example4",CV_WINDOW_AUTOSIZE);
cvShowImage("Example4",img);
example2_4(img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("Example4");
}

4.1 cvGetSize()

定义:

CvSize cvGetSize( const CvArr* arr )

作用:

cvGetSize()作用是得到二维的数组的尺寸,以CvSize结构返回。

cvGetSize()是专为矩阵和图像设计的,这两种对象的维数总是2。其尺寸可以以CvSize结构的形式返回,例如当创建一个新的大小相同的矩阵或图像时,使用此函数就很方便。

4.1.1 CvSize

OpenCV提供了多种基本数据类型。其中有一种是CvSize类型,它的数据成员是integer类型的widthheight

4.2 cvCreateImage()

定义:

IplImage* cvCreateImage( CvSize size, int depth, int channels );

作用:创建首地址并分配存储空间

怎么理解呢?

结合程序I think应该是这么回事。利用该函数开辟一个内存用来存储图片。在这个程序中,高斯变换后的图片怎么存储就要先利用该函数来定义——然后再执行变换。

  参数说明:

size 图像宽、高.

depth 图像元素的位深度,可以是下面的其中之一:

IPL_DEPTH_8U - 无符号8位整型

IPL_DEPTH_8S - 有符号8位整型

IPL_DEPTH_16U - 无符号16位整型

IPL_DEPTH_16S - 有符号16位整型

IPL_DEPTH_32S - 有符号32位整型

IPL_DEPTH_32F - 单精度浮点数

IPL_DEPTH_64F - 双精度浮点数

channels:

每个元素(像素)通道总数.可以是 1, 2, 3 或 4。

所以看了上面的解释,可以明白为什么定义成:

 IplImage* out = cvCreateImage(

                cvGetSize(image),

                IPL_DEPTH_8U,

                3

                );

4.2.1 cvCreateImageHeader()

cvCreateImage 与cvCreateImageHeader均是IplImage* 类型的图像头指针,这两个函数的区别是cvCreateImage 除了分配图像头之外,还分配图像数据,而cvCreateImageHeader仅仅是分配图像头,并没有分配图像数据。

4.3 cvSmooth()图像平滑

在图像处理中平滑应用得是很广泛的。在OpenCV中平滑定义为cvSmooth,原型如下:

 

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: 平滑方法

param1-4这四个参数的含义取决于smoothtype的值。

这里smoothtype有如下值:

(请注意,有些操作不支持in  place方式的输入。in place方式意味着输入图像与结果图像是同一个图像。)

——意味着什么呢?I think不支持in place意味着必须为结果图像创建一个内存空间,以保存结果图像。反之,不需要。

 

CV_BLUR——简单模糊   支持in place方式输入,Nc1,3输入数据类型 8u32f, 输出数据类型8u32f,对每个像素param1*param2邻域求和。并做缩放1/(param1*pararam2)

 

CV_BLUR_NO_SCALE——简单无缩放变换的模糊,不支持in placeNc 1,输入数据类型 8u输出数据类型 16s32f对每个像素的param1*param2邻域求和

 

CV_MEDIAN—中值模糊,不支持in placeNC1,3输入数据类型 8u,输出数据类型8u 对图像进行核大小为param1*param1的中值滤波

 

CV_GAUSSIAN——高斯模糊 支持 in place NC1,3输入数据类型 8u32f,输出数据类型8u32f对图像进行核大小为param1*param2的高斯卷积

 

CV_BILATERAL——双边滤波 不支持 in place NC1,3输入数据类型 8u, 输出数据类型8u应用双线性3*3滤波,颜色sigma=param1,空间sigma=param2


4.4中值滤波

中值滤波器将中心像素的正方形邻域内的每个像素值用中间像素值(不是平均像素值)替换,它可以用来处理单个通道、三个通道或者四个通道8位的图像,但是不支持in place

中值滤波的优点:

基于平均算法的simple blur对噪声图像特别是有大的孤立点(有时被称为“镜头噪声”)的图像非常敏感,即使有极少数量点存在较大差异也会导致平均值的明显波动,中值滤波可以通过选择中间值避免这些点的影响。因此中值滤波可以通过选择中间值避免这些点的影响。

4.5 高斯滤波(高斯模糊)

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替高斯噪声是各个频率分量上的能量不是相等的,服从高斯分布(即正态分布)的一类噪声。

具体详细解释参考这篇文章:

http://blog.csdn.net/jia20003/article/details/7038938

4.5.1 高斯滤波的缺陷

进行高斯滤波的通常原因是真实图像在空间内的像素是缓慢变化的,因此临近点的像素变化不会很明显。但是随机的两个点就可能形成很大的像素差(也就是说空间上的噪声点不是互相联系的)。正是基于这一点,高斯滤波在保留信号的条件下减少噪声,遗憾的是这种方法在接近边缘处就无效了,在那你不希望像素与邻近像素相关。因此高斯滤波会磨平边缘。

上面这句话怎么理解呢?有些图片会有边框。边框以及它临近的像素没有关系呀!所以差别会很大。高斯滤波就是对整幅图像进行加权平均的过程。那么,边框和临近的像素加权平均之后就会变化——相当于边框没有了——磨平。

4.5.2 双边滤波

而双边滤波能够提供一种不会将边缘的平滑掉的方法,但是需要更多的处理时间。双边滤波器能做到这些原因在于它不像普通的高斯/卷积低通滤波,只考虑了位置对中心像素的影响,它还考虑了卷积核中像素与中心像素之间相似程度的影响,根据位置影响与像素值之间的相似程度生成两个不同的权重表(WeightTable),在计算中心像素的时候加以考虑这两个权重,从而实现双边低通滤波。

详见

http://blog.csdn.net/jia20003/article/details/7740683


0 0
原创粉丝点击