1. 程式人生 > >opencv-影象增強

opencv-影象增強

影象線性變換

Mat src,dst;
src.convertTo(dst,0,alpha,beta);

函式原型:
void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 )
rtype:變換型別,不知道有幾個待選引數
變換公式:dst=src*alpha+beta
alpha改變對比度,beta改變亮度

影象濾波

平滑濾波處理,也叫模糊處理
opencv提供5個常用影象平滑處理操作方法

  • 方框濾波——BoxBlur函式
  • 均值濾波(鄰域平均濾波)——Blur函式
  • 高斯濾波——GaussianBlur函式
  • 中值濾波——medianBlur函式
  • 雙邊濾波——bilateralFilter函式

方框濾波

CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor = Point(-1,-1),
                             bool normalize = true,
                             int borderType = BORDER_DEFAULT );
第一個引數:原影象
第二個引數:輸出影象
第三個引數:輸出影象深度,-1
代表原圖深度 第四個引數:核心大小,用Size(w,h)表示,w為畫素寬度,h為像高度 第五個引數:Point型別的anchor,表示錨點(即被平滑的那個點)。預設值是核的中心為錨點 第六個引數:預設值true,表示核心是否被其區域歸一化了 第七個引數,int型別的borderType,用於推斷影象外部畫素的某種邊界模式,有預設值BORDER_DEFAULT

方框濾波器所用核心為:
K=a111111111
a={1ksize.widthksize.heightnormalize=true1normalize=false

均值濾波

CV_EXPORTS_W void
blur( InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT ); 第一個引數:輸入影象 第二個引數:輸出影象 第三個引數:核心大小 第四個引數:錨點,平滑點 第五個引數:邊界型別,同上

均值濾波核心:
K=1ksize.widthksize.height111111111
缺陷:不能很好的保護影象細節,去除噪聲的同時也破壞了影象的細節部分。

高斯濾波

CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );
第一個引數:輸入影象
第二個引數:輸出影象
第三個引數:核心大小
第四個引數:高斯核函式X方向的標準偏差
第五個引數:高斯核函式Y方向的標準偏差
第六個引數:邊界型別,通常取預設值

從數學角度看,高斯模糊過程就是影象與正態分佈做卷積。

中值濾波


中值濾波是非線性濾波器,其 基本思想是用畫素點鄰域灰度值的中值來代替該畫素點的灰度值,該方法在去除脈衝噪聲、椒鹽噪聲的同時又能保留影象的邊緣細節。
CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
相對簡單,不解釋

雙邊濾波

它是結合影象的空間林精度和畫素值相似度的一種折中處理,同時考慮空域資訊和灰度相似性,達到保邊去噪的目的,具有簡單,非迭代,區域性的特點。

CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType = BORDER_DEFAULT );
第一個引數:輸入影象
第二個引數:輸出影象
第三個引數:表示在過濾過程中每個畫素領域的直徑。如果這個引數設為非正數,那麼他會用第五個引數sigmaSpace來計算出它
第四個引數:顏色空間濾波器的sigma值。這個引數的值越大,表明該畫素鄰域內有越寬廣的顏色會被混合到一起,產生較大半徑顏色相等區域
第五個引數:座標空間中濾波器的sigma值,座標空間的標註方差,它的數值越大,意味著越遠的畫素會相互影響,從而使更大的區域中足夠相似的顏色獲取相同的顏色。
第六個引數:常用預設值

銳化空間濾波

銳化的作用是加強影象的邊緣和輪廓,通常也成為高通濾波器
模板一般為中心為正,外圍為負值。
使用filter2D函式來對影象濾波,使用不同的kernel,會得到不同的效果。

CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,
                            InputArray kernel, Point anchor = Point(-1,-1),
                            double delta = 0, int borderType = BORDER_DEFAULT );
第一個引數:輸入影象
第二個引數:輸出影象
第三個引數:輸出影象深度
第四個引數:使用的核心,型別為Mat
第五個引數:錨點,預設是核的中心點
第六個引數:邊界型別,預設值。
使用注意事項:
(1)卷積核不能大於11*112)卷積核的型別需是有符號的,卷積核的型別通常設為CV_32F,輸出影象深度也設為CV_32F,之後再把影象轉回CV_8UC。
卷積核構造
Mat kernel(3,3,CV_32F,Scalar(-1));
kernel.at<float>(1,1)=8;
這樣就構造了一個拉普拉斯運算元