python實現模糊操作


 目錄:

(一)模糊或平滑與濾波的介紹

(二)均值模糊

(1) 原理

(2)代碼實現-----均值模糊函數blur()

(三)中值模糊------mediaBlur函數

(四)高斯模糊------GaussianBlur函數

(五)方框濾波------boxFliter函數

(六)雙邊濾波------bilateralFilter()函數

(七)自定義模糊filter2D

(1)介紹

(2)實現中值模糊

(3)實現銳化處理

(八)邊緣保留濾波------EPF

(1)高斯雙邊

(2)均值遷移

 

 

 

正文:

(一)模糊或平滑或濾波的介紹

平滑 也稱 模糊, 是一項簡單且使用頻率很高的圖像處理方法。平滑處理的用途有很多, 但是在本教程中我們僅僅關注它減少噪聲的功用。從濾波角度來講,一般主要的目的都是為了實現對圖像噪聲的消除,增強圖像的效果。

  • 平滑處理時需要用到一個 濾波器 。 最常用的濾波器是 線性 濾波器,線性濾波處理的輸出像素值 (i.e. g(i,j)) 是輸入像素值 (i.e. f(i+k,j+l))的加權和 :

    g(i,j) = \sum_{k,l} f(i+k, j+l) h(k,l)

    h(k,l) 稱為 , 它僅僅是一個加權系數。

    不妨把 濾波器 想象成一個包含加權系數的窗口,當使用這個濾波器平滑處理圖像時,就把這個窗口滑過圖像。

  • 濾波器的種類有很多, 這里僅僅提及最常用的。

(二)均值模糊

        (1) 原理

  • 最簡單的濾波器, 輸出像素值是核窗口內像素值的 均值 ( 所有像素加權系數相等)

  • 核如下:

    K = \dfrac{1}{K_{width} \cdot K_{height}} \begin{bmatrix}    1 & 1 & 1 & ... & 1 \\    1 & 1 & 1 & ... & 1 \\    . & . & . & ... & 1 \\    . & . & . & ... & 1 \\    1 & 1 & 1 & ... & 1   \end{bmatrix}

比如一個3*3的模板其實就可以如下表示:

 (2)代碼實現-----均值模糊函數blur()

均值模糊函數blur(),定義:blur(src,ksize,dst=None, anchor=None, borderType=None)。定義是有5個參數,但最后三個均為none,所以也就2個參數

src:要處理的原圖像,ksize: 周圍關聯的像素的范圍。

def blur_demo(image):   #均值模糊
    dst = cv.blur(image,(3,3))  #ksize是卷積核大小3行3列,列數越大模糊越大
    cv.imshow("blur_demo",dst)

 (三)中值模糊------mediaBlur函數

中值濾波模板就是用卷積框中像素的中值代替中心值,達到去噪聲的目的。這個模板一般用於去除椒鹽噪聲。中值濾波對於這些白點噪聲的去除是非常的好的。
前面的濾波器都是用計算得到的一個新值來取代中心像素的值,而中值濾波是用中心像素周圍(也可以使他本身)的值來取代他,卷積核的大小也是個奇數。
中值模糊函數medianBlur(): 定義:medianBlur(src, ksize, dst=None)。ksize與blur()函數不同,不是矩陣,而是一個數字,例如為5,就表示了5*5方陣

 

 

 1 def median_blur_demo(image):   #中值模糊,對於椒鹽噪聲的去噪效果好,去掉圖片中的一些黑點等
 2     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
 3     for i in range(2000):  # 添加點噪聲,白色
 4         temp_x = np.random.randint(0, gray.shape[0])
 5         temp_y = np.random.randint(0, gray.shape[1])
 6         gray[temp_x][temp_y] = 255
 7 
 8     cv.imshow("median_blur_gray", gray)
 9     dst = cv.medianBlur(gray,5)  #ksize是卷積核大小1行3列,列數越大模糊越大
10     cv.imshow("median_blur_demo",dst)

 (四)高斯模糊------GaussianBlur函數

https://www.cnblogs.com/april0315/p/13593743.html

(五)方框濾波

 

 

 默認是歸一化處理的,也就是normalize沒有這個參數時

 

 5*5核很容易發生溢出(每個像素點的值都保留在255),最后圖片為白色,2*2的核可能不會。

(六)雙邊濾波------bilateralFilter()函數

定義:bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
d:鄰域直徑
sigmaColor:顏色標准差

sigmaSpace:空間標准差

 1 src2 = cv.bilateralFilter(src1, 5, 5, 2) 2 cv.imshow("雙邊濾波", src2) 

(七)自定義模糊filter2D(上面是封裝在2D濾波器之上)

(1)介紹

