创建项目 | 文件与显示 | 像素操作 | 图像彩色类型转换 | 模糊、平滑、去噪 | 锐化、边缘检测 | 二值化 | 形态学 | 位置变换 | 直方图 | 霍夫变换 | 图像优化 | 图像分割
在直方图一章里提到的直方图均衡化就是一种图像优化的方法。本章再介绍图像修复和去噪两种方法。
一、图像修复
这里所介绍的图像修复是很简单的,就是用周边区域的像素填充损坏区域。代码如下:
Mat src = new Mat(img_lenna_bad);
//找出损坏区域
Mat mask = new Mat(src.Size(), MatType.CV_8UC1, new Scalar(0));
for (int i = 0; i < src.Width; i++)
{
for (int j = 0; j < src.Height; j++)
{
Vec3b color = src.Get<Vec3b>(j, i);
if (color[0] + color[1] + color[2] > 750)
{
mask.Set<byte>(j, i, 1);
mask.Set<byte>(j + 1, i, 1);
mask.Set<byte>(j, i + 1, 1);
mask.Set<byte>(j - 1, i, 1);
mask.Set<byte>(j, i - 1, 1);
mask.Set<byte>(j + 1, i + 1, 1);
mask.Set<byte>(j - 1, i - 1, 1);
mask.Set<byte>(j + 1, i - 1, 1);
mask.Set<byte>(j - 1, i + 1, 1);
}
}
}
Mat result = new Mat();
Cv2.Inpaint(src, mask, result, 5, InpaintMethod.Telea);
result.SaveImage(img_result);
其效果如下所示:
二、去噪
在图像平滑一章里,我们介绍了图像平滑可以去除一些噪声,而中值滤波又可以去除椒盐噪声。这里所说的去噪所用的方法是FNLMD。代码如下:
Mat src = new Mat(img_lenna_noise);
src = src.CvtColor(ColorConversionCodes.BGR2Lab);//转换到Lab空间有更好的效果
Mat result = new Mat();
Cv2.FastNlMeansDenoisingColored(src, result);
result = result.CvtColor(ColorConversionCodes.Lab2BGR);
result.SaveImage(img_result);
其效果如下: