《学习OpenCV》 第五章
书看到这里,更有一种感觉,就是此书作为入门手册,有一定的难度。难点不在此书如《C++ Primer》中文译本中充满歧义的佶屈聱牙的语句,而在各种术语(图像处理,信号处理以及数学)方面的提前使用。因此本章书中提及的“阈值化”、“卷积”(抱歉,数学上卷积可能有听到,但是图形学上的卷积只能抱歉了)等总会让新手感觉难以体会书中描述文字的“感觉”。好在在本章的最后提及了“阈值化”,在下一张的开始部分,也有“卷积”的一部分涉及。因此此书更应当“熟读百遍”。
我们在这里提及一下阈(yu,四声)值化的概念。其实,根据阈值化的读音和字面意思,大致也能猜出这个词的意思。当我读到“阈值化”这三个字刚出现时,百度过几篇博客,上面提及的概念和一个重要的图总算在本章最后出现了。
阈值化:剔除一些低于或高于一定值的像素。这是书中对于这个的概念。首先,我们应当想到电信号转换时的数模转换与之具有强烈相关性。
书中给了这个图,我们可以看出来最上面的是将要被阈值化的值和阈值,其中阈值是虚线位置。2图是二值阈值化,即类似二进制的阈值化,和数模转换很相似。高平的值化为高值,低平为低值。3图是二图的逆置;4图为截断阈值化,即超出阈值部分截成阈值大小,其余部分保持不变;5图为超过阈值部分置低值,6图与5图相反。
我们先说一下平滑处理,“平滑处理”也叫“模糊处理”,用来减少图像上的噪声或者失真。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自不用说,param1-4这四个参数的含义取决于smoothtype的值。
这里smoothtype有如下值:
CV_BLUR 简单模糊 支持in place方式输入,Nc1,3 输入数据类型 8u,32f, 输出数据类型 8u,32f,对每个像素param1*param2邻域求和。并做缩放1/(param1*pararam2)
CV_BLUR_NO_SCALE 简单无缩放变换的模糊,不支持in place,Nc 1, 输入数据类型 8u 输出数据类型 16s或32f 对每个像素的param1*param2 邻域求和
CV_MEDIAN 中值模糊,不支持in place,NC1,3 输入数据类型 8u,输出数据类型 8u 对图像进行核大小为param1*param1的中值滤波
CV_GAUSSIAN 高斯模糊 支持 in place ,NC1,3 输入数据类型 8u,32f,输出数据类型8u或32f 对图像进行核大小为param1*param2的高斯卷积
CV_BILATERAL 双边滤波 不支持 in place ,NC1,3 输入数据类型 8u, 输出数据类型8u 应用双线性3*3滤波,颜色sigma=param1,空间sigma=param2
CV_BLUR 输出图像的每一个像素是窗口中输入图像对应像素的简单平均值。simple blur 支持1~4个图像通道。CV_BLUR_NO_SCALE与simple blur本质上是相同的,但并没有计算其平均值的操作。因此,输入图像和结果图像必须有不同的数值精度,才能保证模糊操作不会导致错误溢出。中值滤波器将中心像素的正方形邻域内的每个像素值用中间像素值(不是平均像素值)替换,它可以用来处理单个通道、三个通道或者四个通道8位的图像,但是不支持in place。高斯滤波不是最快的,但是是最有用的。高斯滤波用卷积核与输入图像的每个点进行卷积,将最终计算结果之和作为输出图像的像素值。
此处提及“卷积”,定义是。
- 首先将两个函数都用
来表示。
- 对其中一个函数做水平翻转:
→
- 加上一个时间偏移量,让
能沿着
轴滑动。
- 让t从-∞滑动到+∞。两函数交会时,计算交会范围中两函数乘积的积分值。换句话说,我们是在计算一个滑动的的加权平均值(这里没有涉及到平均这个操作,2015年6月3日笔者注,后面涉及到平均的,也不成立)。也就是使用
当做加权函数,来对
取加权平均值。
- 最后得到的波形(未包含在此图中)就是f和g的卷积。
- (笔者注:http://blog.csdn.net/lanbing510/article/details/7425952这篇文章写的不错,对于一维卷积和二维卷积都有一定的解说。致谢!!!)
- 这里的卷积属于一元定义,下面的是二元定义,也就是可以用于矩阵运算方面的。
在我们看来,上面的图片的含义在积分观点上等价于。
上述属于卷积的定义。我们再回到函数中,在高斯模糊中,前两个参数代表滤波器窗口的宽度和高度,可选择的第三个参数代表高斯卷积核的sigma值(是最大宽度的四分之一)。如果第三个参数未指定,系统会根据窗口尺寸通过下面的方程来自动确定高斯核的各个参数。
σx=(nx/2-1)*0.30+0.80,nx=param1
σy=(ny/2-1)*0.30+0.80,ny=param2
如果用户希望高斯核不对称,那么可以引入第四个参数。这样,第三个和第四个参数分别为水平方向和垂直方向的sigma值。
如果第三个和第四个参数已经给出,但是前两个参数被设为0,那么窗口的尺寸会根据sigma值自动确定。
双边滤波是“边缘保留滤波”的图像分析方法中的一种,将它与高斯平滑对比后会更容易理解。进行高斯滤波的通常原因是真实图像在空间内的像素是缓慢变化的,因此临近点的像素变化不会很明显。但是随机的两个点就可能形成很大的像素差(也就是说空间上的噪声点不是互相联系的)。正是基于这一点,高斯滤波在保留信号的条件下减少噪声,遗憾的是这种方法在接近边缘处就无效了,在那你不希望像素与邻近像素相关。因此高斯滤波会磨平边缘。而双边滤波能够提供一种不会将边缘的平滑掉的方法,但是需要更多的处理时间。
双边滤波会依据每个像素及其邻域构造一个加权平均值,加权计算包括两个部分,其中的一部分加权方式与高斯平滑的相同,第二部分也属于高斯加权,但不是基于中心像素点与其他像素点的空间距离之上的加权,峰认识基于其他像素与中心像素的亮度差值的加权。可以将双边滤波视为高斯平滑,对于相似的像素赋予较高的权重,不相似的像素赋予较小的权重。这种滤波的典型效果就是使处理过的图像看上去像是一幅源图的水彩画。
双边滤波含有两个参数。第一个参数代表空域中所使用的高斯核的宽度,与高斯滤波的sigma参数类似。第二个参数代表颜色域内高斯核的宽度。第二个参数越大,表明待滤波的强度(或颜色)范围越大(因此不连续的程度越高,以便保留)。
———————————————————————————————————————————————————————————————————————————————
膨胀是指将一些图像(或图像中的一部分区域,称为A)与核(称为B)进行卷积。核可以是任何的的形状或大小,他拥有一个单独定义出来的参考点。多数情况下,核是一个小的中间带有参考点的实心正方形或圆盘。核可以视为模板或掩码,膨胀是求局部最大值的操作。核B与图像卷积,即计算核B覆盖的区域的像素点最大值,并把这个最大值复制给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长。
腐蚀是膨胀的反操作。腐蚀操作要计算核区域像素的最小值。腐蚀可以通过下面的算法生成一个新的图像:当核B与图像卷积时,计算被B覆盖区域的最小像素值,并把这个值放到参考点上。
erode(x,y)=