练习题目
己知一幅二值目标图像A和结构元素B如下图所示,其中结构元素B的原点由小三角形标识。请分别写出结构元素B对值图像A进行腐蚀运算与膨账运算的结果。
腐蚀操作(计算)
定义
腐蚀操作是形态学图像处理中的基本操作之一。它通过一个结构元(也称为卷积核)对图像进行扫描,根据结构元的形状和大小,将图像中的某些区域进行缩小或“腐蚀”。具体来说,只有当结构元完全覆盖在图像的某个部分时,该位置才会被保留,否则会被设置为背景(通常是黑色)。
腐蚀操作流程图
知识点
结构体的标识点:它是赋值的位置点。
移动过程:结构体中含有1的的区域在目标图像的左上角一格一格的移动。
腐蚀操作:腐蚀就是目标图像中的元素包含结构体,除标识位为1,其余为0。
计算步骤
目标图像A
腐蚀后的图像
结构元素B
|
膨胀操作(计算)
膨胀定义
膨胀操作是形态学图像处理中的基本操作之一。它通过一个结构元(也称为卷积核)对图像进行扫描,根据结构元的形状和大小,将图像中的某些区域进行扩展或“膨胀”。具体来说,只要结构元覆盖的区域中有一个像素为前景(通常是白色),该位置就会被设置为前景。
膨胀流程图
知识点
结构体:膨胀操作的结构体的变化(反射结构元素),及对角线对称变化。
移动:移动到最后一个格子停下。
计算步骤
目标图像A
膨胀后的图像
结构元素B
|
进阶练习
己知一幅二值目标图像A和结构元素B如下图所示,其中结构元素B的原点由小三角形标识。请分别写出结构元素B对值图像A进行腐蚀运算与膨账运算的结果。
目标图像A
| 结构元素B
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
腐蚀后的图像
结构元素B
| 膨胀后的图像
结构元素B
|
腐蚀与膨胀操作(代码)
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def __imshow(pos_array, img, title_name='', immediate=False):
plt.subplot(pos_array[0], pos_array[1], pos_array[2])
plt.axis('off')
plt.imshow(img, cmap='gray') # include: cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.title(title_name)
if immediate:
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.tight_layout()
plt.show()
def __simple_task():
# step1, load an image
custom_target_img = np.zeros((6, 6), dtype=np.uint8)
custom_target_img[0, 3] = 1
custom_target_img[1, 1] = 1
custom_target_img[1, 4] = 1
custom_target_img[2, 1] = 1
custom_target_img[2, 2] = 1
custom_target_img[3, 2] = 1
custom_target_img[3, 3] = 1
custom_target_img[4, 2] = 1
custom_target_img[4, 3] = 1
# step, set kernel
kernel = np.ones((1, 2), np.uint8)
print(f'kernel={kernel}')
# step2,erode and dilate
erosion_result = cv.erode(custom_target_img, kernel, anchor=(0, 0))
dilate_result = cv.dilate(custom_target_img, kernel, anchor=(1, 0))
# step3, erode and dilate
erosion_result2 = cv.erode(custom_target_img, kernel, anchor=(1, 0))
dilate_result2 = cv.dilate(custom_target_img, kernel, anchor=(0, 0))
# step4, display
__imshow([3, 2, 1], custom_target_img, '目标图像')
__imshow([3, 2, 3], erosion_result, '原点(0,0),腐蚀')
__imshow([3, 2, 4], dilate_result,'原点(0,0),膨胀')
__imshow([3, 2, 5], erosion_result2, '原点(1,0),腐蚀')
__imshow([3, 2, 6], dilate_result2,'原点(1,0),膨胀', immediate=True)
def __erode():
# step1
img = cv.imread('images/little_circle.png', cv.IMREAD_GRAYSCALE)
# step2
ksize = (5, 5)
kernel = cv.getStructuringElement(cv.MORPH_RECT, ksize)
erosion_result = cv.erode(img, kernel)
kernel2 = cv.getStructuringElement(cv.MORPH_CROSS, ksize)
erosion_result2 = cv.erode(img, kernel2)
kernel3 = cv.getStructuringElement(cv.MORPH_ELLIPSE, ksize)
erosion_result3 = cv.erode(img, kernel3)
# step3
__imshow([2, 2, 1], img, '目标图像')
__imshow([2, 3, 4], erosion_result,'5*5矩形,腐蚀')
__imshow([2, 3, 5], erosion_result2,'5*5十字形,腐蚀')
__imshow([2, 3, 6], erosion_result3,'5*5椭圆,腐蚀', immediate=True)
def __dilate():
# step1
img = cv.imread('images/small_squares.tif', cv.IMREAD_GRAYSCALE)
# step2
kernel = np.ones((3, 3), np.uint8)
dilation_result = cv.dilate(img, kernel)
kernel2 = np.ones((7, 7), np.uint8)
dilation_result2 = cv.dilate(img, kernel2)
# step3
__imshow([2, 2, 1], img, '目标图像')
__imshow([2, 2, 3], dilation_result,'3*3矩形,膨胀')
__imshow([2, 2, 4], dilation_result2,'7*7矩形,膨胀', immediate=True)
def __opening_closing_operation():
# step1
raw_img = cv.imread('images/fingerprint.png', cv.IMREAD_GRAYSCALE)
ret, img = cv.threshold(raw_img, 127, 255, cv.THRESH_BINARY)
# step2
ksize = (5, 5)
c_kernel = np.ones(ksize, np.uint8)
rect_kernel = cv.getStructuringElement(cv.MORPH_RECT, ksize)
# step3
erosion = cv.erode(img, c_kernel, iterations=1)
custom_opening_result = cv.dilate(erosion, c_kernel, iterations=1)
opening_result = cv.morphologyEx(img, cv.MORPH_OPEN, rect_kernel)
# step4
dilation = cv.dilate(img, c_kernel, iterations=1)
custom_closing_result = cv.erode(dilation, c_kernel, iterations=1)
closing_result = cv.morphologyEx(img, cv.MORPH_CLOSE, rect_kernel, iterations=1)
# step5
__imshow([3, 2, 1], img, '目标图像')
__imshow([3, 2, 3], custom_opening_result, '先腐蚀后膨胀')
__imshow([3, 2, 4], opening_result,'开运算')
__imshow([3, 2, 5], custom_closing_result, '先膨胀后腐蚀')
__imshow([3, 2, 6], closing_result,'闭运算', immediate=True)
if __name__ == '__main__':
__simple_task()
__erode()
__dilate()
__opening_closing_operation()
pass
运行结果
简单二值目标图像处理结果
二值化图像进行腐蚀操作处理结果
二值化图像进行膨胀操作处理结果
开运算和闭运算处理结果
补充
- 二值化是以0或1的形式表示
- 腐蚀与膨胀操作中的“计算步骤”中的“0”的意图为撑起格子和显示腐蚀情况。