opencv學習(十五)方框濾波boxfilter()//均值濾波blur()//高斯濾波GaussianBlur()(可以此回顧滑動條操作)
阿新 • • 發佈:2019-02-12
opencv原始碼剖析詳見參考書160-165,待深入理解
常用濾波概念
影象濾波過程
1,方框濾波boxfilter()
2,均值濾波blur()
3,高斯濾波GassianBlur()
綜合例項
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//全域性變數宣告
Mat g_srcimage, g_dstimage1, g_dstimage2, g_dstimage3;
int g_nBoxFliterValue = 3 ;//方框,均值,高斯濾波引數值
int g_nMeanBlurValue = 3;
int g_nGaussianBlurValue = 3;
//軌跡條的回撥函式
static void on_BoxFliter(int, void*);
static void on_MeanBlur(int, void*);
static void on_GaussianBlur(int, void*);
//主函式
int main()
{
system("color5E");
g_srcimage = imread("D://1.jpg", 1);
if (!g_srcimage.data) { printf ("錯錯錯\n"); return false; }
g_dstimage1 = g_srcimage.clone();
g_dstimage2 = g_srcimage.clone();
g_dstimage3 = g_srcimage.clone();
//顯示原圖
namedWindow("原圖視窗", 1);
imshow("原圖視窗", g_srcimage);
//1方框濾波
namedWindow("方框濾波", 1);
createTrackbar("核心值:","方框濾波",&g_nBoxFliterValue,40 ,on_BoxFliter);
on_BoxFliter(g_nBoxFliterValue, 0);
//2均值濾波
namedWindow("均值濾波", 1);
createTrackbar("核心值:", "均值濾波", &g_nMeanBlurValue, 40, on_MeanBlur);
on_MeanBlur(g_nMeanBlurValue, 0);
imshow("均值濾波", g_dstimage2);
//3高斯濾波
namedWindow("高斯濾波", 1);
createTrackbar("核心值:", "高斯濾波", &g_nGaussianBlurValue, 40, on_GaussianBlur);
on_GaussianBlur(g_nGaussianBlurValue, 0);
imshow("高斯濾波", g_dstimage3);
//輸出提示資訊
cout << endl << "滑動滾動條觀察影象效果\n\n"
<< "按下q鍵退出";
while (char(waitKey(1)) != 'q') {}
return 0;
}
//BoxFliter,blur,GassianBlur函式定義
static void on_BoxFliter(int, void*)
{
boxFilter(g_srcimage, g_dstimage1, -1, Size(g_nBoxFliterValue + 1, g_nBoxFliterValue + 1));
imshow("方框濾波", g_dstimage1);//與上面的2,3,對比發現,只有將imshow函式置於此才能拖動滑動條改變核心值(2,3預設展示了濾波核心的初始值,無法隨滑動條改變而改變)
}
static void on_MeanBlur(int, void*)
{
blur(g_srcimage, g_dstimage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1),Point(-1,-1));
}
static void on_GaussianBlur(int, void*)
{
GaussianBlur(g_srcimage, g_dstimage3, Size(g_nGaussianBlurValue*2 + 1, g_nGaussianBlurValue*2+ 1),0,0);
}