// 创建结果图像,复制源图像
Mat result = src.clone();

// 遍历图像的每个像素(除了边缘)
for (int row = 1; row < h-1; row++) {
    for (int col = 1; col < w-1; col++) {
        // 对蓝色通道应用3x3均值滤波
        int sb = src.at<Vec3b>(row, col)[0] + src.at<Vec3b>(row - 1, col - 1)[0] + src.at<Vec3b>(row - 1, col)[0] +
            src.at<Vec3b>(row - 1, col + 1)[0] + src.at<Vec3b>(row, col - 1)[0] + src.at<Vec3b>(row, col + 1)[0] +
            src.at<Vec3b>(row + 1, col - 1)[0] + src.at<Vec3b>(row+1, col)[0] + src.at<Vec3b>(row+1, col + 1)[0];

        // 对绿色通道应用3x3均值滤波
        int sg = src.at<Vec3b>(row, col)[1] + src.at<Vec3b>(row - 1, col - 1)[1] + src.at<Vec3b>(row - 1, col)[1] +
            src.at<Vec3b>(row - 1, col + 1)[1] + src.at<Vec3b>(row, col - 1)[1] + src.at<Vec3b>(row, col + 1)[1] +
            src.at<Vec3b>(row + 1, col - 1)[1] + src.at<Vec3b>(row + 1, col)[1] + src.at<Vec3b>(row + 1, col + 1)[1];

        // 对红色通道应用3x3均值滤波
        int sr = src.at<Vec3b>(row, col)[2] + src.at<Vec3b>(row - 1, col - 1)[2] + src.at<Vec3b>(row - 1, col)[2] +
            src.at<Vec3b>(row - 1, col + 1)[2] + src.at<Vec3b>(row, col - 1)[2] + src.at<Vec3b>(row, col + 1)[2] +
            src.at<Vec3b>(row + 1, col - 1)[2] + src.at<Vec3b>(row + 1, col)[2] + src.at<Vec3b>(row + 1, col + 1)[2];

        // 计算平均值并存储到结果图像中
        result.at<Vec3b>(row, col)[0] = sb / 9;
        result.at<Vec3b>(row, col)[1] = sg / 9;
        result.at<Vec3b>(row, col)[2] = sr / 9;
    }
}

这段代码的主要功能是:

1.对图像应用3x3的均值滤波器,这是一种简单的图像平滑技术。

2. 分别处理图像的蓝色(B)、绿色(G)和红色(R)三个通道。

3.对于每个像素,计算其周围3x3邻域内所有像素值的和(对每个颜色通道单独计算)。

4.将和除以9(3x3=9个像素)得到平均值,作为结果图像中对应像素的新值。

5. 这个过程会略微模糊图像,可以用来减少噪声或者平滑图像。

注意事项:

  • 这段代码没有处理图像边缘(第一行、最后一行、第一列、最后一列),因为这些像素没有完整的3x3邻域。
  • 使用src.clone()创建result确保了原图像不会被修改。
  • 这种直接实现的方法在计算效率上不如使用OpenCV的内置函数(如blur()或boxFilter()),但它清楚地展示了均值滤波的原理。
  • 对于大图像,这种逐像素的处理可能会比较慢。在实际应用中,通常会使用更优化的方法或利用OpenCV的内置函数。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