一.均值濾波:
圖片中一個方塊區域(一般爲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()
#顯示結果