1. 程式人生 > >opencv學習筆記7——影象處理濾波

opencv學習筆記7——影象處理濾波

一、方框濾波

二、均值濾波


三、高斯濾波


四、中值濾波


五、雙邊濾波


程式碼:

#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; }

執行效果:


三個線性看起來區別不大,不過跟非線性濾波比起來還是有一定區別的。

注意建立軌跡條之後要執行相應的函式。