☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░
一、黑帽簡介
黑帽(Black Hat),又稱“底帽”運算,其結果圖像為閉運算圖與原圖像的差,即:
dest=close(src,kernal)-src
由於閉運算是先膨脹和腐蝕,因此閉運算會去除圖像中的小黑點,同時也會擴大圖像前景輪廓的范圍,實際上也就是放大了圖像前景色區域,因此從閉運算圖減去原圖的運算結果突出了比原圖輪廓周圍的區域更暗的區域,此外黑帽還能得到圖像內部的小孔,或者前景色中的小黑點。因此黑帽運算可以用於提取亮背景中的細小暗物體。
黑帽在OpenCV-Python的調用語法如下:
morphologyEx(src, CV2.MORPH_BLACKHAT, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
關於morphologyEx的介紹請參考《OpenCV-Python圖像形態變換概述及morphologyEx函數介紹: https://blog.csdn.net/LaoYuanPython/article/details/109556425》。
二、利用黑帽去除暗水印
2.1、案例1:從地圖中去除水印
2.1.1、案例原圖
在如下圖像(文件名:帶水印中國地圖.jpg):
在上述地圖中存在兩行比較淡的水印:“老猿Python”、“https://blog.csdn.net/LaoYuanPython”。
2.1.2、圖像黑帽運算代碼
import cv2
import numpy as np
from opencvPublic import print2DMatrix,preparePreviewImg,previewImgList,previewImg
def morphologyExTest(imgObj,imgTitle=''):
if isinstance(imgObj, str):
img = cv2.imread(imgObj)#, cv2.IMREAD_GRAYSCALE)
if img is None:
img = cv2.imdecode(np.fromfile(imgObj, dtype=np.uint8), -1)
imgTitle = imgTitle+imgObj+': '
else:
imgTitle = imgTitle + ': '
if len(img.shape)==2: channel = 1
else: channel = img.shape[2]
if channel==3:
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
elif channel==4:
img = cv2.cvtColor(img,cv2.COLOR_BGRA2GRAY)
ksize = (3,3)
kernal = cv2.getStructuringElement(cv2.MORPH_RECT,ksize )
#preparePreviewImg(img, imgTitle + '原圖')
preparePreviewImg(cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernal),imgTitle+f'黑帽,矩形核大小{ksize}')
def morphologyTest():
morphologyExTest(r'f:\pic\帶水印中國地圖.jpg')
previewImgList()
morphologyTest()
上面代碼中使用的圖像預覽的函數請見《OpenCV-Python圖像運算變換處理:開運算和閉運算以及不同核矩陣的影響分析: https://blog.csdn.net/LaoYuanPython/article/details/109984045》的介紹。
2.1.3、結果圖像
經上述代碼處理后,該原圖黑帽運算的結果圖像如下:
可以看到黑帽運算后提取到了一副去除水印的完整地圖圖片。
2.2、案例2:處理彩色圖像
將上述代碼中處理的原圖替換為如下圖像(文件名:白底藍線淺水印.jpg),並將核大小調整為7*7:
得到如下黑帽結果圖像:
可以看到水印文字被去除,但留下了部分縫隙。
對上述圖像進行一次閉運算,得到如下圖像:
可以看到黑帽運算中的部分縫隙得到了部分填充。上述處理過程如果使用(3,3)大小的核,則無法達到上述的效果,相關線段無法提取出來。
以上述圖像對應的灰度圖像作為mask再將原圖像進行自與運算,就可以得到原圖像中除去水印的效果圖如下:
通過調整核大小以為9*9時,上述線段交叉處的黑色部分可以填充為藍色,效果會更好一些。
2.3、案例3:一個黑白圖的處理
2.3.1、源圖像(文件名:hill.JPG)
2.3.2、黑帽圖
上圖看起來都是黑色,對該圖乘以4倍因子得到如下圖:
可以看到提取的是原圖中白色部分的周邊邊緣,該效果很好地體現了黑帽運算的功能。
三、一個問題的解釋
前面介紹了,黑帽運算可以用於提取提取亮背景中的細小暗物體,通過案例3可以看到這點,但為什么反而可以在案例1和2中用於去除圖像中的淺色水印呢?我們以第二個例子為例來解釋:
-
首先我們來看看原圖進行閉運算的結果圖,如下
可以看到閉運算后,由於整圖的亮背景色,導致閉運算后,原圖的那些線條和文字幾乎接近不可見,但並不是都消失了,都該圖乘以0.5降低整體亮度后,得到如下圖像:
可以看到文字信息不見了,但線條還在。由此可以說明,作為水印的文字信息在閉運算中被膨脹清除了,而線條在閉運算中雖然提高了亮度但還是存在的,只是與周邊的顏色差異很小,無法看清,當乘以0.5后,這個差異就顯現出來了,由此可見該線條的顏色灰度值接近255。 -
由於黑帽是閉運算結果圖減原圖像,由於原圖像中背景色主色為白色,其像素灰度值值為255,而線條顏色為藍色,對應灰度值為127.5(計算方法請參見《圖像處理術語解釋:灰度、色相、飽和度、亮度、明度、阿爾法通道、HSL、HSV、RGBA、ARGB和PRGBA以及Premultiplied Alpha(Alpha預乘)等基礎概念詳解》),閉運算結果圖減原圖像后,得到灰度值接近於255-127.5=127.5,因此黑帽運算后線條能比較清晰的顯示。
因此通過黑帽運算后,背景色變成了黑色,線條比較清晰的展示,文字消失了,從而實現了水印文字的去除。從上面的介紹可以得出,水印文字之所以能消除,是因為水印文字顏色的灰度值與背景白色的灰度值相差不大。
四、小結
本文簡單介紹了黑帽的概念、原理和作用,以及OpenCV-Python的具體實現,並提供了兩個利用黑帽去除圖像水印的案例和一個提取白色圖像周邊黑色輪廓的案例,通過黑帽的結果圖像,再作為mask去與原圖像進行運算,即可以得到原圖像中去除水印后的亮色圖像部分。黑帽運算和頂帽類似,用一個結構元素(核矩陣)通過閉操作從一副圖像中刪除前景色中比較暗的部分,留下來前景色中相對比較亮的細小部分,就是從圖像的亮背景上提取細小的暗物體,黑帽這個特性也可以用於校正不均勻光照的影響(請參考博文:《光照不均勻圖像分割技巧2——頂帽變換和底帽變換》)。
寫作不易,敬請支持:
如果閱讀本文於您有所獲,敬請點贊、評論、收藏,謝謝大家的支持!
四、形態變換博文傳送門
下面是老猿博文中與形態變換相關的博文列表,將隨着后續博文的增加進行更新。
- OpenCV-Python圖像處理:腐蝕和膨脹原理及erode、dilate函數介紹:https://blog.csdn.net/LaoYuanPython/article/details/109441709
- OpenCV-Python圖像運算變換處理:開運算和閉運算以及不同核矩陣的影響分析: https://blog.csdn.net/LaoYuanPython/article/details/109984045
- OpenCV-Python圖像形態變換概述及morphologyEx函數介紹: https://blog.csdn.net/LaoYuanPython/article/details/109556425
- OpenCV-Python圖像運算變換處理:形態學梯度運算及分類:https://blog.csdn.net/LaoYuanPython/article/details/109768675
- OpenCV-Python中預覽超大圖的程序實現方法:https://blog.csdn.net/LaoYuanPython/article/details/110195287
- OpenCV-Python圖形圖像處理:利用TopHat頂帽獲取背景色中的噪點:https://blog.csdn.net/LaoYuanPython/article/details/110223709
- OpenCV-Python圖形圖像處理:利用黑帽去除圖像淺色水印:https://blog.csdn.net/LaoYuanPython/article/details/110294445
更多OpenCV-Python的介紹請參考專欄《OpenCV-Python圖形圖像處理 》
專欄網址:https://blog.csdn.net/laoyuanpython/category_9979286.html
關於老猿的付費專欄
老猿的付費專欄《使用PyQt開發圖形界面Python應用 》(https://blog.csdn.net/laoyuanpython/category_9607725.html)專門介紹基於Python的PyQt圖形界面開發基礎教程,付費專欄《moviepy音視頻開發專欄》 (https://blog.csdn.net/laoyuanpython/category_10232926.html)詳細介紹moviepy音視頻剪輯合成處理的類相關方法及使用相關方法進行相關剪輯合成場景的處理,兩個專欄都適合有一定Python基礎但無相關知識的小白讀者學習。
付費專欄文章目錄:《moviepy音視頻開發專欄文章目錄》(https://blog.csdn.net/LaoYuanPython/article/details/107574583)、《使用PyQt開發圖形界面Python應用專欄目錄 》(https://blog.csdn.net/LaoYuanPython/article/details/107580932)。
對於缺乏Python基礎的同仁,可以通過老猿的免費專欄《專欄:Python基礎教程目錄》(https://blog.csdn.net/laoyuanpython/category_9831699.html)從零開始學習Python。
如果有興趣也願意支持老猿的讀者,歡迎購買付費專欄。