本期主要介绍图像的礼帽运算和黑帽运算,礼帽运算常用于获取原始图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息;黑帽运算常用来检测图像中的波谷结构,分离比邻近点暗一些的斑块,比如得到轮廓效果图。
完成本期内容,你可以:
-
了解图像礼帽运算的原理和应用
-
了解图像黑帽运算的原理和应用
-
学会使用礼帽运算进行图像处理
-
学会使用黑帽运算进行图像处理
若要运行案例代码,你需要有:
-
操作系统:Ubuntu 16 以上 或者 Windows10
-
工具软件:VScode 或者其他源码编辑器
-
硬件环境:无特殊要求
-
核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16
点击下载源码
礼帽运算
礼帽运算,也称顶帽运算或高帽运算,是用原始图像减去其开运算图像的操作。礼帽运算获取原始图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息,比如得到前景图外面的毛刺噪声。
礼帽图像=原始图像-开运算图像=原始图像-(原始图像先腐蚀再膨胀)
- 首先读取图像
- 进行图像开运算操作
- 原始图像减去开运算图像,得到相减后的图像,获得礼帽运算图像的结果
黑帽运算
黑帽运算是用其闭运算图像减去原始图像的操作。黑帽运算获取图像内部的小孔,或前景图像的小黑点,或得到比原始图像的边缘更暗的边缘部分。黑帽运算常用来检测图像中的波谷结构,分离比邻近点暗一些的斑块,比如得到轮廓效果图。
黑帽图像=闭运算图像-原始图像=(原始图像先膨胀后腐蚀)-原始图像
- 首先读取图像
- 进行图像闭运算操作
- 闭运算图像减去原始图像,得到相减后的图像,获得黑帽运算图像的结果
形态学方法
-
OpenCV将形态学方法封装成了
cv2.morphologyEx()
方法。函数原型:dst = cv2.morphologyEx(src, op, kernel, anchor, iterations, borderType, borderValue)
dst为输出图像。参数描述如下:
- src:被处理的图像
- kernel:操作中使用的核
- anchor:可选参数,核锚点的位置
- iterations:可选参数,迭代次数,默认值为1
- borderType:可选参数,边界样式,建议采用默认值
- borderValue:可选参数,边界值,建议采用默认值
- op:操作类型
参数值 含义 cv2.MORPH_ERODE 腐蚀操作 cv2.MORPH_DILATE 膨胀操作 cv2.MORPH_OPEN 开运算,先腐蚀后膨胀 cv2.MORPH_CLOSE 闭运算,先膨胀后腐蚀 cv2.MORPH_GRADIENT 梯度运算,膨胀图减腐蚀图,可以得到简易的轮廓 cv2.MORPH_TOPHAT 顶帽运算,原始图像减开运算图像 cv2.MORPH_BLACKHAT 黑帽运算,闭运算图像减原始图像
具体步骤
1. 创建项目结构
创建项目名为提取图像信息
,项目根目录下新建code
文件夹储存代码,新建dataset
文件夹储存数据,项目结构如下:
提取图像信息 # 项目名称
├── code # 储存代码文件
├── dataset # 储存数据文件
注:如项目结构已存在,无需再创建。
2. 使用图像礼帽运算进行图像处理
- 在
code
文件夹下创建tophat.py
文件; - 导入所需的库,OpenCV、numpy ;
- 读取
dataset
文件夹下的ursa_minor.png
图片,并进行展示 ; - 设置一个7 *7 的值都为1 的核;
- 使用礼帽运算进行图像处理,并展示结果;
代码实现
# 导入OpenCV、numpy
import cv2
import numpy as np
o=cv2.imread("../dataset/ursa_minor.png")#原始图像
k=np.ones((7,7),np.uint8)#设置核kernel
r=cv2.morphologyEx(o,cv2.MORPH_TOPHAT,k)#礼帽运算
cv2.imshow("original",o)
cv2.imshow("tophat",r)
cv2.waitKey()
cv2.destroyAllWindows()
图像开运算操作放大了裂缝或者局部降低亮度的区域,礼帽运算常用来分离比邻近点亮一些的斑块。在一幅图像具有大幅的背景且微小物品比较有规律的情况下,使用礼帽运算达到背景提取,使得线条更加突出的目的。
3. 使用图像黑帽运算进行图像处理
- 在
code
文件夹下创建blackhat.py
文件; - 导入所需的库,OpenCV、numpy ;
- 读取
dataset
文件夹下的ursa_minor.png
图片,并进行展示 ; - 设置一个7 *7 的值都为1 的核;
- 使用黑帽运算进行图像处理,并展示结果;
代码实现
# 导入OpenCV、numpy
import cv2
import numpy as np
o=cv2.imread("../dataset/ursa_minor.png")#原始图像
k=np.ones((7,7),np.uint8)#设置核kernel
r=cv2.morphologyEx(o,cv2.MORPH_BLACKHAT,k)#黑帽运算
cv2.imshow("original",o)
cv2.imshow("balckhat",r)
cv2.waitKey()
cv2.destroyAllWindows()
本小节主要介绍了礼帽运算和黑帽运算。通过两种运算对同一张图像进行处理,强化大家对礼帽运算和黑帽运算的理解,礼帽运算主要用于分离比邻近点亮一些的斑块,在一幅大图像具有大幅的背景,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。 而黑帽运算常用于分离比邻近点暗一些的斑块。
点击下载源码