cv::Mat 是C++版OpenCV的新結構
.
cvSmooth()
是老版 C API. 沒有把C接口與C + + 結合。
建議你們也可以花一些時間看一下
介紹。
同樣,你如果查看
opencv/modules/imgproc/src/smooth.cpp ,你就會明白cv::boxFilter()和
cvSmooth(CV_BLUR)等價在新的C++ 接口。
Calling
cvSmooth
:
void callCvSmooth(cv::Mat srcmtx, cv::Mat dstmtx, int smooth_type, int param1, int param2, double param3, double param4 ) { IplImage src = srcmtx; IplImage dst = dstmtx; cvSmooth( &src, &dst, smooth_type, param1, param2, param3, param4 ); }
查看cvSmooth
實現 :
CV_IMPL void cvSmooth( const void* srcarr, void* dstarr, int smooth_type, int param1, int param2, double param3, double param4 ) { cv::Mat src = cv::cvarrToMat(srcarr), dst0 = cv::cvarrToMat(dstarr), dst = dst0; CV_Assert( dst.size() == src.size() && (smooth_type == CV_BLUR_NO_SCALE || dst.type() == src.type()) ); if( param2 <= 0 ) param2 = param1; if( smooth_type == CV_BLUR || smooth_type == CV_BLUR_NO_SCALE ) cv::boxFilter( src, dst, dst.depth(), cv::Size(param1, param2), cv::Point(-1,-1), smooth_type == CV_BLUR, cv::BORDER_REPLICATE ); else if( smooth_type == CV_GAUSSIAN ) cv::GaussianBlur( src, dst, cv::Size(param1, param2), param3, param4, cv::BORDER_REPLICATE ); else if( smooth_type == CV_MEDIAN ) cv::medianBlur( src, dst, param1 ); else cv::bilateralFilter( src, dst, param1, param3, param4, cv::BORDER_REPLICATE ); if( dst.data != dst0.data ) CV_Error( CV_StsUnmatchedFormats, "The destination image does not have the proper type" ); }
//以下為
百度百科,供參考。
圖像平滑
void cvSmooth( const CvArr* src, CvArr* dst,
int smoothtype=CV_GAUSSIAN,
int param1=3, int param2=0, double param3=0 ,double param4=0);
src:輸入圖像.
dst:輸出圖像.
smoothtype:平滑方法
平滑方法
. CV_BLUR_NO_SCALE (簡單不帶尺度變換的模糊) - 對每個象素的 param1×param2 領域求和。如果鄰域大小是變化的,可以事先利用函數 cvIntegral 計算積分圖像。
. CV_BLUR (simple blur) - 對每個象素param1×param2鄰域 求和並做尺度變換 1/(param1.param2).
. CV_GAUSSIAN (gaussian blur) - 對
圖像進行核大小為 param1×param2 的高斯卷積
. CV_BILATERAL (雙向濾波) - 應用雙向 3x3 濾波,彩色sigma=param1,空間 sigma=param2. 平滑操作的第一個參數.
param2
平滑操作的第二個參數. 對於簡單/非尺度變換的
高斯模糊的情況,如果param2的值 為零,則表示其被設定為param1。
param3
對應高斯參數的 Gaussian sigma (標准差). 如果為零,則標准差由下面的核尺寸計算:
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 對應水平核,
n=param2 對應垂直核.
對小的卷積核 (3×3 to 7×7) 使用如上公式所示的標准 sigma 速度會快。如果 param3 不為零,而 param1 和 param2 為零,則核大小有 sigma 計算 (以保證足夠精確的操作).
函數 cvSmooth 可使用上面任何一種方法平滑圖像。每一種方法都有自己的特點以及局限。
簡單模糊和
高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮點圖像。這兩種方法可以(in-place)方式處理圖像。
中值和雙向濾波工作於 1- 或 3-通道, 8-位圖像,但是不能以 in-place 方式處理圖像.
中值濾波
中值濾波法是一種非線性平滑技術,它將每一象素點的灰度值設置為該點某鄰域窗口內的所有象素點灰度值的中值。實現方法:
通過從圖像中的某個采樣窗口取出奇數個數據進行排序
用排序后的中值取代要處理的數據即可
中值濾波法對消除椒鹽噪音非常有效,在光學測量條紋圖象的相位分析處理方法中有特殊作用,但在條紋中心分析方法中作用不大。中值濾波在圖像處理中,常用於用來保護邊緣信息,是經典的平滑噪聲的方法
濾波原理
中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性信號處理技術,中值濾波的基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的值,從而消除孤立的噪聲點。方法是去某種結構的二維滑動模板,將板內像素按照像素值的大小進行排序,生成單調上升(或下降)的為二維數據序列。二維
中值濾波輸出為g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分別為原始圖像和處理后圖像。W為二維模板,通常為2*2,3*3區域,也可以是不同的的形狀,如線狀,圓形,十字形,圓環形等。
高斯濾波
介紹
高斯濾波實質上是一種信號的濾波器,其用途是信號的平滑處理,我們知道數字圖像用於后期應用,其噪聲是最大的問題,由於誤差會累計傳遞等原因,很多圖像處理教材會在很早的時候介紹Gauss濾波器,用於得到信噪比SNR較高的圖像(反應真實信號)。於此相關的有Gauss-Laplace變換,其實就是為了得到較好的
圖像邊緣,先對圖像做Gauss平滑濾波,剔除噪聲,然后求二階導矢,用二階導的過零點確定邊緣,在計算時也是頻域乘積=>空域卷積。
濾波器就是建立的一個數學模型,通過這個模型來將圖像數據進行能量轉化,能量低的就排除掉,噪聲就是屬於低能量部分
其實編程運算的話就是一個模板運算,拿圖像的八連通區域來說,中間點的像素值就等於八連通區的像素值的均值,這樣達到平滑的效果
例子
#include <highgui.h>
#include <cv.h>
#define WINDOWNAME1 "window1"
#define WINDOWNAME2 "window2"
#define WINDOWNAME2 "window2"
int main(int argc,char* argv[]){
IplImage * image = cvLoadImage("文件名",CV_LOAD_IMAGE_GRAYSCALE);
IplImage * newimage=cvLoadImage("文件名",CV_LOAD_IMAGE_GRAYSCALE);
cvSmooth(image,newimage,CV_BLUR,3,3,0,0);
IplImage * image = cvLoadImage("文件名",CV_LOAD_IMAGE_GRAYSCALE);
IplImage * newimage=cvLoadImage("文件名",CV_LOAD_IMAGE_GRAYSCALE);
cvSmooth(image,newimage,CV_BLUR,3,3,0,0);
cvNamedWindow(WINDOWNAME1);
cvShowImage(WINDOWNAME1,image);
cvShowImage(WINDOWNAME1,image);
cvNamedWindow(WINDOWNAME2);
cvShowImage(WINDOWNAME2,newimage);
cvShowImage(WINDOWNAME2,newimage);
cvWaitKey(NULL);
cvDestroyAllWindows();
return 0;
}
cvDestroyAllWindows();
return 0;
}