10. 邊緣保留濾波EPF-cv2.bilateralFilter()、cv2.pyrMeanShiftFiltering()

sc_kobe發表於2020-12-25

1. 什麼是EPF?

     高斯模糊: 基於權重,權重只考慮畫素空間的分佈,中間的權重大,邊緣的權重小。沒有考慮畫素值之間的差異問題,沒有考慮邊緣。
  邊緣保留濾波: 畫素之間的差異很大,說明是顯著特徵,如果直接平滑(濾波),顯著特徵會消失。畫素之間差異大的地方通常是邊緣,所以邊緣保留濾波處理後的圖片,在平滑(濾波)的情況下,依舊能夠保留影像的邊緣.。

2. 實現方式:

2.1 高斯雙邊濾波-cv2.bilateralFilter

雙邊濾波是一種非線性的濾波方法,是結合影像的空間鄰近度和畫素值相似度的一種折衷處理,同時考慮空間與資訊和灰度相似性,達到保邊去噪的目的,具有簡單、非迭代、區域性處理的特點。之所以能夠達到保邊去噪的濾波效果是因為濾波器由兩個函式構成:一個函式是由幾何空間距離決定濾波器係數,另一個是由畫素差值決定濾波器係數.

  • 實現函式:cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
  • 引數說明:
  • src:輸入影像

  • d:過濾時周圍每個畫素領域的直徑

  • sigmaColor:Sigma_color較大,則在鄰域中的畫素值相差較大的畫素點也會用來平均。

  • sigmaSpace:Sigma_space較大,則雖然離得較遠,但是,只要值相近,就會互相影響。

sigma_space設定較大,sigma_color設定較小,可獲得較好的效果(椒鹽噪聲)。

2.2 均值遷移濾波-cv2.pyrMeanShiftFiltering()

原理:meanShfit均值漂移演算法是一種通用的聚類演算法,它的基本原理是:對於給定的一定數量樣本,任選其中一個樣本,以該樣本為中心點劃定一個圓形區域,求取該圓形區域內樣本的質心,即密度最大處的點,再以該點為中心繼續執行上述迭代過程,直至最終收斂。可以利用均值偏移演算法的這個特性,實現彩色影像分割.

實現函式:cv2.pyrMeanShiftFiltering(src, dst, double sp, double sr, int maxLevel=1, TermCriteria termcrit=TermCriteria)

引數如下: 

  1. src,輸入影像,8位,三通道的彩色影像;
  2. dst,輸出影像,跟輸入src有同樣的大小和資料格式;
  3. sp,定義的漂移物理空間半徑大小;
  4. sr,定義的漂移色彩空間半徑大小;
  5. maxLevel,定義金字塔的最大層數;
  6. termcrit,定義的漂移迭代終止條件,可以設定為迭代次數滿足終止,迭代目標與中心點偏差滿足終止,或者兩者的結合;

3. 程式碼如下:

import cv2 as cv
import numpy as np


def bi_demo(image):  # bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
    
    dst = cv.bilateralFilter(image, 0, 100, 15)  # 高斯雙邊
    cv.imshow("bi_demo", dst)


def shift_demo(image):  # 均值遷移
    dst = cv.pyrMeanShiftFiltering(image, 10, 50)
    cv.imshow("shift_demo", dst)

if __name__ == '__main__':
    src = cv.imread("../images/CrystalLiu1.jpg")  # 讀入圖片放進src中
    cv.namedWindow("Crystal Liu")  # 建立視窗
    cv.imshow("Crystal Liu", src)  # 將src圖片放入該建立的視窗中
    bi_demo(src)
    shift_demo(src)

    cv.waitKey(0) # 等有鍵輸入或者1000ms後自動將視窗消除,0表示只用鍵輸入結束視窗
    cv.destroyAllWindows()  # 關閉所有視窗

 

相關文章