從本篇開始採用opencv3.2版本進行編譯!!!
均值濾波是一種典型的線性濾波算法,主要是利用像素點鄰域的像素值來計算像素點的值。其具體方法是首先給出一個濾波模板kernel,該模板將覆蓋像素點周圍的其他鄰域像素點,去掉像素本身,將其鄰域像素點相加然後取平均值即爲該像素點的新的像素值,這就是均值濾波的本質。官方給出的kernel模板如下:
opencv提供了blur函數實現均值濾波操作,其原型如下:
C++: void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
參數解釋:
. InputArray src: 輸入圖像,可以是Mat類型,圖像深度是CV_8U、CV_16U、CV_16S、CV_32F以及CV_64F其中的某一個。
. OutputArray dst: 輸出圖像,深度和類型與輸入圖像一致
. Size ksize: 濾波模板kernel的尺寸,一般使用Size(w, h)來指定,如Size(3,3)
. Point anchor=Point(-1, -1): 字面意思是錨點,也就是處理的像素位於kernel的什麼位置,默認值爲(-1, -1)即位於kernel中心點,如果沒有特殊需要則不需要更改
. int borderType=BORDER_DEFAULT: 用於推斷圖像外部像素的某種邊界模式,有默認值BORDER_DEFAULT
示例代碼如下,依舊採用滑動條來控制kernel尺寸
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;
//定義全局變量
Mat g_srcImage; //定義輸入圖像
Mat g_dstImage; //定義目標圖像
const int g_nTrackbarMaxValue = 9; //定義軌跡條最大值
int g_nTrackbarValue; //定義軌跡條初始值
int g_nKernelValue; //定義kernel尺寸
void on_kernelTrackbar(int, void*); //定義回調函數
int main()
{
g_srcImage = imread("lena.jpg");
//判斷圖像是否加載成功
if(g_srcImage.empty())
{
cout << "圖像加載失敗!" << endl;
return -1;
}
else
cout << "圖像加載成功!" << endl << endl;
namedWindow("原圖像",WINDOW_AUTOSIZE); //定義窗口顯示屬性
imshow("原圖像",g_srcImage);
g_nTrackbarValue = 1;
namedWindow("均值濾波", WINDOW_AUTOSIZE); //定義濾波後圖像顯示窗口屬性
//定義軌跡條名稱和最大值
char kernelName[20];
sprintf(kernelName, "kernel尺寸 %d", g_nTrackbarMaxValue);
//創建軌跡條
createTrackbar(kernelName, "均值濾波", &g_nTrackbarValue, g_nTrackbarMaxValue, on_kernelTrackbar);
on_kernelTrackbar(g_nTrackbarValue, 0);
waitKey(0);
return 0;
}
void on_kernelTrackbar(int, void*)
{
//根據輸入值重新計算kernel尺寸
g_nKernelValue = g_nTrackbarValue * 2 + 1;
//均值濾波函數
blur(g_srcImage, g_dstImage, Size(g_nKernelValue, g_nKernelValue));
imshow("均值濾波", g_dstImage);
}
運行結果如下: