本期主要介绍图像的礼帽运算和黑帽运算,礼帽运算常用于获取原始图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息;黑帽运算常用来检测图像中的波谷结构,分离比邻近点暗一些的斑块,比如得到轮廓效果图。
完成本期内容,你可以:
了解图像礼帽运算的原理和应用
了解图像黑帽运算的原理和应用
学会使用礼帽运算进行图像处理
学会使用黑帽运算进行图像处理
若要运行案例代码,你需要有:
操作系统: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为输出图像。
参数描述如下:
| 参数值 | 含义 |
|---|---|
| cv2.MORPH_ERODE | 腐蚀操作 |
| cv2.MORPH_DILATE | 膨胀操作 |
| cv2.MORPH_OPEN | 开运算,先腐蚀后膨胀 |
| cv2.MORPH_CLOSE | 闭运算,先膨胀后腐蚀 |
| cv2.MORPH_GRADIENT | 梯度运算,膨胀图减腐蚀图,可以得到简易的轮廓 |
| cv2.MORPH_TOPHAT | 顶帽运算,原始图像减开运算图像 |
| cv2.MORPH_BLACKHAT | 黑帽运算,闭运算图像减原始图像 |
创建项目名为提取图像信息,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:
提取图像信息 # 项目名称
├── code # 储存代码文件
├── dataset # 储存数据文件
注:如项目结构已存在,无需再创建。
code文件夹下创建tophat.py文件;dataset文件夹下的ursa_minor.png图片,并进行展示 ;代码实现
# 导入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()

图像开运算操作放大了裂缝或者局部降低亮度的区域,礼帽运算常用来分离比邻近点亮一些的斑块。在一幅图像具有大幅的背景且微小物品比较有规律的情况下,使用礼帽运算达到背景提取,使得线条更加突出的目的。
code文件夹下创建blackhat.py文件;dataset文件夹下的ursa_minor.png图片,并进行展示 ;代码实现
# 导入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()

本小节主要介绍了礼帽运算和黑帽运算。通过两种运算对同一张图像进行处理,强化大家对礼帽运算和黑帽运算的理解,礼帽运算主要用于分离比邻近点亮一些的斑块,在一幅大图像具有大幅的背景,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。 而黑帽运算常用于分离比邻近点暗一些的斑块。