卷積
1、表達式
卷積是一種數學算子。表達式爲:
以上是一維卷積,而在圖像處理中,我們常用二維卷積。表達式爲:
(其中,g稱爲濾波器,一般爲3*3矩陣)
2、計算方法
讓濾波器g(x,y)
左右上下翻轉,得到g(-x,-y)
,然後從左到右、從上到下掃過原始數據。**讓濾波器的每行每列與原始數據對應的每行每列做乘積並求和。**得到的數即爲卷積結果,將其放於一個新的表中。
g(x,y)
翻轉的原因是爲了滿足在與“1”數組相乘時,得到原濾波器。
如上圖(轉載自謝小小XH),左邊的二維數組稱爲原始數據,右邊的二維數組成爲濾波器,所做的卷積操作實際上就是7*1+8*1+9*2+……+24*1+25*1=314
。對於圖像處理來說,卷積的實質就是對像素的處理。
3、爲什麼要引入卷積
卷積可以對某塊圖像進行突出化的處理。從仿生的角度上來講,正如人類盯着某一個物體看的時候,這個物體之外的東西或多或少都會被我們忽略(即虛化)。而濾波器就相當於一個權重分配的取值表(類似於我們盯着的那個物品的形狀),當原始數據(類似於我們眼睛接受到的全部光線)經過濾波器的卷積後,我們關心的部分就會被突出,而其他部分會被忽略或減弱!
例如,我們關心老鼠的背部,那麼濾波器會被設定爲老鼠背部的權重大,其他部分權重小。
那麼當濾波器移動到老鼠背部的時候,所得最終結果的值將較大:
當濾波器移動到其他部分(如頭部)時,所得結果的值較小:
以上圖例來自於https://blog.csdn.net/cufewxy1/article/details/80485886?utm_source=app該博客很好的講述了CNN和卷積的基本概念。
平滑濾波
平滑濾波的主要作用是消除噪聲,其實質是採用卷積操作,對原始圖像進行處理。我學習的平滑濾波主要有三種:平均濾波、高斯濾波、中值濾波。
1、四領域與八領域
排除中間像素點後的上、下、左、右四個像素點稱爲四領域。
排除中間像素點後的其他八個像素點稱爲八領域。
2、平均濾波
在一個小區域內(通常3*3)像素值平均。公式:
平均濾波使圖像邊緣也被平均化,導致圖像細節受損,圖像變模糊。
3、高斯濾波
在一個小區域內(通常3*3)像素值加權平均,稱爲“加權平均濾波”。公式:
而形如上右的濾波器又被稱爲高斯濾波器。高斯濾波器還可以被拓展爲雙邊濾波器:
高斯濾波既能消除噪聲有保留了圖像的細節,最爲常用。
4、中值濾波
確定窗口後按灰度大小對像素進行排序,取灰度中位數對應的像素值代替原窗口中心的像素值。選擇窗口的方法很多樣——如:四鄰域、八鄰域、T字型等。
能很好的消除孤立噪聲,特別是胡椒狀噪點。
數學形態學濾波
與卷積對應的平滑濾波不同,數學形態學濾波主要是通過幾何操作來進行濾波的。其包含兩種最基本操作:膨脹和腐蝕。腐蝕和膨脹都會使圖像出現一定的顆粒化。
膨脹指的是對於所有A的元素按B中元素相對位置變化的方式進行平移,然後取並集。
腐蝕指的是對於所有A的元素按B中元素相對位置逆變化的方式進行平移,然後取交集。
如上圖,第二張圖就是將第一張圖經過膨脹變換得到的,實質是黑的區域的擴張和白的區域的減少;
第三張圖是第一張圖經過腐蝕變換得到的,實質是黑的區域的減少和白的區域的擴張。
除了膨脹與腐蝕,數學形態學濾波還有開閉運算。
利用OpenCV實現圖像平滑濾波
1、相關函數
dst = cv2.blur(src, ksize) #平均濾波
dst = cv2.GaussianBlur(src, ksize,sigmaX) #高斯濾波
dst = cv2.medianBlur(src, ksize) #中值濾波
#src:原始圖像
#ksize:濾波器大小
其中,ksize
常用(3,3)
或(5,5)
大小的濾波器。
dst = cv2.bilateralFilter(src, d, sigemaColor, sigmaSpace) #雙邊濾波
#src:原始圖像
#d:過濾期間使用的各像素領域的直徑
#sigmaColor:色彩空間的sigma參數,常取150~200
#sigmaSpace:做表空間的sigma參數,常取150~200
2、代碼
import cv2
import numpy as np
def gauss_noise(image, mean=0, var=0.001):
"""
添加高斯噪聲
mean : 均值
var : 方差
"""
image = np.array(img/255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape)
out = image + noise
if out.min() < 0:
low_clip = -1
else:
low_clip = 0
out = np.clip(out, low_clip, 1.0)
out = np.uint8(out*255)
cv2.imshow("Gauss", out)
return out
filename = r"e:\lena.jpg"
img = cv2.imread(filename)
img = gauss_noise(img) #插入高斯噪聲
blur = cv2.blur(img, (5,5))
gauss = cv2.GaussianBlur(img, (5,5), 0)
median = cv2.medianBlur(img, 5)
bilateral = cv2.bilateralFilter(img, 5, 150, 150)
cv2.imshow('Image', blur)
cv2.imshow('Blurred', blur)
cv2.imshow('Gauss', blur)
cv2.imshow('Median filtered', median)
cv2.imshow('Bilateral filtered', bilateral)
cv2.waitKey()
cv2.destroyAllWindows()
感謝CSDN免費開課一學即懂的計算機視覺(第一季),感謝屈楨深老師的講解。本文部分圖片及代碼均取自於以上課程。