对Opencv2.4.13支持的滤波器操作进行整理,首先需要阅读一下它的支持文件https://docs.opencv.org/2.4.13.6/#,里面会有最全面的内容。
这是老版本2.3.2的内容参考,内容不是很全,比较老,很多东西都没有,但是是中文教程,容易入门看,链接在下面
准备是整理一下Opencv2.4.13.6所能提供的滤波操作
(一)BaseFilte
(二)BaseRowFilter
(三)图像滤波核心引擎 FilterEngine
Opencv2.4.13.6所提供的滤波核心引擎 FilterEngine在steven_xiu的博客下有比较详细的分析,https://www.cnblogs.com/stevenxiu/p/5591423.html
(四)双边滤波器 bilateralFilter
先贴一下常见的几种滤波操作的实现方法。
(1)均值平滑
采用线性的方法,平均整个窗口范围内的像素值,将像素用领域像素均值代替。均值滤波对高斯噪声表现较好,对椒盐噪声表现较差。
(2)高斯平滑
最有用的滤波器 ,平时用的比较多的, 高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。
(3)中值平滑
中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的 中值代替 。采用非线性的方法,它在平滑脉冲噪声方面非常有效。
(4)双边平滑
保边滤波器中常见的一种,可以一定程度地避免破坏对图像边缘的破坏,图像边缘细节较多且边缘作用较大时推荐使用。
双边滤波器的原理见此http://www.cnblogs.com/Imageshop/p/3406823.html
%滤波操作的源代码,亲测可用,感谢Ana Huamán
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace std;
using namespace cv;
/// 全局变量
int DELAY_CAPTION = 1500;
int DELAY_BLUR = 100;
int MAX_KERNEL_LENGTH = 31;
Mat src; Mat dst;
char window_name[] = "Filter Demo 1";
/// 函数申明
int display_caption(char* caption);
int display_dst(int delay);
/**
* main 函数
*/
int main(int argc, char** argv)
{
namedWindow(window_name, CV_WINDOW_AUTOSIZE);
/// 载入原图像
src = imread("3.bmp", 1); //图片在工程目录下,要么就放完整路径
if (display_caption("Original Image") != 0) { return 0; }
dst = src.clone();
if (display_dst(DELAY_CAPTION) != 0) { return 0; }
/// 使用 均值平滑
if (display_caption("Homogeneous Blur") != 0) { return 0; }
for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
{
blur(src, dst, Size(i, i), Point(-1, -1));
if (display_dst(DELAY_BLUR) != 0) { return 0; }
}
/// 使用高斯平滑
if (display_caption("Gaussian Blur") != 0) { return 0; }
for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
{
GaussianBlur(src, dst, Size(i, i), 0, 0);
if (display_dst(DELAY_BLUR) != 0) { return 0; }
}
/// 使用中值平滑
if (display_caption("Median Blur") != 0) { return 0; }
for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
{
medianBlur(src, dst, i);
if (display_dst(DELAY_BLUR) != 0) { return 0; }
}
/// 使用双边平滑
if (display_caption("Bilateral Blur") != 0) { return 0; }
for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
{
bilateralFilter(src, dst, i, i * 2, i / 2);
if (display_dst(DELAY_BLUR) != 0) { return 0; }
}
/// 等待用户输入
display_caption("End: Press a key!");
waitKey(0);
return 0;
}
int display_caption(char* caption)
{
dst = Mat::zeros(src.size(), src.type());
putText(dst, caption,
Point(src.cols / 4, src.rows / 2),
CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255));
imshow(window_name, dst);
int c = waitKey(DELAY_CAPTION);
if (c >= 0) { return -1; }
return 0;
}
int display_dst(int delay)
{
imshow(window_name, dst);
int c = waitKey(delay);
if (c >= 0) { return -1; }
return 0;
}