使用 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)
输入图像
输出图像
示例
在此示例中,我们将手动实现 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 操作。