形态学基本概念
基本思想:用一定形态的结构元素去度量和提取图像中的对应形状,达到分析知识的目的。可用于图像处理的各个方面,包括图像分割、边界检测、特征提取。
结构元素:形态学变换中的基本元素,使为了探测图像的某种结构信息而设计的特定形状和尺寸的图像,称为收集图像结构信息的探针。
结构元素有多种类型:如圆形、方形、线型等,可携带知识(形态、大小、灰度和色度信息)来探测、研究图像的结构特点。
形态学运算包括:二值化腐蚀和膨胀、二值化开闭运算、骨架抽取、击中击不中变换等。
形态学四个基本算子:膨胀,腐蚀、开启和闭合组成,这些基本运算还可以推导和组合成各种数学形态学实用算法。
腐蚀运算
腐蚀运算思路:定义结构元素(与模板类似),结构元素在整幅图像中移动,移动到每个像素点上,只有结构元素与图像上对应像素点的像素值全部相等时,保留这个像素点的值。
腐蚀运算作用:消除物体边界点,使边界点向内部收缩,可以把小于结构元素的物体去除。选取不同大小的结构元素,去除不同大小的物体。如两个物体间有细小的连通,通过腐蚀可以将两个物体分开。
腐蚀运算:
腐蚀运算示意图:
基本方法:
通常拖到结构元素在X域移动,在每一个位置上,当结构元素B在中心平移到X图像上的某优点(x,y)。
如果结构元素内的每一个像素都与以(x,y)为中心的相同邻域中对应像素完全相同,那么就保留(x,y)像素点。
对于不满足条件的像素点则全部删除,达到边界向内收缩效果。
腐蚀运算c语言实现
- 水平腐蚀:不处理左右两边
- 垂直腐蚀:不处理上下两行
- 全方位腐蚀:不处理四周
int Image[120][180]; memset(Image, 0, sizeof(Image)); //全方位腐蚀运算 for (int i = 1; i < Use_ROWS-1; i++) { for (int j = 1; j < Use_Line - 1; j++) { if (Image_Use[i][j] == 255 && Image_Use[i][j + 1] == 255 && Image_Use[i][j - 1] == 255) { Image[i][j] = 255; } } }
膨胀运算
膨胀运算思路:定义结构元素(与模板类似),结构元素在整幅图像中移动,移动到每个像素点上,如果结构元素与图像上对应像素点的像素值至少有一个像素相等时,保留这个像素点的值。
膨胀运算作用:与腐蚀相反,对二值化物体边界点扩充,将与物体接触的所以背景点合并到该物体中,使边界向外扩张。如果两个物体之间的距离比较近,会把两个物体连通到一起,对填补图像分割后物体的空洞有用。
膨胀与腐蚀比较:
- 膨胀:填充图像中的小孔(比结构元素小的孔洞)及图像边缘处的小凹陷部分。
- 腐蚀:消除图像边缘小的成分,并将图像缩小,从而使其补集扩大。
- 膨胀和腐蚀:并不互为逆运算,可以级联结合使用。
膨胀运算:
膨胀运算示意图:
膨胀运算c语言实现
- 水平膨胀:不处理左右两边
- 垂直膨胀:不处理上下两行
- 全方位膨胀:不处理四周
int Image[120][180]; memset(Image, 0, sizeof(Image)); //全方位膨胀运算 for (int i = 1; i < Use_ROWS-1; i++) { for (int j = 1; j < Use_Line - 1; j++) { if (Image_Use[i][j] == 255 || Image_Use[i][j + 1] == 255 || Image_Use[i][j - 1] == 255) { Image[i][j] = 255; } } }