Python OpenCV中的斗笠变换和黑帽变换
斗笠变换和黑帽变换 是对二值图像进行形态学变换操作。一般来说,形态学操作是基于形态、结构或形状对图像进行处理。
斗笠变换 是一种先打开图像,然后从原始图像中减去它的操作(斗笠 = 图像 – 开)。它用于从给定图像中提取小元素和细节,也就是特征提取、图像增强和其他操作。
而 黑帽变换 操作实际上是一个图像闭合与输入图像本身之间的差异(黑帽 = 闭 – 图像)。在减去原始图像之前,它先闭合图像。结果图像中的物体比周围和结构元素更暗、更小。
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)
输出
以下是上述程序的输入和输出图像 –
黑帽变换
黑帽变换就是闭合图像和原始图像之间的差异。
示例
让我们通过将MorphType cv2.MORPH_BLACKHAT参数指定给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))
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进行Top-hat和Black hat变换操作。