Magick.NET Evaluate Red Channel
Я использую Magick.NET, чтобы применить цветовую коррекцию к фотографиям. Я настраиваю красный, зеленый и синий каналы, добавляя или вычитая проценты для каждого, используя метод Evaluate. Здесь значение +/- количество изменений, применяемых к указанному каналу.
image.Evaluate(channel, EvaluateOperator.Add, new Percentage(value));
Добавление цвета в канал - это хорошо, но удаление цвета из канала изменит цветовой баланс белого в изображении (удалите красный, изображение станет зеленым / синим). Мне нужно иметь возможность применить настройку для каждого канала без изменения белого.
Я попытался применить Уровень после Evaluate, а также ContrastStretch, думая, что я могу указать черную / белую точку ниже / выше, корректировка которой игнорируется.
ColorMatrix выглядит многообещающе, но дает действительно странные результаты, а Modulate выполняет ротацию цветов, что неправильно.
Спасибо
1 ответ
tldr; создайте белую маску и примените ее к изображению, используя.WriteMask(), чтобы любые белые области исключались из вызова.Evaluate(..).
var newImage = magickImage.Clone();
var stats = newImage.Statistics().GetChannel(PixelChannel.Composite);
var mean = stats.Mean / (stats.Maximum - stats.Minimum);
var stDev = stats.StandardDeviation / (stats.Maximum - stats.Minimum);
var whiteThreshold = new Percentage(100 - (mean + 0.5 * stDev));
var blackThreshold = new Percentage(mean - 0.5 * stDev);
newImage.ColorFuzz = new Percentage(3);
newImage.WhiteThreshold(whiteThreshold);
newImage.BlackThreshold(blackThreshold);
newImage.Opaque(MagickColors.Black, MagickColors.Green);
newImage.Opaque(MagickColors.White, MagickColors.Black);
newImage.InverseOpaque(MagickColors.Black, MagickColors.White);
magickImage.WriteMask = newImage;
Полезные сайты включены https://www.imagemagick.org/script/index.php и http://www.fmwconcepts.com/imagemagick/index.php. Благодарим Фреда за его сценарий "цветового баланса", который является действительно хорошим примером того, как это сделать с помощью командной строки ImageMagick.