回顾
前面我们介绍了图像的形态学操作中的腐蚀
、膨胀
、开运算
、闭运算
,这篇文章我们将继续介绍后面的形态学梯度
与顶底帽变换
这几种操作。
同样,我们还是以可爱的小鸟来介绍。
形态学梯度
这种方法其实就是膨胀
操作与腐蚀
操作的差,便于寻找对象的轮廓。针对一些简单的二值图,或者灰度图可能比较好的提取其边缘,但如果当成一个边缘检测的方法,效果却不会很好。
针对二值图与灰度图效果如下:
而针对彩色图,我们分别以10*10与50*50的两个核来进行操作,其效果如下:
可以发现:鸟的轮廓、后面山的轮廓以及气泡与一些水面上的小沙粒都显现的比较明显,而如果核再变大一些,轮廓线就会相应的变粗,这点从其是膨胀
操作与腐蚀
操作的差即可看出。
顶帽变换
原图像
与开操作
对象的差。当我们在处理一张图片的时候(例如提取眼底彩照的血管等信息),很多情况需要对这张图片进行一定的预处理,而通常我们就会用顶帽或者底帽变换。
顶帽变换
用于凸显暗背景上的亮物体。
对二值图来说,进行顶帽变换或之后底帽变换看起来就像是加一个阴影,有一种立体的效果。
而回到我们的彩图上,分别用两种不同大小的核来做,就是如下美如画的效果:
底帽变换
闭操作
与原图像
的差值。底帽变换
用于凸显用于凸显亮背景上的暗物体。
二值图效果如下,与顶帽变换相比,就是一个方向相反的阴影:
而底帽变换回到我们的彩图上,同样分别用两种不同大小的核来做,效果如下:
这些都是要针对实际的问题来进行操作的。最后我们来总结一下前面所提到的一系列形态学操作。
Python代码实现
# 开运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 闭运算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 形态学梯度
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 顶帽变换
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
# 底帽变换
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
形态学操作总结
下表中, X X 表示原图,表示用于进行相关操作的核。
操作 | 公式 | 性质 |
---|---|---|
膨胀 | X⊕K={x|K+x∪x≠∅} X ⊕ K = { x | K + x ∪ x ≠ ∅ } | 扩张 X X 的边界 |
腐蚀 | 收缩 X X 的边界 | |
形态学梯度 | 保留物体的边缘轮廓 | |
开运算 | X∘K=(X⊖K)⊕K X ∘ K = ( X ⊖ K ) ⊕ K | 平滑轮廓,切断狭窄区域,并消除小的孤岛和尖刺 |
闭运算 | X∙K=(X⊕K)⊖K X ∙ K = ( X ⊕ K ) ⊖ K | 平滑轮廓 |
顶帽变换 | That(X)=X−(X∘K) T h a t ( X ) = X − ( X ∘ K ) | 用于凸显暗背景上的亮物体 |
底帽变换 | Bhat(X)=(X∙K)−X B h a t ( X ) = ( X ∙ K ) − X | 用于凸显亮背景上的暗物体 |