自动增强扫描图像

Anl*_*nlo 31 c# algorithm image image-processing aforge

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

A_CroppedB_Cropped

我正在使用AForge.NET库,并尝试了HistogramEqualizationContrastStretch过滤器.HistogramEqualization有利于最大化局部对比度但总体上不会产生令人满意的结果.ContrastStretch更好,但由于它单独拉伸每个色带的直方图,它有时会产生强烈的色偏:

A_Stretched

为了减少颜色偏移,我UniformContrastStretch自己使用ImageStatisticsLevelsLinear类创建了一个过滤器.这对所有色带使用相同的范围,以较低的对比度为代价保留色彩.

    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);
Run Code Online (Sandbox Code Playgroud)

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_UniformStretched B_UniformStretchedCorrected

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

我想我可以为我的ColorCorrection滤镜添加强度设置,因此强度为0.5会将平均值的一半移动到平均亮度.但另一方面,一些图像可能会做得最好,没有任何颜色校正.

有什么想法可以获得更好的算法吗?或者某些方法来检测图像是否有偏色或者只是有很多颜色,比如第二个样本?

Alc*_*sta 1

为了避免在拉伸对比度时改变图像的颜色,请首先将其转换为 HSV/HSL 颜色空间。然后,在 L 或 V 通道中应用常规对比度拉伸,但不要改变 H 或 S 通道。