平滑(smoothing)也稱模糊(blurring),是一種簡單而又常用的影象處理操作。其目的有很多,但通常是為了減少雜訊(noise)和偽影(camera artifacts)。在降低影象解析度(resolution)時,平滑也是非常重要的。
在闡明平滑操作前,需要闡明幾個概念:
濾波器(filter)指的是一種由一幅影象i(x,y)根據畫素點(x,y)附近的區域計算得到一幅新影象i'(x,y)的演算法。其中模板(template)規定了濾波器的形狀及這個區域內畫素的組成規律。一般認為濾波器(filter)和核(kernel)描述的是同乙個意思,訊號處理領域通常用濾波器,數學領域通常用核。
卷積(convolution),上述濾波操作即i'(x,y)的畫素的值由i(x,y)及其周圍的畫素值加權相加得來,及對於任意形狀的核(比如5×5),需要對核內所有的點i.j做加權,然後相加,對於每一對(i,j),將其點乘原影象中相對於畫素點(x,y)做乙個偏移(i,j)後的畫素點的值後相加,由i(x,y)計算i'(x,y)的過程即為卷積。
錨點(anchor point)定義了核與源影象的對齊關係,即下圖加粗的點。
均值(mean):即數列的平均值。
中值(median):中值(又稱中位數)是指將統計總體當中的各個變數值按大小順序排列起來,形成乙個數列,處於變數數列中間位置的變數值就稱為中位數。中值的優點是不受偏大或偏小資料的影響,很多情況下用它代表全體資料的一般水平更合適。如果數列中存在極端變數值,用中位數做代表值就比平均數更好。
cv::size類,size(width,height)定義範圍大小。
以下是幾種典型的核:(均為線性核,故能用如下表示方法)
a.5×5盒狀盒;b.規範化的5×5盒狀核;c.3×3sobel核;d.5×5規範化高斯核
其中已d高斯核為例,用於計算i'(x,y)的累加項中,乙個項就是(41/273)×i(x,y)的結果,同樣,(26/273)×i(x-1,y)與(26/273)×i(x+1,y)是其中的另外兩項。
經過上述闡述,便可理解卷積的過程可以用下面的方程表示:
opencv提供5種不同的平滑操作,這些操作平滑的結果有著細微的差別。
void cv::blur(
cv::inputarray src, //輸入影象
cv::outputarray dst, //輸出影象
cv::size ksize, //kernel(核)的大小
cv::point anchor=cv::point(-1,-1), //錨點座標
int bordertype=cv::border_default //使用的邊界外推
)
cv::blur()實現簡單模糊,目標影象中的每個值都是源影象中相應位置乙個核(kernel)中畫素的平均值(mean),核的大小尺寸由ksize宣告。anchor指定計算時核與源影象的對齊方式,預設為cv::point(-1,-1),表示核相對於濾波器居中。注:若源影象為多通道影象,則分別對每個通道進行計算。
預備知識中圖a其實即為簡單模糊,而圖b的簡單模糊便是方框型濾波器的一種特殊形式,及規範化方框型濾波器。
方框型濾波器(the box filter)是一種矩形的並且!濾波器中所有值k(i,j)全部相等的濾波器。通常,所有的k為1或1/a,a為核的面積,當取1/a時,及規範化(normalize)。
void cv::boxfilter(
cv::inputarray src, //輸入影象
cv::outputarray dst, //輸出影象
int ddepth, //輸出影象的深度,為-1則與源影象一致
cv::size ksize, //核的大小尺寸
cv::point anchor=cv::point(-1,-1),//錨點座標
bool normalize=true, //如果true,則k=1/a
)
注:簡單模糊與方框型濾波器的區別
簡單模糊必須以規範化呼叫,而方框型濾波器可以非規範化形式呼叫
簡單模糊輸出影象的深度與源影象保持一致,而方框型濾波器輸出影象深度可以控制
中值濾波器將每個畫素替換為圍繞這個畫素的矩形領域內的中值(相對於平均值)或「中值」畫素(相對於平均畫素)。基於預備知識中均值與中值的理解,不難得出,通過平均的簡單模糊或方框型濾波器對雜訊影象,尤其是有較大孤立的異常值非常敏感,少量具有較大偏差的點就會嚴重影響到均值濾波。而中值濾波可以採取中值/中位數的方式來消除異常值。
void cv::medianblur(
cv::inputarray src, //輸入影象
cv::outputarray dst, //輸出影象
cv::size ksize, //核尺寸
);
注:中值濾波器是一種非線性核,無法用方塊圖形式表示。
高斯濾波器應該是最有用的一種濾波器。
void cv::gaussianblur(
cv::inputarray src, //輸入影象
cv::outputarray dst, //輸出影象
cv::size ksize, //核大小
double sigmax, //高斯核在x方向的sigma值
double sigmay=0.0, //高斯核在y方向的sigma值,預設為0表示與x相等
int bordertype=cv::border_default //邊界外擴方式
);
如果sigmax和sigmay都設為0,則高斯引數將根據下列公式確定:
注:opencv實現的高斯平滑還為幾個常用的核心提供效能上的優化。3×3、5×5、7×7的標準sigma核(sigmax=0.0)相對其他核效能更優。
可以把雙邊濾波當作是高斯平滑,只是相似程式更高的畫素權值更高,邊緣更明顯,對比度更高。
雙邊濾波的效果就是將源影象變成一幅水彩畫,這種效果在多次迭代後更加顯著,因此這種方法在影象分割領域十分有用。
void cv::bilateralfilter(
cv::inputarray src, //輸入影象
cv::outputarray dst, //輸出影象
int d, //畫素鄰域的直徑
double sigmacolor, //顏色空間濾波器的sigma值
double sigmaspace, //座標空間濾波器的sigma值
int bordertype=cv::border_default //邊界外擴方式
);
其中顏色空間濾波器的sigmacolor值與高斯濾波器中的sigma類似,該值越大,則平滑時所包括的強度(色彩)越大,則影象的不連續性將會更顯著。小的sigmaspace值比如10會帶來乙個輕微的但也明顯的效果,而大的sigmaspace值比如150會對影象產生非常顯著的影響,使影象有種**的效果。
OpenCV學習之平滑(模糊)
void boxfilter inputarray src,outputarray dst,int ddepth,size ksize,point anchor point 1,1 意味著定位畫素是核的中心 bool normalize true int bordertype border defa...
學習OpenCV 羽化(模糊邊緣)
原文出處 在photoshop裡,羽化就是使你選定範圍的圖邊緣達到朦朧的效果。羽化值越大,朦朧範圍越寬,羽化值越小,朦朧範圍越窄。可根據你想留下圖的大小來調節。演算法分析 1 通過對rgb值增加額外的v值實現朦朧效果 2 通過控制v值的大小實現範圍控制。3 v 255 當前點point距中點距離的平...
OpenCV學習筆記 模糊操作
模糊操作的作用是在時減低雜訊。模糊操作有均值模糊,中值模糊,高斯模糊和自定義模糊 模糊操作的基本原理 1 基於離散卷積 2 定義好每乙個卷積核 3 不同的卷積核得到不同的卷積效果 4 模糊是卷積的一種表象 均值濾波 用卷積核中的全體畫素的平均值來代替原來畫素值 中值濾波 將卷積核中的全體畫素從小到大...