1 形态学-腐蚀操作
import cv2
img = cv2.imread('./img/dige.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 创建一个 3x3 的结构元素(内核)
# np.ones() 函数用于生成一个指定形状的数组,其中所有的元素都初始化为 1
# (3, 3) 是内核的形状,表示生成一个 3x3 的二维数组
# np.uint8 表示数组元素的数据类型为无符号 8 位整数
# 在图像处理中的形态学操作中,结构元素用于定义操作时考虑的邻域
# kernel 是用于形态学操作(如腐蚀、膨胀)的结构元素
# 全部元素为 1 的内核在腐蚀和膨胀操作中常用于处理二值图像
kernel = np.ones((3, 3), np.uint8)
# 对图像应用腐蚀操作
# cv2.erode() 函数用于对图像进行腐蚀操作,常用于图像处理中的形态学操作
# img 是输入图像,通常为二值图像(黑白图像),但也可以是灰度图像或彩色图像
# cv2.erode() 函数应用腐蚀操作
# kernel 是用于腐蚀的结构元素
# iterations = 1 表示进行 1 次腐蚀操作,迭代次数可以调整以增加腐蚀的强度
# 腐蚀操作会使图像中的白色区域(前景)变小,黑色区域(背景)变大
erosion = cv2.erode(img, kernel, iterations=1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
pie = cv2.imread('./img/pie.png')
cv2.imshow('pie', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()
kernel = np.ones((30,30),np.uint8)
erosion_1 = cv2.erode(pie,kernel,iterations = 1)
erosion_2 = cv2.erode(pie,kernel,iterations = 2)
erosion_3 = cv2.erode(pie,kernel,iterations = 3)
res = np.hstack((erosion_1,erosion_2,erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
2 形态学-膨胀操作
img = cv2.imread('./img/dige.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2 # 导入 OpenCV 库
import numpy as np # 导入 NumPy 库,用于数组操作
# 创建一个 3x3 的核,所有元素均为 1
kernel = np.ones((3, 3), np.uint8) # 创建一个 3x3 的矩形结构元素(核),数据类型为无符号 8 位整型
# 应用腐蚀操作
erosion = cv2.erode(img, kernel, iterations=1) # 使用 cv2.erode 函数对图像应用腐蚀操作
# 参数解释:
# img:输入图像,通常是 BGR 色彩空间的图像
# kernel:用于腐蚀操作的结构元素(核),在这里是一个 3x3 的矩形
# iterations:腐蚀操作的迭代次数,设置为 1 表示只进行一次腐蚀
# 显示腐蚀处理后的图像
cv2.imshow('erosion', erosion) # 使用 imshow 函数显示图像,窗口标题为 'erosion'
# 等待用户按键
cv2.waitKey(0) # 等待用户按键,无参数表示无限等待,直到按下任意键
# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows() # 关闭所有由 imshow 函数创建的窗口
# 创建一个 3x3 的结构元素(内核)
# np.ones() 函数用于生成一个指定形状的数组,其中所有的元素都初始化为 1
# (3, 3) 表示生成一个 3x3 的二维数组
# np.uint8 表示数组元素的数据类型为无符号 8 位整数
# 在图像处理中,结构元素用于定义形态学操作时考虑的邻域
# 这里创建的全 1 的内核在膨胀操作中用于扩展前景区域
kernel = np.ones((3, 3), np.uint8)
# 对经过腐蚀处理的图像应用膨胀操作
# cv2.dilate() 函数用于对图像进行膨胀操作,膨胀操作是形态学处理的一种
# dige_erosion 是经过腐蚀处理的图像,通常是二值图像
# kernel 是用于膨胀的结构元素(或内核),在这里使用的是全 1 的 3x3 内核
# iterations = 1 表示进行 1 次膨胀操作,迭代次数可以调整以增加膨胀的强度
# 膨胀操作会使图像中的白色区域(前景)变大,黑色区域(背景)变小
dige_dilate = cv2.dilate(dige_erosion, kernel, iterations=1)
cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
pie = cv2.imread('./img/pie.png')
kernel = np.ones((30,30),np.uint8)
dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
res = np.hstack((dilate_1,dilate_2,dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
3 开运算与闭运算
# 开:先腐蚀,再膨胀
img = cv2.imread('./img/dige.png')
kernel = np.ones((5,5),np.uint8)
# 对图像应用开运算
# cv2.morphologyEx() 函数用于执行复杂的形态学操作,这里进行的是开运算
# img 是输入图像,通常为二值图像,但也可以是灰度图像或彩色图像
# cv2.MORPH_OPEN 是指定的形态学操作类型,表示开运算(Opening)
# kernel 是用于形态学操作的结构元素,通常是一个预定义的形状,例如全 1 的内核
# 在这里使用的是之前创建的结构元素 kernel
# 开运算是先进行腐蚀操作再进行膨胀操作
# 这种操作用于去除小的前景区域(噪声)并平滑前景边界
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
4 梯度运算
# 梯度=膨胀-腐蚀
pie = cv2.imread('pie.png')
kernel = np.ones((7,7),np.uint8)
dilate = cv2.dilate(pie,kernel,iterations = 5) # 碰撞运算
erosion = cv2.erode(pie,kernel,iterations = 5) # 腐蚀运算
res = np.hstack((dilate,erosion))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 对图像应用梯度运算
# cv2.morphologyEx() 函数用于执行复杂的形态学操作,这里进行的是梯度运算
# pie 是输入图像,通常为二值图像,但也可以是灰度图像或彩色图像
# cv2.MORPH_GRADIENT 是指定的形态学操作类型,表示梯度运算(Gradient)
# kernel 是用于形态学操作的结构元素,通常是一个预定义的形状,例如全 1 的内核
# 在这里使用的是之前创建的结构元素 kernel
# 梯度运算是对图像进行膨胀操作和腐蚀操作的差异
# 这种操作用于检测图像的边缘
# 梯度图像显示了图像中的前景和背景之间的边缘信息
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel) # 梯度运算
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
5 礼帽与黑帽
- 礼帽 = 原始输入-开运算结果
- 黑帽 = 闭运算-原始输入
import cv2 # 导入 OpenCV 库
import numpy as np # 导入 NumPy 库,用于数组操作
# 读取图像
img = cv2.imread('./img/dige.png') # 使用 imread 函数读取图像文件,路径为 './img/dige.png'
# 创建一个 3x3 的核,所有元素均为 1
kernel = np.ones((3, 3), np.uint8) # 创建一个 3x3 的矩形结构元素(核),数据类型为无符号 8 位整型
# 应用礼帽变换
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) # 使用 cv2.morphologyEx 函数应用礼帽变换
# 参数解释:
# img:输入图像,通常是 BGR 色彩空间的图像
# cv2.MORPH_TOPHAT:礼帽变换的操作类型
# kernel:用于形态学操作的结构元素(核),在这里是一个 3x3 的矩形
# 显示礼帽变换处理后的图像
cv2.imshow('tophat', tophat) # 使用 imshow 函数显示图像,窗口标题为 'tophat'
# 等待用户按键
cv2.waitKey(0) # 等待用户按键,无参数表示无限等待,直到按下任意键
# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows() # 关闭所有由 imshow 函数创建的窗口
import cv2 # 导入 OpenCV 库
import numpy as np # 导入 NumPy 库,用于数组操作
# 读取图像
img = cv2.imread('./img/dige.png') # 使用 imread 函数读取图像文件,路径为 './img/dige.png'
# 创建一个 3x3 的核,所有元素均为 1
kernel = np.ones((3, 3), np.uint8) # 创建一个 3x3 的矩形结构元素(核),数据类型为无符号 8 位整型
# 应用黑帽变换
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) # 使用 cv2.morphologyEx 函数应用黑帽变换
# 参数解释:
# img:输入图像,通常是 BGR 色彩空间的图像
# cv2.MORPH_BLACKHAT:黑帽变换的操作类型
# kernel:用于形态学操作的结构元素(核),在这里是一个 3x3 的矩形
# 显示黑帽变换处理后的图像
cv2.imshow('blackhat', blackhat) # 使用 imshow 函数显示图像,窗口标题为 'blackhat'
# 等待用户按键
cv2.waitKey(0) # 等待用户按键,无参数表示无限等待,直到按下任意键
# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows() # 关闭所有由 imshow 函数创建的窗口