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.

Другие вопросы по тегам