当前位置: 首页 > news >正文

Opencv形态学的膨胀操作、开运算与闭运算、梯度运算、礼帽与黑帽操作

文章目录

    • 一、膨胀操作
    • 二、开运算与闭运算
    • 三、梯度运算
    • 四、礼帽与黑帽操作

一、膨胀操作

膨胀操作也就是根据图片将边缘的一些细节给丰富,处理的程度取决于卷积核的大小还有膨胀次数。也就是腐蚀操作的相反操作(腐蚀操作参考我的上一篇文章 点击跳转)。

拿下面的这张照片来举个例子:

在这里插入图片描述
通过膨胀操作:

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")# 创建一个30x30的矩形结构元素,用于形态学操作
# np.ones((30,30),np.uint8)创建一个所有元素都是1的30x30矩阵
kernel = np.ones((30, 30), np.uint8)# 使用cv2.dilate()函数对图像进行膨胀操作一次
dilate_1 = cv2.dilate(img, kernel, iterations=1)# 使用cv2.dilate()函数对图像进行膨胀操作两次
dilate_2 = cv2.dilate(img, kernel, iterations=2)# 使用cv2.dilate()函数对图像进行膨胀操作三次
dilate_3 = cv2.dilate(img, kernel, iterations=3)# 使用numpy的hstack()函数将三个膨胀后的图像水平堆叠在一起
res = np.hstack((dilate_1, dilate_2, dilate_3))# 显示堆叠后的图像
cv2.imshow("res", res)
# 等待用户按下任意键
cv2.waitKey(0)
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

膨胀一次:
在这里插入图片描述

膨胀两次:
在这里插入图片描述
膨胀三次:
在这里插入图片描述

二、开运算与闭运算

开运算是先进行腐蚀操作,然后进行膨胀操作,用于去除小的物体

拿以下图片来举例子:

在这里插入图片描述

经过开运算:

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\3.jpg")# 创建一个5x5的矩形结构元素,用于形态学操作
# np.ones((5,5),np.uint8)创建一个所有元素都是1的5x5矩阵
kernel = np.ones((10, 10), np.uint8)# 使用cv2.morphologyEx()函数对图像进行开运算
# 开运算是先进行腐蚀操作,然后进行膨胀操作,用于去除小的物体
# cv2.MORPH_OPEN指定要执行的形态学操作是开运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)# 使用cv2.imshow()函数显示开运算后的图像
cv2.imshow("opening", opening)
# 使用cv2.waitKey(0)函数等待,直到用户按下任意键
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述
具体优化效果根据卷积核而进行调整改变。

闭运算是先进行膨胀操作,然后进行腐蚀操作,用于填充物体内部的小洞或连接临近物体

经过闭运算:

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\3.jpg")# 创建一个10x10的矩形结构元素,用于形态学操作
# np.ones((10,10),np.uint8)创建一个所有元素都是1的10x10矩阵
kernel = np.ones((10, 10), np.uint8)# 使用cv2.morphologyEx()函数对图像进行闭运算
# 闭运算是先进行膨胀操作,然后进行腐蚀操作,用于填充物体内部的小洞或连接临近物体
# cv2.MORPH_CLOSE指定要执行的形态学操作是闭运算
opening = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)# 使用cv2.imshow()函数显示闭运算后的图像
cv2.imshow("opening", opening)
# 使用cv2.waitKey(0)函数等待,直到用户按下任意键
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

三、梯度运算

梯度 = 膨胀 - 腐蚀,形态学梯度是膨胀和腐蚀操作的差值,用于突出物体的边缘

展示膨胀和腐蚀的效果:

import cv2
import matplotlib.pyplot as plt
import numpy as npimg = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")kernel = np.ones((7, 7),np.uint8)
dilate = cv2.dilate(img,kernel,iterations = 5)
erosion = cv2.erode(img,kernel,iterations = 5)res = np.hstack((dilate , erosion))cv2.imshow("res",res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
梯度计算:

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\4.jpg")# 创建一个7x7的矩形结构元素,用于形态学操作
# np.ones((7,7),np.uint8)创建一个所有元素都是1的7x7矩阵
kernel = np.ones((7, 7), np.uint8)# 使用cv2.morphologyEx()函数计算图像的形态学梯度
# 形态学梯度是膨胀和腐蚀操作的差值,用于突出物体的边缘
# cv2.MORPH_GRADIENT指定要执行的形态学操作是梯度运算
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)# 使用cv2.imshow()函数显示形态学梯度后的图像
cv2.imshow("gradient", gradient)
# 使用cv2.waitKey(0)函数等待,直到用户按下任意键
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

运算结果:

在这里插入图片描述

四、礼帽与黑帽操作

礼帽 = 原始输入-开运算结果 礼帽变换的目的是突出图像中比其周围环境更亮的物体或特征。
黑帽 = 闭运算结果 - 原始输入 黑帽变换是图像的腐蚀版本减去图像的膨胀版本,用于突出比周围暗的物体

礼帽:

import cv2
import matplotlib.pyplot as plt
import numpy as npimg = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\3.jpg")kernel = np.ones((10, 10), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)cv2.imshow("gradient",tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

运算结果:
在这里插入图片描述
原始输入(带有毛刺)- 开运算结果(去除毛刺) = 周围的毛刺(上图)
黑帽:

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\3.jpg")# 创建一个10x10的矩形结构元素,用于形态学操作
# np.ones((10,10),np.uint8)创建一个所有元素都是1的10x10矩阵
kernel = np.ones((10, 10), np.uint8)# 使用cv2.morphologyEx()函数对图像进行黑帽变换
# 黑帽变换是图像的腐蚀版本减去图像的膨胀版本,用于突出比周围暗的物体
# cv2.MORPH_BLACKHAT指定要执行的形态学操作是黑帽变换
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)# 使用cv2.imshow()函数显示黑帽变换后的图像
cv2.imshow("blackhat", blackhat)
# 使用cv2.waitKey(0)函数等待,直到用户按下任意键
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述


http://www.mrgr.cn/news/51660.html

相关文章:

  • [Java基础] 流程控制
  • 【STM32单片机_(HAL库)】6-6-2【串口通信UART、USART】【蓝牙遥控插座项目】项目实现
  • pandas 数据分析实战
  • 字典树 计数问题(含 2022 icpc杭州 K)
  • awk工具的基本使用
  • 十二、Python基础语法(字符串str-上)
  • k8s系列-Rancher 上操作的k8s容器网络配置总结
  • Leetcode——数组:螺旋矩阵59.螺旋矩阵
  • 什么是领域驱动设计(DDD)?为什么需要领域驱动设计?
  • BAT脚本修改指定文件夹的图标,文件夹图标不变
  • 自定义树形结构转换,Hutool的TreeUtil工具
  • 算法之排序
  • 我只是一个不务正业的程序媛
  • 怎么给PPT文件设置文字动画效果,提高美观度
  • 选择排序,插入排序,快速排序的java简单实现
  • 宇宙之外的生命存在性探究
  • 常用分布的数学期望、方差、特征函数
  • Dos下编译环境搭建和C运行程序生成
  • 2024年第九届数维杯大学生数学建模挑战赛赛题和数维杯国际数学建模 LaTeX 模板
  • 谈Sobel算子的数学推导——原来是四个方向的相加