Opencv提供的一個通用的2D濾波函數為cv2.filter2D(),
濾波函數的使用需要一個核模板,對圖像的濾波操作過程為:將和模板放在圖像的一個像素A上,求與之對應的圖像上的每個像素點的和,
核不同,得到的結果不同,而濾波的使用核心也是對於這個核模板的使用,需要注意的是,該濾波函數是單通道運算的,
也就是說對於彩色圖像的濾波,需要將彩色圖像的各個通道提取出來,對各個通道分別濾波才行。

(2)實現中值模糊

1 def custom_blur_demo(image):   #自定義模糊
2     kernel = np.ones([5,5],np.float32)/25   #聲明二維數組5*5,初始化1,保證值不溢出,除以數組大小,實現中值模糊  自定義卷積核的算子
3     dst = cv.filter2D(image,-1,kernel)
4     cv.imshow("custom_blur_demo",dst)

上述生成的5*5核模板其實就是一個均值濾波。,當我們是/25就是中值濾波,歸一化處理

(3)實現銳化處理

1 def custom_blur_demo(image):   #自定義模糊
2     kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32) #實現銳化處理,提高圖像的對比度,提高立體感,輪廓更加清晰
3     dst = cv.filter2D(image,-1,kernel)
4     cv.imshow("custom_blur_demo",dst)

(八)邊緣保留濾波------EPF

opencv實現EPF有兩種傳統方法,高斯雙邊和均值遷移

(1)高斯雙邊

差異越大,越會完整保留

 1 def bi_demo(image):
 2     dst = cv.bilateralFilter(image,0,100,15)  #第二個參數d是distinct,我們若是輸入了d,會根據其去算第3或4個參數,我們最好是使用第3或4個參數反算d,先設為0
 3     cv.imshow("bi_demo",dst)   
 4 
 5 src = cv.imread("./1.png")  #讀取圖片
 6 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #創建GUI窗口,形式為自適應
 7 cv.imshow("input image",src)    #通過名字將圖像和窗口聯系
 8 bi_demo(src)
 9 cv.waitKey(0)   #等待用戶操作,里面等待參數是毫秒,我們填寫0,代表是永遠,等待用戶操作
10 cv.destroyAllWindows()  #銷毀所有窗口

def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None): # real signature unknown; restored from __doc__

d, sigmaColor, sigmaSpace-------0,越大,越小

值域和空域的兩個方差sigma可以簡單的設置為相等,小於10,無太大效果,大於150效果太強,像卡通片似的。

濾波器尺寸d:大於5將較慢(5 forreal-time),d=9,for off-lineapplications,d 是像素鄰域“直徑”。計算的半徑,半徑之內的像數都會被納入計算,如果提供-1,會從后面的參數sigmaSpace中自動計算。

Sigma_color顏色空間過濾器的sigma值,這個參數的值越大,表明該像素鄰域內有越寬廣的顏色會被混合到一起,產生較大的半相等顏色區域。 

Sigma_space坐標空間中濾波器的sigma值,如果該值較大,則意味着顏色相近的較遠的像素將相互影響,從而使更大的區域中足夠相似的顏色獲取相同的顏色。當d>0時,d指定了鄰域大小且與sigmaSpace五官,否則d正比於sigmaSpace.  雙邊濾波的內在想法是:在圖像的值域(range)上做傳統濾波器在空域(domain)上做的工作。空域濾波對空間上鄰近的點進行加權平均,加權系數隨着距離的增加而減少;值域濾波則是對像素值相近的點進行加權平均,加權系數隨着值差的增大而減少。

對於第三個參數:d來說一般來說,要想得到比較好的結果,3、4、5參數最好都指定。

第三個參數如果設定值大於5,那計算會很慢,所以一般設置都等於5,如果少數情況需要去除比較大的噪聲,那么d=9。要取得較好的平滑效果,最好在9附近

d或者Sigma_space設置的越大,包含的范圍越大,耗時越長

(2)均值遷移

def pyrMeanShiftFiltering(src, sp, sr, dst=None, maxLevel=None, termcrit=None): # real signature unknown; restored from __doc__

1 def shift_demo(image):
2     dst = cv.pyrMeanShiftFiltering(image,10,50)  #第二個參數d是distinct,我們若是輸入了d,會根據其去算第3或4個參數,我們最好是使用第3或4個參數反算d,先設為0
3     cv.imshow("shift_demo",dst)

第一個參數src,輸入圖像,8位,三通道的彩色圖像,並不要求必須是RGB格式,HSV、YUV等Opencv中的彩色圖像格式均可;

第二個參數sp,定義的漂移物理空間半徑大小;  #越大,細節丟失越多

第三個參數sr,定義的漂移色彩空間半徑大小;
第四個參數dst,輸出圖像,跟輸入src有同樣的大小和數據格式;

第五個參數maxLevel,定義金字塔的最大層數;

第六個參數termcrit,定義的漂移迭代終止條件,可以設置為迭代次數滿足終止,迭代目標與中心點偏差滿足終止,或者兩者的結合;

參考:

https://www.cnblogs.com/ssyfj/p/9267648.html

https://blog.csdn.net/u011321546/article/details/79578029


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM