opencv3 - 3濾波


濾波實際上是信號處理裏的一個概念,而圖像本身也可以看成是一個二維的信號。
其中像素點灰度值的高低代表信號的強弱。
高頻:圖像中灰度變化劇烈的點。
低頻:圖像中平坦的,灰度變化不大的點。

根據圖像的高頻與低頻的特徵,我們可以設計相應的高通與低通濾波器。

  • 高通濾波:可以檢測圖像中尖銳、變化明顯的地方(銳化圖像)
  • 低通濾波:可以讓圖像變得光滑,濾除圖像中的噪聲(平滑圖像)

線性濾波

均值模糊

不能很好的保留圖像的細節。

dst = cv.blur(src, ksize)

ksize - 用於平滑操作的核的大小。
(1, 15)水平模糊, 1*15的矩陣
(15, 1)垂直模糊

dst = cv.blur(image, (30, 1)) 

blur()平滑圖像的函數,它用一個點鄰域內像素的平均灰度值來代替該點的灰度
平滑模糊、高斯模糊這兩個濾波器,都是鄰域內的像素按照一個權重相加,最後設置爲當前點的灰度值,這種操作又稱爲卷積。
這樣的濾波器叫線性濾波器,另外還有一種非線性的濾波器,比如中值濾波器,它是取鄰域內所有像素的中值作爲當前點的灰度值。

高斯模糊

高斯濾波是指用高斯函數作爲濾波函數的濾波操作,高斯模糊就是高斯低通。越靠近該像素的點提供越高的權重,計算平均值作爲插值。
ksize高斯內核的大小,其中ksize.height和size.width可以不同,但是必須爲正數&&奇數,或者是0(由sigma計算而來)
double類型的sigmaX,表示高斯核函數在X軸方向的標準偏差。
double類型的sigmaY,表示高斯核函數在Y軸方向的標準偏差。
若爲0則設爲sigmaX;兩者都爲0則由ksize.height和size.width計算出來。

高斯隨機噪聲圖片:

numpy.random.normal(loc=0.0, scale=1.0, size=None)

loc:float此概率分佈的均值(對應着整個分佈的中心centre)
scale:float此概率分佈的標準差(對應於分佈的寬度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints

非線性濾波

中值濾波

https://blog.csdn.net/weixin_37720172/article/details/72627543
取鄰域內所有像素的中值作爲當前點的灰度值。
可用於去掉椒鹽噪聲,脈衝噪聲,又能保留圖像的邊緣細節。
(花費時間是均值濾波的五倍以上)對細節(細、尖頂)很多的圖像不太合適。

dst = cv.medianBlur(image, 5)

ksize參數表示濾波窗口尺寸,必須是奇數並且大於1。比如這裏是5,中值濾波器就會使用5×5的範圍來計算,即對像素的中心值及其5×5鄰域組成了一個數值集,對其進行處理計算,當前像素被其中值替換掉。

雙邊濾波

Bilateral filter結合圖像的空間鄰近度和像素值相似度的一種折中處理,同時考慮空域信息和灰度相似性。

  • edge preserving
    比高斯濾波多了一個高斯方差sigma-d
    邊緣保留濾波Edge Preserving Filter
    高斯雙邊
    差異很大,就是顯著特徵,會被平滑掉

雙邊濾波函數
可以在保證邊界清晰的情況下,有效的去掉噪聲。考慮了圖像空間關係,也考慮了灰度關係。雙邊濾波同時使用了空間高斯權重、灰度相似性高斯權重,確保了邊界不會被模糊掉。

cv2.bilateralFilter(img,d,’p1’,’p2’)

d是領域的直徑,
空間高斯函數標準差
灰度值相似性高斯函數標準差

用戶自定義模糊

dst = cv.filter2D(src, ddepth, kernel)

ddepth
表示目標圖像深度,輸入值爲-1時,目標圖像和原圖像深度保持一致

kernel
卷積核(或者是相關核),一個單通道浮點型矩陣。修改kernel矩陣即可實現不同的模糊。
https://www.cnblogs.com/hihilary/archive/2012/11/27/2777973.html
通道表示每個點能存放多少個數,類似於BGR彩色圖中的每個像素點有三個值,即三通道的。
圖片中的深度表示每個值由多少位來存儲,是一個精度問題,一般圖片是8bit(位)的,則深度是8。

def customer_blur_demo(image):
    # kernel = np.ones([5, 5], np.float32)/25
    # [0, -1, 0], [-1, 5, -1], [0, -1, 0]
    # [1, 1, 1], [1, 1, 1], [1, 1, 1]/9
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
    dst = cv.filter2D(image, -1, kernel)
    cv.imshow("customer_blur", dst)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章