腐蚀和膨胀
Posted 小龙呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了腐蚀和膨胀相关的知识,希望对你有一定的参考价值。
腐蚀:
定义:
A
⊖
B
=
z
∣
(
B
)
z
⊆
A
A\\ominus B=\\left \\z|(B)_z\\subseteq A\\right\\
A⊖B=z∣(B)z⊆A
A
⊖
B
=
z
∣
(
B
)
z
∩
A
c
=
∅
A\\ominus B=\\left \\z|(B)_z\\cap A^c=\\emptyset \\right\\
A⊖B=z∣(B)z∩Ac=∅
作用:
消除边界点,使边界向内收缩,用来消除小且无意义的物体。
腐蚀实现过程:
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\\
A⊕B=z∣(B^)z∩Ac=∅
A
⊕
B
=
z
∣
[
(
B
^
)
z
∩
A
]
⊆
A
A\\oplus B=\\left \\z|[(\\hatB)_z\\cap A]\\subseteq A \\right\\
A⊕B=z∣[(B^)z∩A]⊆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
如有错误或者不足之处,欢迎大家留言指正!
以上是关于腐蚀和膨胀的主要内容,如果未能解决你的问题,请参考以下文章
详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作