【数字图像处理】二值化图像腐蚀运算与膨胀运算

 

形态学基本概念

基本思想:用一定形态的结构元素去度量和提取图像中的对应形状,达到分析知识的目的。可用于图像处理的各个方面,包括图像分割、边界检测、特征提取。

结构元素:形态学变换中的基本元素,使为了探测图像的某种结构信息而设计的特定形状和尺寸的图像,称为收集图像结构信息的探针。
结构元素有多种类型:如圆形、方形、线型等,可携带知识(形态、大小、灰度和色度信息)来探测、研究图像的结构特点。

形态学运算包括:二值化腐蚀和膨胀、二值化开闭运算、骨架抽取、击中击不中变换等。
形态学四个基本算子:膨胀,腐蚀、开启和闭合组成,这些基本运算还可以推导和组合成各种数学形态学实用算法。

 

腐蚀运算

腐蚀运算思路:定义结构元素(与模板类似),结构元素在整幅图像中移动,移动到每个像素点上,只有结构元素与图像上对应像素点的像素值全部相等时,保留这个像素点的值。
腐蚀运算作用:消除物体边界点,使边界点向内部收缩,可以把小于结构元素的物体去除。选取不同大小的结构元素,去除不同大小的物体。如两个物体间有细小的连通,通过腐蚀可以将两个物体分开。

腐蚀运算

 

 

 

 腐蚀运算示意图

基本方法:

通常拖到结构元素在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;
                                    }

                                }
                            }

 

posted @ 2019-09-16 00:33  -零  阅读(16206)  评论(0编辑  收藏  举报