前言
上一篇文章,我們講解了映像的虛擬邊緣,這篇文章開始進行平滑(也就是模糊)處理。
基本原理
這裡直接引用OpenCV 2.4+ C++ 平滑處理和OpenCV 2.4+ C++ 邊緣梯度計算的相關內容:
平滑也稱模糊, 是 一項簡單且使用頻率很高的影像處理方法。
平滑處理時需要用到一個濾波器。 最常用的濾波器是線性濾波器,線性 濾波處理的輸出像素值(例如:g(i,j))是輸入像素值(例如:f(i+k,j+l))的加權平均:
g(i,j) = sum_{k,l} f (i+k, j+l) h(k,l)
h(k,l)稱為核, 它僅僅是一個加權係數。
這裡涉及一種叫做“卷積”的運算,那麼卷積 是什麼呢?
卷積是在每一個映像塊與某個運算元(核)之間進行的運算。
核?!
核就是一個固定大小 的數值數組。該數組帶有一個錨點 ,一般位於數組中央。
kernel example
可是這怎麼運算啊?
假 如你想得到映像的某個特定位置的卷積值,可用下列方法計算:
將核的錨點放在該特定位置的像素上,同時,核內 的其他值與該像素鄰域的各像素重合;
將核內各值與相應像素值相乘,並將乘積相加;
將所得結果放到與錨點對應的 像素上;
對映像所有像素重複上述過程。
用公式表示上述過程如下:
H(x,y) = sum_{i=0}^{M_{i} - 1} sum_{j=0}^{M_{j}-1} I(x+i - a_{i}, y + j - a_{j})K(i,j)
在映像邊緣的卷積怎麼辦呢?
計算卷積前, 需要通過複製源映像的邊界建立虛擬像素,這樣邊緣的地方也有足夠像素計算卷積了。這就是為什麼上一篇文章需要做虛擬 邊緣函數。
均值平滑
均值平滑實際上就是核心元素全是1的卷積運算,然後再除以核心的大小,用數學表達 式來表示就是:
texttt{K} = frac{1}{texttt{ksize.width*ksize.height}} begin{bmatrix} 1 & 1 & 1 & cdots & 1 & 1 1 & 1 & 1 & cdots & 1 & 1 hdotsfor{6} 1 & 1 & 1 & cdots & 1 & 1 end{bmatrix}