图像线性滤波:
- 图像滤波:指尽量在保存图像细节特征的条件下对目标图像的噪声进行抑制。
- 图像滤波的目的:一是抽出对象的特征作为图像识别的特征模式;二是消除图像中混入的噪声。
- 图像滤波的要求:一是不能损坏图像的轮廓及边缘等重要信息;二是使图像清晰视觉效果好。
- 滤波和模糊的区别:拿高斯滤波来举例:滤波一般可以分为高通滤波和低通滤波,对于高斯低通滤波就会产生模糊效果,如果对于高斯高通滤波就会产生锐化的效果。所以通常是:高斯滤波就是指使用高斯函数进行滤波;高斯模糊就是指低通滤波。
- 线性过滤器:即两个信号之和的响应和它们各自响应之和相等,换句话说,每个像素的输出值是一些输入像素的加权和,使用乘积和的计算,例如:R = w1z1 + w2z2 + … + wnzn
高通:边缘增强、边缘提取
低通:钝化图像、去除噪音
带通:删除特定频率、增强中很少用
方框滤波(boxfilter)
方框滤波的原理:
方框滤波的核表示如下:
h代表该点的像素值
hsize代表滤波核
这里的normalize默认为ture,normalize为ture时,方框滤波其实就是均值滤波了
假设滤波核大小为3*3的的,锚点坐标为(x,y),则在目标图像上对应(x,y)这点的像素值为:
h = (f(x-1,y-1) + f(x,y-1)+ f(x+1,y-1) + f(x-1,y) + f(x,y) + f(x+1,y) + f(x-1,y+1) + f(x,y+1) + f(x+1,y+1))/(3*3)
Boxfilter函数API介绍:
C++: void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )
- 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
- 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
- 第三个参数,int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。
- 第五个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
- 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT。
使用实例:
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
cv::Mat srcimage = cv::imread("test.png");
cv::namedWindow("源图像");
cv::namedWindow("滤波后");
std::cout << std::endl;
std::cout << std::endl;
std::cout <<