概念說明
觀察圖像中這些變化的頻率就構成了另一條分類圖像的方法。這個觀點稱爲頻域。而通過觀察圖像灰度分佈來分類圖像稱爲空間域。
頻域分析將圖像分成從低頻到高頻的不同部分。低頻對應圖像強度變化小的區域,而高頻是圖像強度變化非常大的區域。目前已存在若干轉換方法,如傅立葉變換或餘弦變換,可以用來清晰的顯示圖像的頻率內容。注意,由於圖像是一個二維實體,所以其由水平頻率(水平方向的變化)和豎直頻率(豎直方向的變化)共同組成。
在頻率分析領域的框架中,濾波器是一個用來增強圖像中某個波段或頻率並阻塞(或降低)其他頻率波段的操作。低通濾波器是消除圖像中高頻部分,但保留低頻部分。高通濾波器消除低頻部分
基礎算法
用低通濾波來平滑圖像
低通濾波器的目標是降低圖像的變化率。如將每個像素替換爲該像素周圍像素的均值。這樣就可以平滑並替代那些強度變化明顯的區域。
高斯模糊
在某些情況下,需要對一個像素的周圍的像素給予更多的重視。因此,可通過分配權重來重新計算這些周圍點的值。這可通過高斯函數(鐘形函數,即喇叭形數)的權重方案來解決。
區別
低通濾波與高斯濾波的不同之處在於:低通濾波中,濾波器中每個像素的權重是相同的,即濾波器是線性的。而高斯濾波器中像素的權重與其距中心像素的距離成比例。
使用中值濾波消除噪點
前面介紹的是線性過濾器,這裏介紹非線性過濾器——中值濾波器。中值濾波器對消除椒鹽現象特別有用。
雙邊濾波(Bilateral filter)
是一種可以保邊去噪的濾波器。之所以可以達到此去噪效果,是因爲濾波器是由兩個函數構成。一個函數是由幾何空間距離決定濾波器係數。另一個由像素差值決定濾波器係數。
代碼
import cv2
import numpy as np
img = cv2.imread("test.jpg")
#低通濾波
result_1 = cv2.blur(img,(5,5)) #低通濾波。參數一是輸入的待處理圖像,參數2是低通濾波器的大小
cv2.imshow("blur",result_1)
#高斯模糊
gaussianResult = cv2.GaussianBlur(img,(5,5),1.5)
cv2.imshow("Gaussian",gaussianResult)
#中通濾波
def salt(img,n): #椒鹽噪聲
for k in range(n):
i = int(np.random.random() * img.shape[1]) #隨機設置噪聲點的座標
j = int(np.random.random() * img.shape[0])
if img.ndim == 2: #
img[j,i] = 255
elif img.ndim == 3:
img[j,i,0] = 255
img[j, i, 1] = 255
img[j, i, 2] = 255
return img
salted = salt(img,500)
cv2.imshow("Salt",salted)
result_2 = cv2.medianBlur(img,5) #中通濾波。第一個參數是待處理圖像,第二個參數是孔徑的尺寸,一個大於1的奇數
cv2.imshow("MedianBlur",result_2)
#雙邊濾波
blur_2=cv2.bilateralFilter(img,9,75,75)
cv2.imshow("bilateralFilter",blur_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
參考:
【1】http://blog.csdn.net/sunny2038/article/details/9155893