【OpenCV-图像形态学操作】礼帽与黑帽、梯度运算、开运算与闭运算、形态学-膨胀操作、形态学-腐蚀操作

1 形态学-腐蚀操作

python 复制代码
import cv2
img = cv2.imread('./img/dige.png')

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
python 复制代码
# 创建一个 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()
python 复制代码
pie = cv2.imread('./img/pie.png')

cv2.imshow('pie', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()
python 复制代码
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 形态学-膨胀操作

python 复制代码
img = cv2.imread('./img/dige.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
python 复制代码
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 函数创建的窗口
python 复制代码
# 创建一个 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()
python 复制代码
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 开运算与闭运算

python 复制代码
# 开:先腐蚀,再膨胀
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 梯度运算

python 复制代码
# 梯度=膨胀-腐蚀
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()
python 复制代码
# 对图像应用梯度运算
# 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 礼帽与黑帽

  • 礼帽 = 原始输入-开运算结果
  • 黑帽 = 闭运算-原始输入
python 复制代码
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 函数创建的窗口
python 复制代码
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 函数创建的窗口
相关推荐
多巴胺与内啡肽.38 分钟前
Opencv进阶操作:图像拼接
人工智能·opencv·计算机视觉
小草cys1 小时前
查看YOLO版本的三种方法
人工智能·深度学习·yolo
白熊1882 小时前
【计算机视觉】OpenCV实战项目:ETcTI_smart_parking智能停车系统深度解析
人工智能·opencv·计算机视觉
消失在人海中3 小时前
数据分析基础:需要掌握的入门知识
数据库·人工智能·数据分析
西红柿土豆丶3 小时前
基于Flask、Bootstrap及深度学习的水库智能监测分析平台
人工智能·python·深度学习·flask·bootstrap
zylyyyyyy3 小时前
DEEPPOLAR:通过深度学习发明非线性大核极坐标码(2)
人工智能·深度学习·信息与通信·polar码·译码
phoenix@Capricornus3 小时前
MATLAB Deep Learning Toolbox
人工智能·深度学习·matlab
国货崛起3 小时前
刘强东杀入自动驾驶!京东注册“Joyrobotaxi”商标
人工智能·机器学习·自动驾驶
HockerF3 小时前
交叉编译 opencv-4.10
人工智能·opencv·计算机视觉
新知图书3 小时前
使用OpenCV的VideoCapture播放视频文件示例
opencv·视频