在影象處理中許多濾波器(濾波函式)都會使用核(kernel),那麼什麼是核呢?
核其實是一組權重,決定了如何利用某乙個點周圍的畫素點來計算新的畫素點,核也被稱為卷積矩陣,對乙個區域的畫素做調和或者卷積運算,通常基於核的濾波器被稱為卷積濾波器。opencv中的filter2d()函式,可以運用由使用者指定的任意核來計算。
核是什麼樣的格式?
通常核是乙個二位陣列,特徵是奇數行、奇數列,中心位置對應著感興趣的畫素,陣列每乙個元素為整數或者浮點數,相對應值的大小對應其權重,比如:
kernel1=numpy.array([[-1, -1,-1],
[-1, 9, -1],
[-1,-1,-1]])
表明感興趣的畫素值權重為9,相鄰區域權重為-1,而計算則為將中心畫素值乘以9,減去周圍所有的畫素,如果感興趣的畫素與周圍畫素存在差異,則該差異會被放大,達到了銳化的目的。【注意】權重加起來和為1,這樣做的結果是不會改變影象的亮度,如果權重之和為0,則會得到乙個邊緣檢測核,將邊緣轉為白色,而非邊緣區域轉為黑色。
使用方法:cv2.filter2d(inputarray=img, depth=-1,kernel, outputarray=dst)
depth指定影象每個通道的位深度(位深度cv2.cv_8u表示每個通道為8位),關於這部分詳解內容見參看鏈結[1],為負值表示目標影象和源影象保持一致。而針對彩色影象,filter2d會對每乙個通道都使用相同的核,如果要用不同的核,需要使用split()和merge()函式。
python實現各種濾波及其表現:
卷積類:
class convolutionfilter(object):
"""乙個普通的卷積濾波器(灰度圖或者彩圖)
"""def __init__(self,kernel):
self._kernel=kernel
dst=cv2.filter2d(src,-1,self._kernel)
return dst
銳化濾波器類(sharpenfilter):
class sharpenfilter(convolutionfilter):
"""乙個指定核的濾波器
"""def __init__(self):
kernel=numpy.array([[-1,-1,-1],
[-1,9,-1],
[-1,-1,-1]])
convolutionfilter.__init__(self,kernel)
實現不同的濾波器只需要修改相應的核即可,比較有意思的
乙個核,它不對稱,同時具有模糊(因為有正的權重)和銳化(因為負的權重)的作用,會產生浮雕(emboss)的效果:
kernel=numpy.array([[-2, -1, 0],
[-1, 1, 1],
[0, 1, 2]])
呼叫起來也很方便:import cv2
#emboss濾波效果
embossfilter=filters.embossfilter()
cv2.imshow('embossimage',embossimg)
cv2.waitkey(0)cv2.destroyallwindows()
下面看看實際處理效果:
圖從左至右由上至下分別為:1)原圖 2)銳化 3)自編核 4)模糊處理 5)浮雕 6)canny邊緣檢測
單單是改變核,哪怕是某乙個元素的值,實現的功能可能就會不同,而要注意的是在邊緣檢測前往往會對影象進行模糊處理,可以很好的解決將雜訊錯誤的識別為邊緣的問題,opencv內常用的模糊方法有blur()(簡單的算術平均),medianblur(src,blurksize)以及gaussianblur(src,ksize)。
目的相同,不同的核其效果也會有所差別,方法的選擇取決於你的目的。
參考文獻
opencv 3計算機視覺 python語言實現(第2版)
opencv2函式學習之blur,gaussianblur,medianblur和bilateralfilter:實現影象平滑處理
opencv 高通濾波器
高通濾波器 高通濾波器 high pass filter,hpf 是檢測影象的某個區域,然後根據畫素與周圍畫素的亮度差值來提公升 boost 該畫素的亮度的濾波器。高通濾波器是根據畫素與鄰近畫素的亮度差值來提公升該畫素的亮度。低通濾波器 low pass filter,lpf 則是在畫素與周圍畫素的...
opencv幾種濾波器介紹
因為平時能用到各種濾波器,但是對各種濾波器效果並不清楚,現在準備把逐漸能用到的濾波器寫下來,方便自己以後查閱。1.中值濾波 中值濾波器是一種非線性濾波器,常用於消除影象中的椒鹽雜訊。與低通濾波不同的是,中值濾波有利於保留邊緣的尖銳度,但它會洗去均勻介質區域中的紋理。適用於椒鹽雜訊 椒鹽雜訊是由影象感...
OpenCV中濾波器的操作
影象濾波分為空域濾波和頻域濾波兩個,這篇隨筆主要針對空域濾波。當然空域與頻域之間是有一定關係的,比如均值濾波器,就是一種低通濾波,而像邊緣檢測,空域中一般使用的是拉普拉斯運算元,其也是一種高通濾波。0 1 0 14 1 0 10 這個表示的是縱橫兩個方向的二階導,將這個運算元應在影象上可以得到影象的...