2014-11-13 2 views
1

Я хочу сделать что-то похожее на levels function in Photoshop, но не могу найти правильные функции openCV.Уровни цвета в OpenCV

В принципе, я хочу растянуть серости в изображении, чтобы перейти от почти белого к практически черному, а не от почти белого до слегка серого, оставив белый, как белый и черный, как черный (я использую полутоновые изображения).

+0

opencv - компьютерное зрение/компьютерная библиотека обучения, а не фотошоп. – berak

+2

Правильно. OpenCV намного лучше! =) –

+0

Подождите, если Photoshop не является opencv, объясняет, почему мой код не компилируется? –

ответ

2

Я думаю, что это функция, отображающая уровни ввода для выходных уровней, как показано ниже на рисунке.

enter image description here

Например, оранжевая кривая представляет собой прямую линию от (а, с) к (б, г), синяя кривая представляет собой прямую линию от (а, г) (б, в) а зеленая кривая - нелинейная функция от (a, c) до (b, d).

Мы можем определить синюю кривую как (x - a)/(y - d) = (a - b)/(d - c). Предельные значения a, b, c и d зависят от диапазона, поддерживаемого каналом, к которому вы применяете это преобразование. Для шкалы серого это [0, 255].

Например, если вы хотите преобразование типа (A, D) = (10, 200), (б, в) = (250, 50) для серой шкалы изображения,

у = -150 * (х-10)/240 + 200 для й [10, 250]

у = х для [0, 10) и (250, 255], если вы хотите, остальных значения без изменений.

вы можете использовать a таблица поиска в OpenCV (LUT) для вычисления уровней вывода и применения этого преобразования к вашему изображению или конкретному каналу. любое кусочно-преобразование таким образом.

+0

Таблицы поиска. Я надеялся, что будет ответ, который их не привлекал. –

2

Я не знаю, что такое «уровни Photoshop». Но из описания, я думаю, вам следует попробовать следующее:

  1. Преобразование изображения в YUV с помощью cvtColor. Y будет представлять собой плоскость интенсивности. (Вы также можете использовать Lab, Luv или любое подобное цветовое пространство с отдельным компонентом интенсивности).
  2. Разделите плоскости, используя split, так что плоскость интенсивности будет отдельным изображением.
  3. Вызова equalizeHist на плоскости интенсивности
  4. Merge самолетов обратно вместе с помощью merge

Подробной информации о выравнивании гистограммы можно найти here

Также обратите внимание, что есть реализация несколько улучшенного способ выравнивания гистограммы - CLAHE (но я не могу найти лучшую ссылку, чем this, также @berak предложил хороший link по теме)

+0

[this] (http://stackoverflow.com/questions/24341114/simple-illumination-correction-in-images-opencv-c/24341809#24341809) может быть недостающей ссылкой на CLAHE – berak

+0

Спасибо, я обновил ответ. –

+0

Я использую изображения оттенков серого, если это что-то меняет. Думаю, это означало бы, что мне не нужно преобразовывать, разделять, а потом сливаться правильно? Просто бит equalizeHist. –

Смежные вопросы