目录
简介
- 滤波实际上是信号处理的一个概念,图像可以看成一个二维信号,其中像素点灰度值的高低代表信号的强弱
- 高频:图像中变化剧烈的部分
- 低频:图像中变化缓慢,平坦的部分
- 根据图像高低频特性,设置高通和低通滤波器。高通滤波可以检测图像中尖锐变化明显的地方,低通滤波可以让图像变得平滑,消除噪声干扰
- 图像滤波是OpenCV图像处理的重要部分,在图像预处理方面应用广泛, 图像滤波的好坏决定着后续处理的结果好坏
- 图像滤波函数方法:
- 线性滤波:方框滤波、均值滤波、高斯滤波
- 非线性滤波:中值滤波、双边滤波
综述:低通滤波(图像平滑去噪),高通滤波(边缘检测)
相关概念
- 邻域算子:利用给定像素周围的像素值决定此像素的最终输出值的一种算子
- 线性滤波:一种常用的邻域算子,像素输出取决于输入像素的加权和
图像卷积
//图像卷积
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
//待卷积矩阵
uchar points[25] = { 1,2,3,4,5,
6,7,8,9,10,
11,12,13,14,15,
16,17,18,19,20,
21,22,23,24,25 };
Mat img(5,5,CV_8UC1,points);//定义一个图像矩阵
//卷积模板
Mat kernel = (Mat_<float>(3,3) << 1,2,1,
2,0,2,
1,2,1);
//卷积模板归一化
Mat kernel_norm = kernel / 12;
//未归一化结果和归一化结果
Mat result, result_norm;
filter2D(img, result, CV_32F, kernel, Point(-1,-1),2,BORDER_CONSTANT);
filter2D(img, result_norm, CV_32F, kernel_norm, Point(-1, -1), 2, BORDER_CONSTANT);
cout << "result:" << endl << result << endl;
cout << "result_norm :" << endl << result_norm << endl;
Mat lena = imread("C:/imageprocess/image/lena.jpg");
if (!lena.data) {
std::cout << "can not load image..." << std::endl;
return -1;
}
imshow("原图", lena);
Mat lena_filter;
//api juanji
filter2D(lena, lena_filter, -1, kernel_norm, Point(-1, -1), 2, BORDER_CONSTANT);
imshow("lena_filter", lena_filter);
waitKey(0);
waitKey(0);
return 0;
}
滤波代码示例
- 方框滤波:当normalize为true时,方框滤波也就成了均值滤波。也就是说均值滤波是方框滤波归一化后的特殊情况。归一化就是将要处理的量缩放到一定范围﹐比如(0,1)
- 均值滤波:即方框滤波归一化特例,就是用邻域内像素均值来代替该点像素值﹐均值滤波在去噪的同时也破坏了图像细节部分
- 高斯滤波器被称为最有用的滤波器,每个像素点都是由本身和邻域内的其他像素值经过加权平均后得到的,加权系数越靠近中心越大,越远离中心越小,能够很好的滤除噪声---推荐
- 中值滤波是一种非线性滤波,是用像素点邻域灰度值的中值代替该点的灰度值,可以去除脉冲噪声和椒盐噪声---推荐
- 双边滤波是一种非线性滤波,是结合图像空间邻近度和像素值相似度的一种折中处理,尽量在去噪同时保存边缘
#include "opencv2/opencv.hpp"
using namespace cv;
void main()
{
Mat srcImg = imread("b.jpg");
Mat dstImg;
Size size0 = Size(5, 5);
//boxFilter(srcImg, dstImg, -1, Size(5, 5), Point(-1, -1), true); //方框滤波器,有默认算子
//blur(srcImg, dstImg, size0); //均值滤波,方框滤波的特例,均一化的方框滤波
//GaussianBlur(srcImg, dstImg, size0, 1);//高斯滤波
medianBlur(srcImg, dstImg, 5); //中值滤波
//bilateralFilter(srcImg, dstImg, 5, 10.0, 2.0); //双边滤波
imshow("src", srcImg);
imshow("dst", dstImg);
waitKey(0);
}