均值滤波代码
时间: 2023-07-03 12:15:09 浏览: 79
以下是均值滤波的C++代码实现:
```c++
void meanFilter(const cv::Mat& src, cv::Mat& dst, int kernel_size)
{
int kernel_radius = kernel_size / 2;
dst.create(src.size(), src.type());
for (int y = 0; y < src.rows; ++y) {
for (int x = 0; x < src.cols; ++x) {
cv::Vec3b sum(0, 0, 0);
int count = 0;
for (int ky = -kernel_radius; ky <= kernel_radius; ++ky) {
int ny = y + ky;
if (ny < 0 || ny >= src.rows) continue;
for (int kx = -kernel_radius; kx <= kernel_radius; ++kx) {
int nx = x + kx;
if (nx < 0 || nx >= src.cols) continue;
sum += src.at<cv::Vec3b>(ny, nx);
++count;
}
}
dst.at<cv::Vec3b>(y, x) = sum / count;
}
}
}
```
其中,`src`是输入图像,`dst`是输出图像,`kernel_size`是滤波器的大小(一般为奇数)。注意,在此实现中,我们使用了3通道图像(即彩色图像),因此每个像素都用一个`cv::Vec3b`类型的向量表示。如果你要处理的是单通道图像(即灰度图像),可以将`cv::Vec3b`替换为相应的类型,比如`uchar`。
在此实现中,我们使用了一个嵌套的循环来遍历所有的像素,并计算每个像素周围的像素值的均值。最后,我们将结果存储在输出图像`dst`中。由于均值滤波是一种线性滤波器,因此可以使用卷积运算来加速计算。不过,在此实现中,我们直接使用了嵌套循环来演示基本思路。
阅读全文