四、形态学图像处理
4.6 灰度图像的形态学处理
4.6.1灰度图像的腐蚀操作
灰度图像的腐蚀处理会让图像整体变暗,增强较暗的细节,抑制较亮的细节。其有助于分割图像、平滑图像边缘。
import cv2
import numpy as np
# 读取图像
image = cv2.imread('fu.jpg', cv2.IMREAD_GRAYSCALE)
# 检查图像是否成功加载
if image is None:
print("Error: Image could not be read.")
exit()
# 定义腐蚀操作的结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行腐蚀操作
erosion_image = cv2.erode(image, kernel, iterations=1)
# 将原图缩小一半
resized_image = cv2.resize(image, None, fx=0.5, fy=0.5)
# 将腐蚀后的图像缩小一半
resized_erosion_image = cv2.resize(erosion_image, None, fx=0.5, fy=0.5)
# 显示原图
cv2.imshow('Original Image', resized_image)
# 显示腐蚀后的图像
cv2.imshow('Erosion Image', resized_erosion_image)
# 等待按键操作后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
4.6.2灰度图像的膨胀操作
灰度图像的膨胀处理会让图像整体变亮,增强较量的细节,抑制较暗的细节。其有助于填补图像中的空洞,连接相邻物体。
import cv2
import numpy as np
# 读取图像
image = cv2.imread('fu.jpg', cv2.IMREAD_GRAYSCALE)
# 检查图像是否成功加载
if image is None:
print("Error: Image could not be read.")
exit()
# 定义膨胀操作的结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行膨胀操作
dilation_image = cv2.dilate(image, kernel, iterations=1)
# 将原图缩小一半
resized_image = cv2.resize(image, None, fx=0.5, fy=0.5)
# 将膨胀后的图像缩小一半
resized_dilation_image = cv2.resize(dilation_image, None, fx=0.5, fy=0.5)
# 显示原图
cv2.imshow('Original Image', resized_image)
# 显示膨胀后的图像
cv2.imshow('Dilation Image', resized_dilation_image)
# 等待按键操作后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
4.6.3灰度图像的开运算、闭运算
灰度图像的开运算闭运算与二值图像的定义相同,开运算使先腐蚀再膨胀,闭运算则是先膨胀再腐蚀。
灰度图像的开运算可以去除亮点噪声,其先通过腐蚀操作去除亮点,再通过膨胀操作恢复图像亮度,而被去除的亮点无法通过膨胀操作复原。
灰度图像闭运算可以消除图像小孔。其先通过膨胀操作扩展了图像中的亮区域,填充了原本存在的小孔洞或空白的区域。随后,经过腐蚀操作使图像恢复原来的亮度,腐蚀操作虽然在一定程度上缩小了亮区域的范围,但由于膨胀操作已经填充了孔洞,因此腐蚀操作并不会消除这些填充效果。
开运算
import cv2
import numpy as np
# 读取图像
image = cv2.imread('fu.jpg', cv2.IMREAD_GRAYSCALE)
# 检查图像是否成功加载
if image is None:
print("Error: Image could not be read.")
exit()
# 定义结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行开运算操作:先腐蚀后膨胀
opened_image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
# 将原图缩小一半
resized_image = cv2.resize(image, None, fx=0.5, fy=0.5)
# 将开运算后的图像缩小一半
resized_opened_image = cv2.resize(opened_image, None, fx=0.5, fy=0.5)
# 显示原图
cv2.imshow('Original Image', resized_image)
# 显示开运算后的图像
cv2.imshow('Opened Image', resized_opened_image)
# 等待按键操作后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
闭运算
import cv2
import numpy as np
# 读取图像
image = cv2.imread('fu.jpg', cv2.IMREAD_GRAYSCALE)
# 检查图像是否成功加载
if image is None:
print("Error: Image could not be read.")
exit()
# 定义结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行闭运算操作:先膨胀后腐蚀
closed_image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
# 将原图缩小一半
resized_image = cv2.resize(image, None, fx=0.5, fy=0.5)
# 将闭运算后的图像缩小一半
resized_closed_image = cv2.resize(closed_image, None, fx=0.5, fy=0.5)
# 显示原图
cv2.imshow('Original Image', resized_image)
# 显示闭运算后的图像
cv2.imshow('Closed Image', resized_closed_image)
# 等待按键操作后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
注:本人为在校学生,博客是边学边写的,主要是为了巩固知识,如有错误请积极指正。
本文的内容主要基于我对张运楚教授编著的《数字图像处理》一书的学习和理解。这本书深入浅出地介绍了数字图像处理的基本理论以及经典算法等,并且提供了丰富的示例代码和实际用例,极大地帮助了我学习图像处理知识。在此,我推荐大家阅读这本书,更加深入的学习有关图像处理的知识。