OpenCV Python中的高帽变换和黑帽变换


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

高帽变换是一种先对图像进行开运算,然后从原始图像中减去开运算结果的操作(高帽 = 图像 - 开运算)。它用于从给定图像中提取小的元素和细节,这也就是特征提取、图像增强和其他操作。

黑帽变换操作是图像闭运算与输入图像本身之差(黑帽 = 闭运算 - 图像)。它在从原始图像中减去闭运算结果之前先对图像进行闭运算。结果图像包含比周围环境和结构元素更暗更小的物体。

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)

输入图像

输出图像

示例

在这个例子中,我们将手动实现高帽操作,首先找到图像开运算,然后从原始图像中减去它。

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, Kernel)
cv2.imshow("Original", img)
cv2.imshow("BlackHat", blackhat)
cv2.waitKey(0)

输入图像

输出图像

示例

在这个例子中,我们将手动实现黑帽变换操作,从闭运算结果中减去原始图像。

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))
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 的高帽变换和黑帽变换操作。

更新于:2023年5月30日

浏览量 1K+

开启您的职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.