標籤:item mac 離散 定義 產生 ima gaussian nano 相同
過濾是訊號和影像處理中基本的任務。其目的是根據應用環境的不同,選擇性的提取映像中某些認為是重要的資訊。過濾可以移除映像中的噪音、提取感興趣的可視特徵、允許映像重採樣等等。頻域分析將映像分成從低頻到高頻的不同部分。低頻對應映像強度變化小的地區,而高頻是映像強度變化非常大的地區。在頻率分析領域的架構中,濾波器是一個用來增強映像中某個波段或頻率並阻塞(或降低)其他頻率波段的操作。低通濾波器是消除映像中高頻部分,但保留低頻部分。高通濾波器消除低頻部分。參考部落格:9155893
個人認為模糊操作就是過濾掉映像中的一些特殊噪音。
具體模糊和濾波的關係如:參考知乎大神:https://www.zhihu.com/question/54918332/answer/142137732
一、均值模糊、中值模糊、使用者自訂模糊
代碼如下:
#均值模糊、中值模糊、自訂模糊 模糊是卷積的一種表象import cv2 as cvimport numpy as npdef blur_demo(image): #均值模糊 去隨機雜訊有很好的去燥效果 dst = cv.blur(image, (1, 15)) #(1, 15)是垂直方向模糊,(15, 1)還水平方向模糊 cv.namedWindow(‘blur_demo‘, cv.WINDOW_NORMAL) cv.imshow("blur_demo", dst)def median_blur_demo(image): # 中值模糊 對椒鹽雜訊有很好的去燥效果 dst = cv.medianBlur(image, 5) cv.namedWindow(‘median_blur_demo‘, cv.WINDOW_NORMAL) cv.imshow("median_blur_demo", dst)def custom_blur_demo(image): # 使用者自訂模糊 kernel = np.ones([5, 5], np.float32)/25 #除以25是防止數值溢出 dst = cv.filter2D(image, -1, kernel) cv.namedWindow(‘custom_blur_demo‘, cv.WINDOW_NORMAL) cv.imshow("custom_blur_demo", dst)src = cv.imread(‘E:\imageload\lenanoise.jpg‘)cv.namedWindow(‘input_image‘, cv.WINDOW_NORMAL)cv.imshow(‘input_image‘, src)blur_demo(src)median_blur_demo(src)custom_blur_demo(src)cv.waitKey(0)cv.destroyAllWindows()
運行結果:
注意:
1.均值濾波是典型的線性濾波演算法,它是指在映像上對目標像素給一個模板,該模板包括了其周圍的臨近像素(以目標像素為中心的周圍8個像素,構成一個濾波模板,即去掉目標像素本身),再用模板中的全體像素的平均值來代替原來像素值。
低通濾波(均值模糊)函數原型:blur(src, ksize[, dst[, anchor[, borderType]]]) -> dst
src參數表示待處理的輸入映像。
ksize參數表示模糊核心大小。比如(1,15)表示產生的模糊核心是一個1*15的矩陣。
dst參數表示輸出與src相同大小和類型的映像。
anchor參數、borderType參數可忽略
2.中值濾波法是一種非線性平滑技術,它將每一像素點的灰階值設定為該點某鄰域視窗內的所有像素點灰階值的中值。具體原理參見部落格:72627543
中值濾波(中值模糊)函數原型:medianBlur(src, ksize[, dst]) -> dst
src參數表示待處理的輸入映像。
ksize參數表示濾波視窗尺寸,必須是奇數並且大於1。比如這裡是5,中值濾波器就會使用5×5的範圍來計算,即對像素的中心值及其5×5鄰域組成了一個數值集,對其進行處理計算,當前像素被其中值替換掉。
dst參數表示輸出與src相同大小和類型的映像。
3.使用者自訂模糊
所用函數:filter2D()
函數原型: filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst
src參數表示待處理的輸入映像。
ddepth參數表示靶心圖表像深度,輸入值為-1時,靶心圖表像和原映像深度保持一致
kernel: 卷積核(或者是相關核),一個單通道浮點型矩陣。修改kernel矩陣即可實現不同的模糊
二、高斯模糊
代碼如下:
#高斯模糊 輪廓還在,保留映像的主要特徵 高斯模糊比均值模糊去噪效果好import cv2 as cvimport numpy as npdef clamp(pv): if pv > 255: return 255 if pv < 0: return 0 else: return pvdef gaussian_noise(image): #加高斯雜訊 h, w, c = image.shape for row in range(h): for col in range(w): s = np.random.normal(0, 20, 3) b = image[row, col, 0] #blue g = image[row, col, 1] #green r = image[row, col, 2] #red image[row, col, 0] = clamp(b + s[0]) image[row, col, 1] = clamp(g + s[1]) image[row, col, 2] = clamp(r + s[2]) cv.namedWindow("noise image", cv.WINDOW_NORMAL) cv.imshow("noise image", image) dst = cv.GaussianBlur(image, (15, 15), 0) # 高斯模糊 cv.namedWindow("Gaussian", cv.WINDOW_NORMAL) cv.imshow("Gaussian", dst)src = cv.imread(‘E:\imageload\lena.jpg‘)cv.namedWindow("input_image", cv.WINDOW_NORMAL)cv.imshow(‘input_image‘, src)gaussian_noise(src)dst = cv.GaussianBlur(src, (15,15), 0) #高斯模糊cv.namedWindow("Gaussian Blur", cv.WINDOW_NORMAL)cv.imshow("Gaussian Blur", dst)cv.waitKey(0)cv.destroyAllWindows()
運行結果:
注意:
1.高斯模糊實質上就是一種均值模糊,只是高斯模糊是按照加權平均的,距離越近的點權重越大,距離越遠的點權重越小。通俗的講,高斯濾波就是對整幅映像進行加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值經過加權平均後得到。
2.高斯分布的一維和二維原理如下:
補:高斯分布的標準差σ。標準差代表著資料的離散程度,如果σ較小,那麼產生的模板的中心係數較大,而周圍的係數較小,這樣對映像的凹凸貼圖就不是很明顯;反之,σ較大,則產生的模板的各個係數相差就不是很大,比較類似均值模板,對映像的凹凸貼圖比較明顯。高斯模糊具體原理見博文:51023768
3.高斯模糊GaussianBlur函數原型:GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst
src參數表示待處理的輸入映像。
ksize參數表示高斯濾波器模板大小。 ksize.width和ksize.height可以不同,但它們都必須是正數和奇數。或者,它們可以是零,即(0, 0),然後從σ計算出來。
sigmaX參數表示 X方向上的高斯核心標準差。
sigmaY參數表示 Y方向上的高斯核心標準差。 如果sigmaY為零,則設定為等於sigmaX,如果兩個sigma均為零,則分別從ksize.width和ksize.height計算得到。
補:若ksize不為(0, 0),則按照ksize計算,後面的sigmaX沒有意義。若ksize為(0, 0),則根據後面的sigmaX計算ksize
4.numpy包裡的random模組用於產生隨機數,random模組裡的normal函數表示的是產生高斯隨機數。
normal函數預設原型:normal(loc=0.0, scale=1.0, size=None)。
loc參數表示高斯分布的中心點。
scale參數表示高斯分布的標準差σ。
size參數表示產生隨機數的個數。size取值可以為(m,n,k),表示繪製m*n*k個樣本。
三、邊緣保留濾波EPF
進行邊緣保留濾波通常用到兩個方法:高斯雙邊濾波和均值遷移濾波。
代碼如下:
#邊緣保留濾波(EPF) 高斯雙邊、均值遷移import cv2 as cvimport numpy as npdef bi_demo(image): #雙邊濾波 dst = cv.bilateralFilter(image, 0, 100, 15) cv.namedWindow("bi_demo", cv.WINDOW_NORMAL) cv.imshow("bi_demo", dst)def shift_demo(image): #均值遷移 dst = cv.pyrMeanShiftFiltering(image, 10, 50) cv.namedWindow("shift_demo", cv.WINDOW_NORMAL) cv.imshow("shift_demo", dst)src = cv.imread(‘E:/imageload/example.png‘)cv.namedWindow(‘input_image‘, cv.WINDOW_NORMAL)cv.imshow(‘input_image‘, src)bi_demo(src)shift_demo(src)cv.waitKey(0)cv.destroyAllWindows()
運行結果:
注意:
1.雙邊濾波(Bilateral filter)是一種非線性濾波方法,是結合映像的空間鄰近度和像素值相似性的一種折中處理,同時考慮空域資訊和灰階相似性,達到保邊去噪的目的。雙邊濾波器顧名思義比高斯濾波多了一個高斯方差sigma-d,它是基於空間分布的高斯濾波函數,所以在邊緣附近,離的較遠的像素不會太多影響到邊緣上的像素值,這樣就保證了邊緣附近像素值的儲存。但是由於儲存了過多的高頻資訊,對於彩色映像裡的高頻雜訊,雙邊濾波器不能夠乾淨的濾掉,只能夠對於低頻資訊進行較好的濾波
2.雙邊濾波函數原型:bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst
src參數表示待處理的輸入映像。
d參數表示在過濾期間使用的每個像素鄰域的直徑。如果輸入d非0,則sigmaSpace由d計算得出,如果sigmaColor沒輸入,則sigmaColor由sigmaSpace計算得出。
sigmaColor參數表示色彩空間的標準方差,一般儘可能大。較大的參數值意味著像素鄰域內較遠的顏色會混合在一起,從而產生更大面積的半相等顏色。
sigmaSpace參數表示座標空間的標準方差(像素單位),一般儘可能小。參數值越大意味著只要它們的顏色足夠接近,越遠的像素都會相互影響。當d > 0時,它指定鄰域大小而不考慮sigmaSpace。 否則,d與sigmaSpace成正比。
雙邊濾波原理:
78837988,77482794 ,https://www.cnblogs.com/qiqibaby/p/5296681.html 反正我是沒怎麼看懂o(╥﹏╥)o
3.均值漂移pyrMeanShiftFiltering函數原型:pyrMeanShiftFiltering(src, sp, sr[, dst[, maxLevel[, termcrit]]]) -> dst
src參數表示輸入映像,8位,三通道映像。
sp參數表示漂移物理空間半徑大小。
sr參數表示 漂移色彩空間半徑大小。
maxLevel參數表示金字塔的最大層數。
termcrit參數表示漂移迭代終止條件。
均值漂移原理:
52705087
51804574
30258833
Python+OpenCV影像處理(七)—— 濾波與模糊操作