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


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

为了减少颜色偏移,我UniformContrastStretch自己使用ImageStatistics和LevelsLinear类创建了一个过滤器.这对所有色带使用相同的范围,以较低的对比度为代价保留色彩.
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)

虽然图像仍然很蓝,所以我创建了一个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预期的平均值:

现在,解决真正的问题...我想将图像的平均颜色校正为灰色有点过于剧烈,会使一些图像在外观上显得相当沉闷,就像第二个样本(第一个图像是均匀拉伸的,接下来是相同的图像颜色校正):

在照片编辑程序中手动执行色彩校正的一种方法是对已知中性色(白色/灰色/黑色)的颜色进行采样,并将图像的其余部分调整为该颜色.但由于这个例程必须是完全自动的,所以这不是一个选择.
我想我可以为我的ColorCorrection滤镜添加强度设置,因此强度为0.5会将平均值的一半移动到平均亮度.但另一方面,一些图像可能会做得最好,没有任何颜色校正.
有什么想法可以获得更好的算法吗?或者某些方法来检测图像是否有偏色或者只是有很多颜色,比如第二个样本?