今天学习什么是均值滤波,主要学习一下基本问题。
问题1:什么是均值滤波?
均值均值就是计算求平均,是一个线性滤波算法。个人认为均值滤波也是也是基于核来运算的 只是这个核是变化的核,嘿嘿 可能理解的不到位。就一个一个n*n的区域中,n一般是奇数,这个区域中中心元素的像素值等于这个区域中所有像素值求和再除以像素值的个数,计算公式如下: (求和不包括其本身)哈哈 将就看吧,没有公式编辑器。
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y)。
问题2:均值滤波是用来干啥的,有什么优点??
似乎没找到什么特别大的优点,平滑图像,速度较快,算法简单。均值滤波相当于低通滤波,有将图像模糊化的趋势,对椒盐噪声基本无能为力。
均值滤波的代码实现:
#include<opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void salt(Mat &image, Mat &result,int k)
{
image.copyTo(result);
for (; k > 0; k--)
{
int i = rand() % image.rows;
int j = rand() % image.cols;
if (image.channels() == 1)
{
result.at<uchar>(i, j) = 255;
}
if (image.channels() == 3)
{
result.at<Vec3b>(i, j)[0] = 255;
result.at<Vec3b>(i, j)[1] = 255;
result.at<Vec3b>(i, j)[2] = 255;
}
}
}
void averFiltering(Mat &image, Mat &result)
{
if (image.data == NULL)
{
return;
}
image.copyTo(result);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if ((i - 1 >= 0) && (j - 1 >= 0) && (i < result.rows) && (result.cols))
{
result.at<Vec3b>(i, j)[0] = (result.at<Vec3b>(i, j)[0] + result.at<Vec3b>(i, j - 1)[0] + result.at<Vec3b>(i, j + 1)[0]
+ result.at<Vec3b>(i - 1, j - 1)[0] + result.at<Vec3b>(i - 1, j)[0] + result.at<Vec3b>(i - 1, j + 1)[0]
+ result.at<Vec3b>(i + 1, j - 1)[0] + result.at<Vec3b>(i + 1, j)[0] + result.at<Vec3b>(i + 1, j + 1)[0])/9;
result.at<Vec3b>(i, j)[1] = (result.at<Vec3b>(i, j)[1] + result.at<Vec3b>(i, j - 1)[1] + result.at<Vec3b>(i, j + 1)[1]
+ result.at<Vec3b>(i - 1, j - 1)[1] + result.at<Vec3b>(i - 1, j)[1] + result.at<Vec3b>(i - 1, j + 1)[1]
+ result.at<Vec3b>(i + 1, j - 1)[1] + result.at<Vec3b>(i + 1, j)[1] + result.at<Vec3b>(i + 1, j + 1)[1]) / 9;
result.at<Vec3b>(i, j)[2] = (result.at<Vec3b>(i, j)[2] + result.at<Vec3b>(i, j - 1)[2] + result.at<Vec3b>(i, j + 1)[2]
+ result.at<Vec3b>(i - 1, j - 1)[2] + result.at<Vec3b>(i - 1, j)[2] + result.at<Vec3b>(i - 1, j + 1)[2]
+ result.at<Vec3b>(i + 1, j - 1)[2] + result.at<Vec3b>(i + 1, j)[2] + result.at<Vec3b>(i + 1, j + 1)[2]) / 9;
}
else
{
result.at<Vec3b>(i, j)[0] = image.at<Vec3b>(i, j)[0];
result.at<Vec3b>(i, j)[1] = image.at<Vec3b>(i, j)[1];
result.at<Vec3b>(i, j)[2] = image.at<Vec3b>(i, j)[2];
}
}
}
}
int main()
{
Mat image, result1, result2;
image = imread("Test.jpg", IMREAD_UNCHANGED);
salt(image, result1, 3000);
averFiltering(result1, result2);
imshow("原始图像", image);
imshow("椒盐噪声", result1);
imshow("均值滤波", result2);
waitKey(0);
return 0;
}