腐蚀和膨胀

Posted 小龙呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了腐蚀和膨胀相关的知识,希望对你有一定的参考价值。

腐蚀:

定义:
A ⊖ B = z ∣ ( B ) z ⊆ A A\\ominus B=\\left \\z|(B)_z\\subseteq A\\right\\ AB=z(B)zA
A ⊖ B = z ∣ ( B ) z ∩ A c = ∅ A\\ominus B=\\left \\z|(B)_z\\cap A^c=\\emptyset \\right\\ AB=z(B)zAc=
作用:
消除边界点,使边界向内收缩,用来消除小且无意义的物体。

腐蚀实现过程:
I.用结构元素B的锚点,扫描原始图像A的每一个像素点;
II.用结构元素与其覆盖的二值图像做“与”操作;
III.如果都为1,则结果图像的该像素值为1,否则为0。

结果:
使用结构元素B,沿着原始图像A边缘遍历一圈。以B的中心缩小原始图像A的区域。

膨胀:

定义:
A ⊕ B = z ∣ ( B ^ ) z ∩ A c ≠ ∅ A\\oplus B=\\left \\z|(\\hatB )_z\\cap A^c\\ne\\emptyset \\right\\ AB=z(B^)zAc=
A ⊕ B = z ∣ [ ( B ^ ) z ∩ A ] ⊆ A A\\oplus B=\\left \\z|[(\\hatB)_z\\cap A]\\subseteq A \\right\\ AB=z[(B^)zA]A

作用:
加长或变粗二值图像中的对象。

膨胀实现过程:
I.用结构元素B的锚点,扫描原始图像A的每一个像素点;
II.用结构元素与其覆盖的二值图像做“与”操作;
III.如果结果都为0,则结果图像的该像素值为0,否则为1。

结果:
使用结构元素B,沿着原始图像A边缘遍历一圈。以B的中心扩大原始图像A的区域。

程序实现及结果

算法思想:
       我们先对一张近似黑白图像做二值化处理,0代表黑(文字区域),255代表白(背景区域)。
       根据上面的定义和理解,我们直接省略掉结构元素,先对图像进行边界扩充,然后我们每次取图像的一个3×3区域做处理,如果这区域的所有像素值都是0,那么我们就让其中心元素为0;如果这区域的所有元素不全为0,那么我们就让其中心元素为255。
程序设计:

import cv2
import matplotlib.pyplot as plt

# 读取图像
img1 = cv2.imread("Text.png", 0)

# 二值化处理(0:黑;255:白)
for i in range(364):
    for j in range(1108):
        if img1[i, j] == 255:
            img1[i, j] = 255
        else:
            img1[i, j] = 0

img2 = img1.copy()
img3 = img1.copy()
img4 = cv2.copyMakeBorder(img1, 1, 1, 1, 1, cv2.BORDER_REFLECT) # 上下左右各扩充1,复制最近像素

# 腐蚀
for i in range(1,365):
    for j in range(1,1109):
        if img4[i, j]==0 and img4[i - 1, j - 1]==0 and img4[i - 1, j]==0 and img4[i - 1, j + 1]==0 and img4[i, j - 1]==0 and img4[i, j + 1]==0 and img4[i + 1, j - 1]==0 and img4[i + 1, j]==0 and img4[i + 1, j + 1]==0:
            img2[i-1,j-1] = 0
        else:
            img2[i-1,j-1] = 255

# 膨胀
for i in range(1,365):
    for j in range(1,1109):
        if img4[i, j]==0 or img4[i - 1, j - 1]==0 or img4[i - 1, j]==0 or img4[i - 1, j + 1]==0 or img4[i, j - 1]==0 or img4[i, j + 1]==0 or img4[i + 1, j - 1]==0 or img4[i + 1, j]==0 or img4[i + 1, j + 1]==0:
            img3[i-1,j-1] = 0
        else:
            img3[i-1,j-1] = 255

# 显示图像
plt.figure(figsize=(10,4),dpi=120)
plt.subplot(131),plt.imshow(img1, cmap = 'gray')
plt.title('original'),plt.axis('off')
plt.subplot(132),plt.imshow(img2, cmap = 'gray')
plt.title('erode'), plt.axis('off')
plt.subplot(133),plt.imshow(img3, cmap = 'gray')
plt.title('dilate'), plt.axis('off')
plt.show()

运行结果:

本文代码已开源,欢迎大家进行二次开发:
https://gitee.com/xiaolong_ROS/Graphics-Processing-and-Machine-Vision

如有错误或者不足之处,欢迎大家留言指正!

以上是关于腐蚀和膨胀的主要内容,如果未能解决你的问题,请参考以下文章

图像开运算和闭运算

OpenCV2:大学篇 形态学技术-腐蚀与膨胀操作

数字图像处理图像开运算与闭运算

Python+OpenCV图像处理之腐蚀与膨胀

详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作

Python+OpenCV图像处理之开闭操作