Отрегулируйте кривые цвета в Python, как в GIMP - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь реализовать код Python, чтобы отделить некоторые определенные цвета от набора данных изображения. Я отделил слой Cr от цветового пространства YCbCr (массив 1-dim np), и теперь я пытаюсь применить фильтр кривой, подобный этому в GIMP: GIMP curve I want to apply

IЯ провел некоторое исследование по этой теме и обнаружил, что здесь используется кривая Безье. Я попытался изучить параметры вывода кривых, но не смог этого понять. Я хочу, чтобы эффект, применяемый этой кривой, применял пороговое значение на последующих этапах. Есть ли простой способ сделать это? (Я новичок в этой области)

1 Ответ

0 голосов
/ 09 ноября 2019

Вы хотите что-то вроде:

pdb.gimp_drawable_curves_spline(layer,HISTOGRAM_VALUE,8,[0, 0, 0.37477797513321481, 0.12890625, 0.62344582593250431, 0.8828125, 1, 1])

Трюк

Вы можете позволить Gimp определить значения:

Используйте графический интерфейс и примените инструмент Curves к образцу:

enter image description here

На изображении выше обратите внимание на селектор «Presets» вверху. Каждый раз, когда вы применяете фильтр, Gimp сохраняет кривую, и вы можете получить ее с помощью селектора. По умолчанию кривая является анонимной (только с отметкой времени), но вы также можете дать ей имя (нажмите кнопку +).

Эти значения сохраняются в файле в профиле Gimp. В Gimp 2.10 этот файл ${Gimp profile}/filters/GimpCurvesConfig.settings. Если вы отредактируете его (вашему редактору может потребоваться поддержка длинных строк), вы увидите:

# settings

(GimpCurvesConfig "2019-11-08 21:57:15"
    (time 1573246635)
    (linear no)
    (channel value)
    (curve
        (curve-type smooth)
        (points 8 0 0 0.37477797513321481 0.12890625 0.62344582593250431 0.8828125 1 1)
        (point-types 4 smooth smooth smooth smooth)

    [...snip...]

Интересующая линия - та, которая начинается с (points ...). Вам просто нужно преобразовать:

(points 8 0 0 0.37477797513321481 0.12890625 0.62344582593250431 0.8828125 1 1)

в:

... 8,[0, 0, 0.37477797513321481, 0.12890625, 0.62344582593250431, 0.8828125, 1, 1]

Вряд ли может быть проще.

Примечание:

Термин "кривые Безье""Это довольно случайно здесь. Для программного обеспечения это просто способ сгладить кривую, но вы только устанавливаете опорные точки. Важно то, что вы определяете функцию канала над самим собой: newChannelValue=f(oldChannelvalue) и определяете f() не с помощью математической формулы, а рисуя график функции.

...