图像的滤波
滤波与卷积区别:卷积中称卷积核,滤波中称滤波器。卷积需要将卷积核翻转180度在卷积,而滤波不需要;在opencv中或者深度学习卷积层中,由于卷积核通常对称,因此并未翻转。如果不对称,卷积需要手动翻转卷积核。
在不考虑卷积核翻转下,两者是一样的。
卷积的实现过程:
1) 将核的锚点(中心点)放在要计算像素上,卷积核剩余的部分对应在图像相应的像素上。
2) 用卷积核中的系数和图像中相应的像素值相乘,并求和。
3) 将最终结果赋值给锚点对应的像素。
4) 通过将核在整个图像滑动,重复以上计算过程直到处理完所有的像素。
链接: 卷积算子的实现
滤波器、卷积核的大小都是奇数,如 3 , 5 ,7,没有偶数大小的卷积核,无法选取合适的锚点,计算十分困难。
使用的命名空间
#pragma once
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
均值滤波
src : 输入图像
dst : 输出图像,与输入相同尺寸、通道数
ksize : 均值模糊核的大小,通常3×3
anchor : 锚点,默认为核的中心
borderType : 图像外部的像素模式,一般不手动修改
测试代码:
//均值滤波
Mat m1 = imread(path3, 1);
Mat m2(m1.size(), m1.type());
//核大小为三,锚点为中心点
blur(m1, m2, Size(3,3) , Point(-1, -1));
namedWindow("truth image",WINDOW_FREERATIO);
namedWindow("blur image", WINDOW_FREERATIO);
//调整窗口大小
resizeWindow("truth image", 600, 400);
resizeWindow("blur image", 600, 400);
imshow("truth image", m1);
imshow("blur image", m2);
waitKey(0);
测试效果:(图像来源于网络,侵权请告知即删除)
高斯滤波
src : 输入图像
dst : 输出图像,与输入相同尺寸、通道数
kszie : 高斯核大小
sigmaX : X方向的高斯核标准偏差。
sigmaY :Y方向高斯核标准差;如果sigmaY为零,则设置为等于sigmaX;如果两个SIGMA都为零,则根据ksize计算。
borderType :使用默认值