濾波實際上是信號處理裏的一個概念,而圖像本身也可以看成是一個二維的信號。
其中像素點灰度值的高低代表信號的強弱。
高頻:圖像中灰度變化劇烈的點。
低頻:圖像中平坦的,灰度變化不大的點。
根據圖像的高頻與低頻的特徵,我們可以設計相應的高通與低通濾波器。
- 高通濾波:可以檢測圖像中尖銳、變化明顯的地方(銳化圖像)
- 低通濾波:可以讓圖像變得光滑,濾除圖像中的噪聲(平滑圖像)
線性濾波
均值模糊
不能很好的保留圖像的細節。
dst = cv.blur(src, ksize)
ksize - 用於平滑操作的核的大小。
(1, 15)水平模糊, 1*15的矩陣
(15, 1)垂直模糊
dst = cv.blur(image, (30, 1))
blur()平滑圖像的函數,它用一個點鄰域內像素的平均灰度值來代替該點的灰度
平滑模糊、高斯模糊這兩個濾波器,都是鄰域內的像素按照一個權重相加,最後設置爲當前點的灰度值,這種操作又稱爲卷積。
這樣的濾波器叫線性濾波器,另外還有一種非線性的濾波器,比如中值濾波器,它是取鄰域內所有像素的中值作爲當前點的灰度值。
高斯模糊
高斯濾波是指用高斯函數作爲濾波函數的濾波操作,高斯模糊就是高斯低通。越靠近該像素的點提供越高的權重,計算平均值作爲插值。
ksize高斯內核的大小,其中ksize.height和size.width可以不同,但是必須爲正數&&奇數,或者是0(由sigma計算而來)
double類型的sigmaX,表示高斯核函數在X軸方向的標準偏差。
double類型的sigmaY,表示高斯核函數在Y軸方向的標準偏差。
若爲0則設爲sigmaX;兩者都爲0則由ksize.height和size.width計算出來。
高斯隨機噪聲圖片:
numpy.random.normal(loc=0.0, scale=1.0, size=None)
loc:float此概率分佈的均值(對應着整個分佈的中心centre)
scale:float此概率分佈的標準差(對應於分佈的寬度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
非線性濾波
中值濾波
https://blog.csdn.net/weixin_37720172/article/details/72627543
取鄰域內所有像素的中值作爲當前點的灰度值。
可用於去掉椒鹽噪聲,脈衝噪聲,又能保留圖像的邊緣細節。
(花費時間是均值濾波的五倍以上)對細節(細、尖頂)很多的圖像不太合適。
dst = cv.medianBlur(image, 5)
ksize參數表示濾波窗口尺寸,必須是奇數並且大於1。比如這裏是5,中值濾波器就會使用5×5的範圍來計算,即對像素的中心值及其5×5鄰域組成了一個數值集,對其進行處理計算,當前像素被其中值替換掉。
雙邊濾波
Bilateral filter結合圖像的空間鄰近度和像素值相似度的一種折中處理,同時考慮空域信息和灰度相似性。
- edge preserving
比高斯濾波多了一個高斯方差sigma-d
邊緣保留濾波Edge Preserving Filter
高斯雙邊
差異很大,就是顯著特徵,會被平滑掉
雙邊濾波函數
可以在保證邊界清晰的情況下,有效的去掉噪聲。考慮了圖像空間關係,也考慮了灰度關係。雙邊濾波同時使用了空間高斯權重、灰度相似性高斯權重,確保了邊界不會被模糊掉。
cv2.bilateralFilter(img,d,’p1’,’p2’)
d是領域的直徑,
空間高斯函數標準差
灰度值相似性高斯函數標準差
用戶自定義模糊
dst = cv.filter2D(src, ddepth, kernel)
ddepth
表示目標圖像深度,輸入值爲-1時,目標圖像和原圖像深度保持一致
kernel
卷積核(或者是相關核),一個單通道浮點型矩陣。修改kernel矩陣即可實現不同的模糊。
https://www.cnblogs.com/hihilary/archive/2012/11/27/2777973.html
通道表示每個點能存放多少個數,類似於BGR彩色圖中的每個像素點有三個值,即三通道的。
圖片中的深度表示每個值由多少位來存儲,是一個精度問題,一般圖片是8bit(位)的,則深度是8。
def customer_blur_demo(image):
# kernel = np.ones([5, 5], np.float32)/25
# [0, -1, 0], [-1, 5, -1], [0, -1, 0]
# [1, 1, 1], [1, 1, 1], [1, 1, 1]/9
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
dst = cv.filter2D(image, -1, kernel)
cv.imshow("customer_blur", dst)