數字圖像處理大作業--均值濾波和方框濾波(盒子濾波)python實現

一.均值濾波:

 

 

圖片中一個方塊區域(一般爲3*3)內,中心點的像素爲全部點像素值的平均值。均值濾波就是對於整張圖片進行以上操作。

 

我們可以看下圖的矩陣進行理解

 

缺陷:均值濾波本身存在着固有的缺陷,即它不能很好地保護圖像細節,在圖像去噪的同時也破壞了圖像的細節部分,從而使圖像變得模糊,不能很好地去除噪聲點。

 

原圖:

 

對比圖:

 

 

 

  • 方框濾波

 

 

原理:當normalize=True時,與均值濾波結果相同, normalize=False,表示對加和後的結果不進行平均操作,大於255的使用255表示

用途:

非歸一化(normalized=False)的方框濾波用於計算每個像素鄰域內的積分特性,比如密集光流算法(dense optical flow algorithms)中用到的圖像倒數的協方差矩陣(covariance matrices of image derivatives)

 

 

import cv2
from pylab import *

def BoxFilter(Imge,dim,dim2,flag):       #Image爲待處理圖像,dim爲濾波器的大小dim*dim2
    im=array(Imge)
    #序列化
    sigema=0
    #濾波求和

    for i in range(int(dim/2), im.shape[0] - int(dim/2)):
        for j in range(int(dim2/2), im.shape[1] - int(dim2/2)):
            for a in range(-int(dim/2), -int(dim/2)+dim):
                for b in range(-int(dim2/2), -int(dim2/2)+dim2):
                    sigema = sigema + img[i + a, j + b]
                    #對於濾波範圍內求和,從左到右,從上到下掃

            if(flag):
                im[i, j] = sigema / (dim*dim2)

            else:
                im[i,j]=min(sigema,255)
            #歸一化則與均值濾波一致,不歸一化的話超過255用255表示
            sigema = 0
            #濾波移動
    return im


img=cv2.imread('20170522171941388.png',0)
#讀取圖像
x=int(input("輸入濾波長度:\n"))
y=int(input("輸入濾波寬度:\n"))
flag=int(input("是否歸一化(1/0)?\n"))

im=BoxFilter(img,x,y,flag)
#im= cv2.boxFilter(img, -1, (3, 3), normalize=False)
#im= cv2.blur(source, (3, 3))

#第一個爲手寫的方框濾波,第二個爲opencv調包的方框濾波,第三個爲調包的均值濾波

cv2.imshow('After',im)
cv2.imshow('Origin',img)
cv2.waitKey()
cv2.destroyAllWindows()
#顯示結果

 

發佈了89 篇原創文章 · 獲贊 31 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章