【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 函数创建的窗口
相关推荐
正在走向自律5 分钟前
4.提升客户服务体验:ChatGPT在客服中的应用(4/10)
人工智能·机器学习·chatgpt·职场和发展
不想CRUD的小凯7 分钟前
【AI大语言模型应用】使用Ollama搭建本地大语言模型
人工智能·语言模型·自然语言处理
红米煮粥7 分钟前
神经网络-MNIST数据集训练
人工智能·深度学习·神经网络
星如雨グッ!(๑•̀ㅂ•́)و✧8 分钟前
LLM Prompt
人工智能·chatgpt·prompt
DisonTangor8 分钟前
DepthCrafter:为开放世界视频生成一致的长深度序列
人工智能·计算机视觉·音视频
newxtc28 分钟前
【觅图网-注册安全分析报告-无验证方式导致安全隐患】
人工智能·安全·web安全·网络安全·系统安全·网络攻击模型
53年7月11天35 分钟前
claude,gpt,通义千问
人工智能·gpt
wengad35 分钟前
使用LangGPT提示词让大模型比较浮点数
人工智能·提示词工程·langgpt
神一样的老师1 小时前
人工智能物联网的去中心化和分布式学习:全面综述、新兴挑战和机遇
人工智能·物联网·去中心化
范范08251 小时前
基于NLP的对话系统开发:从零构建智能客服机器人
人工智能·自然语言处理·机器人