opencv中的blur函数用c++实现
1、均值滤波原理
均值滤波方法是,对待处理的当前像素,选择一个窗口模板,以该窗口为其邻近的若干个像素组成,用模板的均值来替代原像素的值的方法。
选取一个奇数的窗口模板(如3*3)
代码编程
void cblur(const Mat& src, Mat& dst, Size wsize)
{
if (wsize.width % 2 == 0 || wsize.height % 2 == 0)
{
cout << "please input odd parame" << endl;
exit(-1);
}
//边缘扩大
int hw = (wsize.width - 1) / 2;
int hh = (wsize.height - 1) / 2;
Mat newsrc;
copyMakeBorder(src, newsrc, hw, hw, hh, hh, BORDER_DEFAULT);
if (src.channels() == 3)
{
for (int i = hh; i < src.rows + hh; i++)
{
for (int j = hw; j < src.cols + hw; j++)
{
int sum[3] = { 0 };
int mean[3] = { 0 };
for (int l = i - hh; l < =i + hh; l++)
{
for (int m = j - hw; m < =j + hw; m++)
{
sum[0] += newsrc.at<Vec3b>(l, m)[0];
sum[1] += newsrc.at<Vec3b>(l, m)[1];
sum[2] += newsrc.at<Vec3b>(l, m)[2];
}
}
mean[0] = sum[0] / (wsize.area());
mean[1] = sum[1] / (wsize.area());
mean[2] = sum[2] / (wsize.area());
dst.at<Vec3b>(i-hh, j -hw)[0] = mean[0];
dst.at<Vec3b>(i -hh, j -hw)[1] = mean[1];
dst.at<Vec3b>(i -hh, j-hw )[2] = mean[2];
}
}
}
if (src.channels()==1)
{
for (int i = hh; i < src.rows + hh; i++)
{
for (int j = hw; j < src.cols + hw; j++)
{
int sum = 0 ;
int mean = 0;
for (int l = i - hh; l < =i + hh; l++)
{
for (int m = j - hw; m <= j + hw; m++)
{
sum += newsrc.at<uchar>(l, m);
}
}
mean = sum / (wsize.area());
dst.at<uchar>(i - hh, j - hw)= mean;
}
}
}
}