使用 OpenCV Python 进行顶帽变换和黑帽变换

pythonserver side programmingprogramming

顶帽变换和黑帽变换是二值图像上的形态学变换操作。通常,形态学操作基于形态、结构或形状处理图像。

顶帽变换是一种打开图像然后从原始图像中减去它的操作(顶帽 = 图像 - 打开)。它用于从给定图像中提取小元素和细节,这只不过是特征提取、图像增强和其他操作。

黑帽变换操作只不过是图像关闭和输入图像本身之间的差异(黑帽 = 关闭 - 图像)。它在从原始图像中减去它之前先关闭图像。生成的图像包含比周围环境和结构元素更暗、更小的物体。

OpenCV 提供了一个函数 cv2.morphologyEx(),它直接在图像上实现这些变换操作。

cv2.morphologyEx() 函数

该函数使用基本的侵蚀和扩张操作执行这些高级形态变换。

语法

cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

参数

  • Src:源图像,具有任意数量的通道。深度应为 CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F 之一。

  • Op:指定必须应用哪种类型的形态学操作。

    • MORPH_OPEN – 开运算

    • MORPH_CLOSE – 闭运算

    • MORPH_GRADIENT – 形态学梯度

    • MORPH_TOPHAT:"大礼帽"

    • MORPH_BLACKHAT:"黑帽"

  • Kernel:结构元素,其原点由锚点定义。它可以使用 getStructuringElement 创建。

  • Anchor:默认情况下,锚点与内核的位置(-1,-1)。负值指定锚点位于内核中心。

  • Dst:目标图像。

  • Iterations:指定应用侵蚀和扩张的次数。

  • borderType 和 borderValue:这些对于填充图像以考虑边界像素或图像形状不规则的情况很有用。

顶帽变换

顶帽变换只不过是原始图像与其开口之间的差异。

示例

让我们拍摄一张图片,并使用 cv2.morphologyEx() 方法进行顶帽变换。

import cv2
import numpy as np
img = cv2.imread('Images/Dog.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, Kernel)
cv2.imshow("Original", img)
cv2.imshow("TopHat", tophat)
cv2.waitKey(0)

输入图像

输出图像

示例

在此示例中,我们将手动实现 Top Hat 操作,首先找到图像开运算,然后将其从原始图像中减去。

import cv2
import numpy as np
img = cv2.imread('Images/Dog.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, Kernel)
tophat_manual = np.subtract(gray, opening)

cv2.imshow("Original", img)
cv2.imshow("TopHat_manual approach", tophat_manual)
cv2.waitKey(0)

输出

以下是上述程序的输入和输出图像 –

黑帽变换

黑帽变换只不过是闭合图像和原始图像之间的差异。

示例

让我们通过为 cv2.morphologyEx() 方法指定 MorphType cv2.MORPH_BLACKHAT 参数来执行黑帽变换操作。

import cv2
import numpy as np
img = cv2.imread('Images/Dog.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
blackhat = cv2.morphologyEx(gray, cv2.MORPH_BLACKHAT,内核)
cv2.imshow("Original", img)
cv2.imshow("BlackHat", blackhat)
cv2.waitKey(0)

输入图像

输出图像

示例

在此示例中,我们将通过从原始图像中减去原始图像来手动实现黑帽变换操作。

import cv2
将 numpy 导入为 np
img = cv2.imread('Images/Dog.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))
closing = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, Kernel)
blackhat_manual = np.subtract(closing, gray)

cv2.imshow("Original", img)
cv2.imshow("BlackHat_manual approach", blackhat_manual)
cv2.waitKey(0)

输出

这里我们讨论了使用 openCV python 的 Top-hat 和 Black hat Transform 操作。


相关文章