學習OpenCV 09 平滑 模糊處理

2021-09-18 01:22:00 字數 4318 閱讀 2749

平滑(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 模糊是卷積的一種表象 均值濾波 用卷積核中的全體畫素的平均值來代替原來畫素值 中值濾波 將卷積核中的全體畫素從小到大...