// 创建结果图像,复制源图像
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的内置函数。