Je suis de développer une routine pour une amélioration automatique de numérisées de diapositives 35 mm. Je suis à la recherche d'un bon algorithme pour augmenter le contraste et la suppression de la dominante de couleur. L'algorithme devra être complètement automatique, car il y aura des milliers d'images à traiter. Ce sont quelques exemples d'images directement à partir du scanner, seulement recadrée et réduit pour le web:
Je suis à l'aide de la AForge.NET bibliothèque et ont essayé les deux, l' HistogramEqualization
et ContrastStretch
filtres. HistogramEqualization
est bon pour maximiser le contraste local, mais ne produisent pas de résultats satisfaisants dans l'ensemble. ContrastStretch
est bien mieux, mais depuis il s'étend de l'histogramme de chaque bande de couleur individuellement, il produit parfois une forte dominante de couleur:
Afin de réduire le décalage de couleur, j'ai créé un UniformContrastStretch
filtre à moi-même à l'aide de l' ImageStatistics
et LevelsLinear
les classes. Il utilise la même gamme pour toutes les bandes de couleur, en préservant les couleurs à charge de moins de contraste.
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);
L'image est encore assez bleu, donc j'ai créé un ColorCorrection
filtre qui calcule d'abord la moyenne de la luminance de l'image. Une correction gamma valeur est ensuite calculé pour chaque canal de couleur, de sorte que la valeur moyenne de chaque canal de couleur sera égale à la luminance moyenne. L'uniforme contraste de l'image redimensionnée a valeurs moyennes R=70 G=64 B=93
, la luminance moyenne étant (70 + 64 + 93) / 3 = 76
. Le gamma valeurs sont calculées à l' R=1.09 G=1.18 B=0.80
et le résultat, très neutre, l'image a des valeurs moyennes de R=76 G=76 B=76
comme prévu:
Maintenant, arriver à la véritable problème... je suppose que la correction de la moyenne de la couleur de l'image en gris est un peu trop drastique et faire quelques images assez terne en apparence, comme le second échantillon (première image est uniforme tendu, côté est de la même couleur de l'image corrigée):
Une façon de corriger les couleurs manuellement dans un programme d'édition de photos est à l'échantillon de la couleur d'une couleur neutre (blanc/gris/noir) et de régler le reste de l'image pour que. Mais depuis cette routine doit être complètement automatique, qui n'est pas une option.
Je suppose que je pourrais ajouter une force de réglage à ma ColorCorrection
filtre, de sorte qu'une force de 0.5 déplacer la moyenne des valeurs de la moitié de la distance à la luminance moyenne. Mais d'un autre côté, certaines images peuvent faire de mieux, sans aucune correction de la couleur à tous.
Des idées pour un meilleur algorithme? Ou une méthode pour détecter si une image a une dominante de couleur ou tout simplement a beaucoup de couleur, comme le deuxième exemple?