1、图像腐蚀原理简单理解:
腐蚀是形态学最基本的操作,都是针对白色部分(高亮部分)而言的。即原图像中高亮部分被蚕食,得到比原图更小的区域。
2、图像腐蚀的作用:
(1)去掉毛刺,去掉孤立的像素,提取骨干信息。
(2)边缘检测,膨胀和腐蚀可以提取二值图像中的边缘信息,通过先膨胀在腐蚀可以是边缘更加明显;
(3)去除噪声,二值图像中可能存在一些噪声点,或者孤立的像素点,通过一定次数的腐蚀操作可以消除孤立的像素点,通过一定次数的膨胀操作可以填充小的噪声点;
(4)提取信息,通过膨胀和腐蚀操作可以提取文本区域;
3、腐蚀的过程
用一个结构元素的中心覆盖原图像(二值图像只有0和1)的每个像素,看结构元素覆盖的原图像部分,取原图像中被覆盖部分像素的最小值替换被结构元素中心覆盖的原图像像素值。下面演示腐蚀过程:
(1)先定义一个结构元素(核元素),通常是正方形或圆。以正方形为例,如下图。
定义一个原图像如下图(灰色区域像素值都为1,白色区域像素值都为0):
现在把核中心放在第一个像素,如下图:
由于第一行第二列和第二行第一列都被核元素覆盖,并且这两个位置原图像像素值都为0,那么把0替换核中心覆盖的位置,即把原图像第一行第一列像素值置为0。
继续把核中心放在第二个像素,如下图:
原图像第一行第一列和第一行第二列都被核元素覆盖,且像素值都是0,核中心在第一行第二列,那么把原图像该位置置为0
用上面方法在原图像第一行被腐蚀后变为如下图样:
第二行就以第二行第三列位置的像素为例,把核元素覆盖上去,如下图:
这时候可以看到原图像被核元素覆盖的部分,每个元素最小值都是1,核元素中心位置即第二行第三列像素值置为1
最后通过上面的方法腐蚀原图像最终的效果如下:
4、opencv接口使用
该函数用于生成常用的结构元素图像。
Mat cv::getStructuringElement(int shape,
Size ksize,
Point anchor = Point(-1,-1)
)
shape:结构元素的种类,如下图
ksize:结构元素的尺寸大小,一般情况下,结构元素的种类相同时,结构元素的尺寸越大腐蚀效果越明显。
anchor:中心点的位置,默认参数为结构元素的几何中心点。
该函数用于生成腐蚀后的图像。
void cv::erode(InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
)
src:输入的待腐蚀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
dst:腐蚀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
kernel:用于腐蚀操作的结构元素,可以自己定义,也可以用getStructuringElement()函数生成。
anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点
iterations:腐蚀的次数,默认值为1。腐蚀次数越多效果越明显。
borderType:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
borderValue:使用边界不变外推法时的边界值。
最后两个参数对图像中主要部分的腐蚀操作没有影响,因此在多数情况下使用默认值即可。
需要注意的是该函数的腐蚀过程只针对图像中的非0像素,如果图像注意以0像素为背景(背景基本黑色),那么腐蚀操作后会看到图像中的内容变得更瘦更小;如果图像是以255像素为背景(背景基本白色),那么腐蚀操作后会看到图像中的内容变得更粗更大。
案例使用:
int main( )
{
//载入原图
Mat srcImage = imread("1.jpg");
//显示原图
imshow("【原图】腐蚀操作", srcImage);
//进行腐蚀操作
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat dstImage;
erode(srcImage, dstImage, element);
//显示效果图
imshow("【效果图】腐蚀操作", dstImage);
waitKey(0);
return 0;
}
效果如下:
原图像:
腐蚀后的图像: