图像的形态处理学

一、形态学的基本概念

基本思想:用一定形态的结构元素去度量和提取图像中的对应形状,从而达到分析和识别的目的。

适用范围:图像的分割、特征抽取、边界检测

作用:这门学科在计算机文字识别,计算机显微图像分析,医学图像处理,工业检测等方面都取得了非常成功的应用。形态学方法已成为图像应用领域工程技术人员的必备工具。目前,有关数学形态学的技术和应用正在不断地研究和发展。

主要的数学基础:集合论

结构元素:形态学变换中的基本元素,是为了探测图像的某种结构信息而设计的特定形状和尺寸的图像,称为收集图像的结构信息的探针

结构元素类型:圆形、方型、线形、可以携带多汁知识进行探测。

利用上述结构元素在图像中逐点移动,看看这个像素满不满足某个结构的要求

结构元素本身就是图像

二、形态学算子

形态学运算:二值腐蚀、膨胀、二值开闭运算、骨架抽取、击中击不中变换等

形态学四个基本算子:膨胀、腐蚀、开启、闭合

腐蚀运算

什么是腐蚀运算呢?
概念:有一结构元素B和一副图像X,现在讲结构元素B逐点遍历,如果该点和其邻域与结构元素B全等,则保留该店,否则舍弃该点。

腐蚀运算有什么作用呢?

  • 可以消除物体边界点,使边界向内部收缩。
  • 可以把小于结构元素的物体去掉,选取不同大小的结构元素,去除不同大小 的物理。

水平方向的腐蚀
其结构元素形式如下
在这里插入图片描述
垂直方向的腐蚀
其结构元素如下
在这里插入图片描述
全方向腐蚀
图像的形态处理学_第1张图片

代码实现
    # 图像的腐蚀
    def imageErosion(self,v,count=1):
        for i in range(0,count):
            self.__imageErosion__(v)
    def __imageErosion__(self,v): #参数v为结构元素
        width = len(v) #首先判断结构元素的大小
        v_w=int(width/2) #得到中心点到边界的大小
        img_buf=np.copy(self.Img) #开辟一个图像缓存区
        # 可以使用模板的区域进行遍历
        for y in range(v_w,self.f_height-v_w):
            for x in range(v_w,self.f_width-v_w):
                v_values=self.Img[y-v_w:y+v_w+1,x-v_w:x+v_w+1,0] # 得到所有像素元的值
                if self.Img[y,x,0]==255:
                    continue
                # 然后比较该像素点是否符合结构元素的特点
                flag=False
                for y_i in range(0,len(v_values)):
                    for x_i in range(0,len(v_values[y_i])):
                        v1=v[y_i][x_i]
                        p1=v_values[y_i][x_i]
                        if v1==0:
                            continue
                        elif v1==1 and p1==255:
                            flag=True
                            break
                    if flag:
                        break
                if flag==True:
                    img_buf[y,x,:]=255
        self.Img=img_buf

原图如下
图像的形态处理学_第2张图片
效果图如下(水平腐蚀2次)
图像的形态处理学_第3张图片

膨胀运算

什么是膨胀运算呢?
与腐蚀相反

注意:膨胀运算的结构元素与腐蚀运算的结构元素是一一对应的,可以通用

对二值化物体边界点扩充,将与物体接触的所有背景点合并到该物体中,使边界向外部扩展。
如果两个物体之间的距离比较近,可能会把两个物体连通到一起。
对填补图像分割后的物体空洞有作用。

注意腐蚀和膨胀并不互为逆运算,但是可以级连结合使用
图像的形态处理学_第4张图片
简单点说,腐蚀作用要求图像上的某点元素的领域完全与结构元素相同才保留,而膨胀作用只要求某点元素的领域与结构元素有相交部分就保留,这里所指的保留是如果该点位背景点,则将其改变为物体点,如果是物体点,则还是不变。
图像的形态处理学_第5张图片

图像的形态处理学_第6张图片

代码实现
    # 图像膨胀
    def imageDilation(self,v,count=1):
        for i in range(0,count):
            self.__imageDilation__(v)
    def __imageDilation__(self,v):
        width = len(v) #首先判断结构元素的大小
        v_w=int(width/2) #得到中心点到边界的大小
        img_buf=np.copy(self.Img) #开辟一个图像缓存区
        # 可以使用模板的区域进行遍历
        for y in range(v_w,self.f_height-v_w):
            for x in range(v_w,self.f_width-v_w):
                v_values=self.Img[y-v_w:y+v_w+1,x-v_w:x+v_w+1,0] # 得到所有像素元的值
                flag = False # 设置标记为FALSE
                '下面对抽取的像素进行遍历'
                for y_i in range(0,len(v_values)):
                    for x_i in range(0,len(v_values[y_i])):
                        v1=v[y_i][x_i] # 结构元素中的值
                        p1=v_values[y_i][x_i] # 抽取出来的像素里的值
                        if v1==0: #如果结构元素中的值为0,则说明这个地方为NULL。直接忽略
                            continue
                        elif (v1==1 and p1==0): #否则的话,判断结构元素中的点是否为物体,如果是,则满住膨胀条件
                            flag=True
                            break
                    if flag== True:
                        img_buf[y, x, :] = 0
                        break

        self.Img=img_buf

原图如下
图像的形态处理学_第7张图片
膨胀之后的图像(全方向腐蚀,5*5的结构元素大小)
图像的形态处理学_第8张图片

三、图像的开启与闭合

基本概念
有膨胀和腐蚀两个运算的复合与集合操作组成的所有运算构成。

开运算:先对图像进行腐蚀运算,然后再对图像进行膨胀运算(使用同一结构元素)

闭运算:先对图像进行膨胀运算,然后再对图像进行腐蚀运算(使用同一结构元素)

作用
开运算:能够去除孤立的小点,毛刺和小桥(连通两片区域的小点),消除小物体,平滑较大物体的边界。同时并不明显改变其面积。但是开运算后的图像与原图像不等

闭运算:先膨胀、后腐蚀,其功能是用来填充物体内细小的空洞,弥合小裂缝,同时并不明显改变其面积。但是闭运算后的图像与原图像不等

你可能感兴趣的:(图像处理算法与模式识别,计算机视觉,算法,opencv)