opencv-影象增強
阿新 • • 發佈:2019-01-31
影象線性變換
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
方框濾波器所用核心為:
均值濾波
CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
Size ksize, Point anchor = Point(-1,-1),
int borderType = BORDER_DEFAULT );
第一個引數:輸入影象
第二個引數:輸出影象
第三個引數:核心大小
第四個引數:錨點,平滑點
第五個引數:邊界型別,同上
均值濾波核心:
缺陷:不能很好的保護影象細節,去除噪聲的同時也破壞了影象的細節部分。
高斯濾波
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*11
(2)卷積核的型別需是有符號的,卷積核的型別通常設為CV_32F,輸出影象深度也設為CV_32F,之後再把影象轉回CV_8UC。
卷積核構造
Mat kernel(3,3,CV_32F,Scalar(-1));
kernel.at<float>(1,1)=8;
這樣就構造了一個拉普拉斯運算元