目录
前言
图像形态学是一种用于处理和分析图像形状和结构的技术。
一、常用形态学操作
- 膨胀(Dilation):扩展前景区域,使对象变大。
- 腐蚀(Erosion):缩小前景区域,去除小的噪声点。
- 开运算(Opening):先腐蚀后膨胀,用于去除小物体。
- 闭运算(Closing):先膨胀后腐蚀,用于填充小孔洞。
- 顶帽(Top-hat):原图像与开运算结果的差异。用于提取图像中比背景亮的细节,通常用于突出小的亮区域。
- 黑帽(Black-hat):闭运算结果与原图像的差异。用于提取图像中比背景暗的细节,通常用于突出小的暗区域。
- 梯度运算:梯度运算实际上是膨胀操作减去腐蚀操作的结果。
二、腐蚀和膨胀
1.图像腐蚀
- 缩小前景区域,去除小的噪声点。
import numpy as np
import cv2
"""
图像腐蚀
dst = cv2.erode(src, kernel, dst,anchor,iterations,borderType,borderValue)
"""
sun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8) # 设置kernel大小
erosion_1 = cv2.erode(sun, kernel, iterations=5)
cv2.imshow('erode', erosion_1)
cv2.waitKey(0)
输出:
- 左边是原图,右边是腐蚀之后的
2.图形膨胀
- 扩展前景区域,使对象变大。
import numpy as np
import cv2
"""
图像膨胀
dst = cv2.dilate(img, kernel,iteration)
"""
text = cv2.imread('eng_text.png')
cv2.imshow('text', text)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)
text_new = cv2.dilate(text, kernel, iterations=3)
cv2.imshow('dilate', text_new)
cv2.waitKey(0)
输出:
- 左边是原图,右边是膨胀之后的图像
三、开运算和闭运算
1.开运算
- 先腐蚀后膨胀,用于去除小物体。
# 开运算 先腐蚀后膨胀
zw_noise = cv2.imread('zw_noise.png')
cv2.imshow('zw_noise', zw_noise)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)
zw_open = cv2.morphologyEx(zw_noise, cv2.MORPH_OPEN, kernel) # 先腐蚀 后膨胀
cv2.imshow('zw_open', zw_open)
cv2.waitKey(0)
输出:
- 左边是原图,右边是进行开运算之后的图片
2.闭运算
- 先膨胀后腐蚀,用于填充小孔洞。
zw = cv2.imread('zw.png')
cv2.imshow('zw', zw)
cv2.waitKey(0)
kernel = np.ones((5, 5), np.uint8)
zw_close = cv2.morphologyEx(zw, cv2.MORPH_CLOSE, kernel) # 先腐蚀 后膨胀
cv2.imshow('zw_close', zw_close)
cv2.waitKey(0)
输出:
- 左边是原图,右边是经过闭运算之后的图
- 可以看出来指纹有些断开的地方连接起来了
四、顶帽和黑帽
1.顶帽
- 原图像与开运算结果的差异。用于提取图像中比背景亮的细节,通常用于突出小的亮区域。
sun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)
# 开运算
open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
cv2.imshow('open_sun', open_sun)
cv2.waitKey(0)
# 顶帽
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
- 左边原图,中间开运算,右边顶帽运算
- 顶帽之后有种凹陷的感觉
2.黑帽
- 闭运算结果与原图像的差异。用于提取图像中比背景暗的细节,通常用于突出小的暗区域。
sun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)
cv2.imshow('sun', sun)
cv2.waitKey(0)
# 闭运算
close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
cv2.imshow('close_sun', close_sun)
cv2.waitKey(0)
# 黑帽
blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat)
cv2.waitKey(0)
输出:
- 左边原图,中间闭运算,右边黑帽之后的图片
五、梯度运算
- 用于提取图像的边缘,计算图像的变化率。
"""
梯度运算: 膨胀-腐蚀
"""
text = cv2.imread('eng_text.png')
# cv2.imshow('text', text)
# cv2.waitKey(0)
kernel = np.ones((2, 2), np.uint8)
# 膨胀
pz_text = cv2.dilate(text, kernel, iterations=2)
cv2.imshow('pz_text', pz_text)
cv2.waitKey(0)
# 腐蚀
fs_text = cv2.erode(text, kernel, iterations=2)
cv2.imshow('fs_text', fs_text)
cv2.waitKey(0)
# 膨胀-腐蚀
text_new = cv2.morphologyEx(text, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('text_new', text_new)
cv2.waitKey(0)
输出:
- 左边是膨胀的图片,中间是腐蚀的图片,右边是梯度运算之后的图片
- 有一种镂空的感觉
总结
这些处理方法主要用于图像的边缘检测和特征增强。通过膨胀,图像的前景区域会被扩展,填补细小的空洞;通过腐蚀,前景区域会被缩小,去除噪声。梯度运算(膨胀减腐蚀)则能够突出图像中的边缘信息,有助于识别和分析图像中的结构和形状。