代码实现:
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
#include<stdio.h>
using namespace std;
using namespace cv;
//基于4邻域的掩码操作
Mat Myfilter2D(Mat srcImage)
{
const int nChannels = srcImage.channels();
Mat resultImage(srcImage.size(), srcImage.type());
for (int j = 1; j < srcImage.rows - 1; ++j){
//获取邻域指针
//上一行
const uchar *previous = srcImage.ptr<uchar>(j - 1);
//当前行
const uchar *current = srcImage.ptr<uchar>(j);
//下一行
const uchar *next = srcImage.ptr<uchar>(j + 1);
uchar *output = resultImage.ptr<uchar>(j);
for (int i = nChannels; i < nChannels*(srcImage.cols - 1);
++i){
//4邻域均值掩码操作
*output++ = saturate_cast<uchar>(
current[i - nChannels] + current[i + nChannels] +
previous[i] + next[i] / 4);
}
}
//边界处理
resultImage.row(0).setTo(Scalar(0));
resultImage.row(resultImage.rows - 1).setTo(Scalar(0));
resultImage.col(0).setTo(Scalar(0));
resultImage.col(resultImage.cols - 1).setTo(Scalar(0));
return resultImage;
}
//Opencv自带掩码操作
Mat filter2D_(Mat srcImage)
{
Mat resultImage(srcImage.size(), srcImage.type());
//构造核
Mat kern = (Mat_<float>(3, 3) << 0, 1, 0,
1, 0, 1,
0, 1, 0) / (float)(4);
filter2D(srcImage, resultImage, srcImage.depth(), kern);
return resultImage;
}
int main()
{
Mat srcImage = imread("F:\\opencv_re_learn\\2.jpg");
if (!srcImage.data){
cout << "failed to read" << endl;
system("pause");
return -1;
}
Mat srcGray;
cvtColor(srcImage, srcGray, CV_BGR2GRAY);
imshow("srcGray", srcGray);
Mat resultImage = Myfilter2D(srcGray);
imshow("4邻域-均值滤波", resultImage);
Mat resultImage2 = filter2D_(srcGray);
imshow("Opencv自带库filter2d", resultImage2);
waitKey(0);
return 0;
实现效果: