opencv學習筆記7——影象處理濾波
阿新 • • 發佈:2018-12-26
一、方框濾波
二、均值濾波
三、高斯濾波
四、中值濾波
五、雙邊濾波
程式碼:
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
Mat g_srcImage, g_dstImage1, g_dstImage2, g_dstImage3,g_dstImage4,g_dstImage5;
int g_nBoxFilterValue = 3, g_nMeanBlurValue = 3, g_nGaussianBlurValue = 3,g_nMedianBlurValue=10,g_nBilateraFilterValue=10;
//軌跡條的回撥函式
static void on_BoxFilter(int, void *)
{
boxFilter(g_srcImage, g_dstImage1, -1, Size(g_nBoxFilterValue + 1, g_nBoxFilterValue + 1));
imshow("<1>方框濾波", g_dstImage1);
}
static void on_MeanBlur(int, void*)
{
blur(g_srcImage, g_dstImage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1),Point(-1,-1));
imshow("<2>均值濾波", g_dstImage2);
}
static void on_GaussianBlur(int, void *)
{
GaussianBlur(g_srcImage, g_dstImage3, Size(g_nGaussianBlurValue * 2 + 1, g_nGaussianBlurValue * 2 + 1),0,0);
imshow("<3>高斯濾波", g_dstImage3);
}
static void on_MedianBlur(int,void*)
{
medianBlur(g_srcImage, g_dstImage4, g_nMedianBlurValue * 2 + 1);
imshow("<4>中值濾波", g_dstImage4);
}
static void on_BilateralFilter(int, void*)
{
bilateralFilter(g_srcImage, g_dstImage5,
g_nBilateraFilterValue, g_nBilateraFilterValue * 2, g_nBilateraFilterValue / 2);
imshow("<5>雙邊濾波", g_dstImage5);
}
int main()
{
system("color5E");
g_srcImage = imread("lena.jpg", 1);
if (!g_srcImage.data)
{
cout << "讀取源圖片失敗\n";
return false;
}
g_dstImage1 = g_srcImage.clone();
g_dstImage2 = g_srcImage.clone();
g_dstImage3 = g_srcImage.clone();
namedWindow("<0>原圖視窗", 1);
imshow("<0>原圖視窗", g_srcImage);
//方框濾波,建立軌跡條
namedWindow("<1>方框濾波", 1);
createTrackbar("核心值:", "<1>方框濾波", &g_nBoxFilterValue, 40, on_BoxFilter);
on_BoxFilter(g_nBoxFilterValue, 0);
//均值濾波
namedWindow("<2>均值濾波", 1);
createTrackbar("核心值:", "<2>均值濾波", &g_nMeanBlurValue, 40, on_MeanBlur);
on_MeanBlur(g_nMeanBlurValue, 0);
//高斯濾波
namedWindow("<3>高斯濾波", 1);
createTrackbar("核心值:", "<3>高斯濾波", &g_nGaussianBlurValue, 40, on_GaussianBlur);
on_GaussianBlur(g_nGaussianBlurValue, 0);
//中值濾波
namedWindow("<4>中值濾波", 1);
createTrackbar("核心值:", "<4>中值濾波", &g_nMedianBlurValue, 50, on_MedianBlur);
on_MedianBlur(g_nMedianBlurValue, 0);
//雙邊濾波
namedWindow("<5>雙邊濾波", 1);
createTrackbar("核心值:", "<5>雙邊濾波", &g_nBilateraFilterValue, 50, on_BilateralFilter);
on_BilateralFilter(g_nBilateraFilterValue, 0);
cout << "請調整滾動條檢視影象效果\n按下q鍵程式退出\n";
while (char(waitKey(1))!='q'){}
return 0;
}
執行效果:
三個線性看起來區別不大,不過跟非線性濾波比起來還是有一定區別的。
注意建立軌跡條之後要執行相應的函式。