在形态学和数字图像处理中,顶帽和黑帽变换是用于从给定图像中提取小元素和细节的操作。在这两种类型的变换中,顶帽变换被定义为输入图像与其开口之间的差异被某种结构元素定义,而黑帽变换被定义为闭合图像和输入图像之间的差异。这些变换用于各种图像处理任务,例如特征提取、背景均衡、图像增强等。进行顶帽和黑帽转换会涉及到 使OpeningClosing形态学操作和结构元素等概念。

Top-Hat 和 Black-Hat 之间的区别:

顶帽过滤器用于增强暗背景中感兴趣的明亮物体。黑帽操作用于做相反的事情,在明亮的背景中增强感兴趣的暗对象。
示例 1:顶帽变换

# Importing OpenCV 
import cv2
  
  
# Getting the kernel to be used in Top-Hat
filterSize =(3, 3)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, 
                                   filterSize)
  
# Reading the image named 'input.jpg'
input_image = cv2.imread("testing.jpg")
input_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
  
# Applying the Top-Hat operation
tophat_img = cv2.morphologyEx(input_image, 
                              cv2.MORPH_TOPHAT,
                              kernel)
  
cv2.imshow("original", input_image)
cv2.imshow("tophat", tophat_img)
cv2.waitKey(5000)

输入图像:

输出结果:

正如上图,使用 Top-Hat 操作增强并去除了非常小的细节。因此,当输入作为暗背景上的亮像素存在时,它有助于观察输入的次要细节。

示例 2:黑帽变换

# Importing OpenCV and numpy
import cv2

# Defining the kernel to be used in Top-Hat
filterSize =(3, 3)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,
								filterSize)

# Reading the image named 'input.jpg'
input_image = cv2.imread("testing.jpg")
input_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)

# Applying the Black-Hat operation
tophat_img = cv2.morphologyEx(input_image,
							cv2.MORPH_BLACKHAT,
							kernel)

cv2.imshow("original", input_image)
cv2.imshow("tophat", tophat_img)
cv2.waitKey(5000)

输入图像:

输出结果:

在此图像中,由于应用于输入图像的黑帽变换,所有在深色背景上的白色对象都被突出显示。

其中

cv2.morphologyEx()函数

前三个参数的设置:

第一个参数是操作的照片

第二参数操作类型

MORTH_OPEN 函数做打开操作

MORTH_CLOSE 函数做关闭操作

使用 MORTH_GRADIENT 函数进行形态梯度操作

MORTH_TOPHAT 函数做顶帽操作

MORTH_BLACKHAT 函数做黑帽操作

MORTH_DILATE 函数进行扩展

腐蚀操作的 MORTH_ERODE 函数

第三个参数,内核类型,由 getStructuringElement 函数获取。

大家可以动动小手试试效果。

总结:

可用于处理图像中的非均匀照明,因此可以成为图像分割任务的有用预处理工具。主要思想是选择足够大的结构元素,它会侵蚀所有对象区域。然后唯一剩下的就是背景或阴影图案。从图像中减去这个背景将产生一个减少非均匀照明效果的图像。

参考:

https://www.geeksforgeeks.org/top-hat-and-black-hat-transform-using-python-opencv/