自动增强扫描图像
c#
image
image-processing
6
0

我正在开发用于自动增强扫描的35毫米幻灯片的例程。我正在寻找一种提高对比度和消除偏色的好的算法。该算法将必须是完全自动的,因为将要处理数千个图像。这些是直接来自扫描仪的几个示例图像,仅针对Web裁剪和缩小尺寸:

A_裁剪B_裁剪

我正在使用AForge.NET库,并尝试了HistogramEqualizationContrastStretch过滤器。 HistogramEqualization有助于最大化局部对比度,但总体上不会产生令人愉悦的结果。 ContrastStretch更好,但是由于它可以分别拉伸每个色带的直方图,因此有时会产生强烈的偏色:

A_拉伸

为了减少颜色偏移,我使用ImageStatisticsLevelsLinear类自己创建了UniformContrastStretch滤镜。这对所有色带都使用相同的范围,以降低对比度为代价来保留颜色。

    ImageStatistics stats = new ImageStatistics(image);
    int min = Math.Min(Math.Min(stats.Red.Min, stats.Green.Min), stats.Blue.Min);
    int max = Math.Max(Math.Max(stats.Red.Max, stats.Green.Max), stats.Blue.Max);
    LevelsLinear levelsLinear = new LevelsLinear();
    levelsLinear.Input = new IntRange(min, max);
    Bitmap stretched = levelsLinear.Apply(image);

A_UniformStretched

虽然图像仍然很蓝,所以我创建了一个ColorCorrection滤镜,该滤镜首先计算图像的平均亮度。然后针对每个颜色通道计算伽马校正值,以使每个颜色通道的平均值等于平均亮度。均匀对比度拉伸图像的平均值为R=70 G=64 B=93 ,平均亮度为(70 + 64 + 93) / 3 = 76 。伽玛值计算为R=1.09 G=1.18 B=0.80 ,所得的非常中性的图像的平均值为R=76 G=76 B=76如预期的那样:

A_UniformStretchedCorrected

现在,解决真正的问题...我想将图像的平均颜色校正为灰色有点太剧烈,会使某些图像在外观上变得很暗淡,例如第二个样本(第一个图像被均匀拉伸,下一个是校正了相同的图像颜色):

B_UniformStretchedB_UniformStretchedCorrected

在照片编辑程序中手动执行颜色校正的一种方法是对已知中性色(白色/灰色/黑色)的颜色进行采样,然后将图像的其余部分调整为该颜色。但是由于该例程必须是完全自动的,所以这不是一个选择。

我想我可以在我的ColorCorrection滤镜上添加强度设置,以使强度为0.5会使平均值移动到平均亮度距离的一半。但是,另一方面,某些图像可能在没有任何色彩校正的情况下表现最佳。

有更好的算法想法吗?还是采用某种方法来检测图像是否具有色偏或仅具有某种颜色(如第二个样本)?

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃
  • 转换为hsv
  • 通过将值从(最小,最大)范围缩放到(0,255)范围来校正V层
  • 组装回RGB
  • 通过与第二步中的V层相同的思想校正R,G,B层的结果

没有aforge.net代码,因为它由php原型代码处理,但是afage.net这样做没有任何问题。结果是:

在此处输入图片说明在此处输入图片说明

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号