Авто-коррекция уровней изображения (Auto Levels)

Авто-коррекция уровней изображения (Auto Levels)

Сообщение artymen » 08 май 2010, 13:55

Ищу алгоритм, реализующий фотошоповский "Auto Levels" (или gimp'овский "Увеличить контраст"). Я не нашел конечную реализацию, но выяснил, как приблизительно он работает. Задача алгоритма - увеличить контраст изображения со слабой динамикой.
Изображение рассматривается как монохроматичное (если с цветом работать, то получится Auto Colors, но мне нужно сохранить цвета), составляется гистограмма уровней, на горизонтальной оси которой значение яркости от 0 до 255, а по вертикали количество пикселей с соответствующей яркостью. Чем контрастнее изображение, тем равномернее и ровнее она будет распределена от начала до конца, у неконтрастного изображения она соберется в кучу примерно посередине, а начало и конец всей оси будут пусты. Автоматически назначается самая черная точка (как бы(!) мин. значение), самая белая точка (как бы(!) макс. значение) и, опционально, серая точка (где-то посреди), и гистограмма растягивается так, чтобы мин. точка оказалась в 0, макс. точка в 255, а средняя посередине (опционально).
Исходная (серая) и скорректированная (черная) гистограммы:
sshot-1.jpg

Собственно, неясно:
1. Как автоматически выбрать точки ? Фотошоп и gimp делают это по-разному, соответственно, и результаты разные. Меня больше результат у gimp устраивает. Я пробовал в исходниках рыться, но бестолку, там все запрятано в сложной струткре объектно-ориентированного кода.
2. Как по растянутой гистограмме пересчитать пиксели ? Предполагаю, что для каждого уровня запоминаются пиксели, а потом им присваиваются новые значения. Тут еще интересный момент есть. Я работаю с моделью HSV и меня интересует значение S (насыщенность). В результате обработки фотошопом/гимпом оно тоже изменяется (собственно, это мне и нужно), на темных и ярких участках она уменьшается. Значит, "масштабируется" не тупо одно значение V (яркость) у пикселя, а как то по-другому. Полагаю, что каждая составляющая RGB масштибируется, это очень похоже, исходя из того как насыщенность расчитывается из RGB (см. RGB —> HSV).
3. Сколько потребуется памяти ? Я примерно понял из исходников GEGL, что там тупо в один проход пиксели "масштабируются", ничего не запоминается, не сравнивается и т.п.
Аватара пользователя
artymen
 
Сообщения: 353
Зарегистрирован: 06 окт 2009, 10:44
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение =DeaD= » 08 май 2010, 14:07

Вроде всё делается в 2 прохода - первым считаем гистограмму и выбираем по ней линейное преобразование, вторым производим это преобразование. Памяти соотв. надо только под гистограмму.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение artymen » 08 май 2010, 14:34

С памятью успокоили :) А как это преобразование делать, меня как раз и интересует. Возможно, вам это кажется очевидным, но для меня это самое темное пятно во всем алгоритме :)
Аватара пользователя
artymen
 
Сообщения: 353
Зарегистрирован: 06 окт 2009, 10:44
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение wb11 » 09 май 2010, 14:40

в книжке по ЦОС (http://freebooks.net.ua/3755-cifrovaja- ... enijj.html)
см. главы 2.2.6 и 10.2.3
изменение динамического диапазона гистограммы Q делается нелинейным гамма-преобразованием в форме

Q` = Q^g * (255 / 255^g)

множители выбираются так, чтобы диапазон [0,255] отображался сам в себя.

в той же книге описывается метод коррекции неоднородного освещения (10.3.2)
wb11
 
Сообщения: 7
Зарегистрирован: 09 май 2010, 14:33

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение artymen » 11 май 2010, 22:19

спасибо. книжка классная, только подход там такой глубокий и основательный, что при всем желании некогда читать. время стремительно идет. я вроде как понял, как преобразование делать, буду пробовать...
Аватара пользователя
artymen
 
Сообщения: 353
Зарегистрирован: 06 окт 2009, 10:44
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение wb11 » 13 май 2010, 14:52

сграбил экран с маткада, оказывается, я уже это делал :-)
Вложения
Capture1.jpg
wb11
 
Сообщения: 7
Зарегистрирован: 09 май 2010, 14:33

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение Duhas » 13 май 2010, 19:15

а я всегда говорил что маткад сила )
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение galex1981 » 13 май 2010, 21:14

Там много полезных алгоритмов есть...
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение artymen » 13 май 2010, 21:24

аа, так это и есть гамма-коррекция... теперь я понял, почему гамма :) по сути, результата можно добиться такого же (но только если редактировать кривую), но это совершенно другой механизм, я уж молчу про то, что словом auto тут и не пахло... :)
P.S. я щас Qt осваиваю, скоро уже подойду к задаче вплотную :)
Аватара пользователя
artymen
 
Сообщения: 353
Зарегистрирован: 06 окт 2009, 10:44
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение wb11 » 14 май 2010, 00:23

Duhas писал(а): а я всегда говорил что маткад сила )

согласен))

artymen писал(а):аа, так это и есть гамма-коррекция... теперь я понял, почему гамма :) по сути, результата можно добиться такого же (но только если редактировать кривую), но это совершенно другой механизм, я уж молчу про то, что словом auto тут и не пахло... :)
P.S. я щас Qt осваиваю, скоро уже подойду к задаче вплотную :)

с auto тоже всё просто, придумываете как выбирать уровень яркости X, уровень яркости Y, чтобы при преобразовании X перешёл в Y. Тут можно покумекать.

Предлагаю такой вариант (отцентровка гистограммы): X = СУММА(Qi * i)/СУММА(Qi) центр масс. Y = 128 центр.
Гамма g = (ln Y - ln 255)/(ln X - ln 255)
wb11
 
Сообщения: 7
Зарегистрирован: 09 май 2010, 14:33

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение artymen » 14 май 2010, 09:05

Во-первых, это все равно гамма-коррекция, теперь уже авто. Во-вторых, кто сказал, что мне необходима такая коррекция ? Камера работает в режиме автоэкспозиции, она собственно сама и подстраивает изображение, стремясь к определенному значению средней яркости, и сколько я видел гистограмм полученных изображений, у них всегда график находится примерно в центре. И я обозначил задачу с самого начала: необходимо повысить КОНТРАСТНОСТЬ. Другими словами, растянуть гистограмму. То, что вы предлагаете, это коррекции из области фотографии, где целью стоит улучшение изображения для ЧЕЛОВЕЧЕСКОГО восприятия. У меня совершенно иные цели.
Аватара пользователя
artymen
 
Сообщения: 353
Зарегистрирован: 06 окт 2009, 10:44
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение Duhas » 14 май 2010, 09:15

что-то мне говорит, что если человеческий глаз плохо видит что-то на изображении, то уж комп то точно не увидит...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение zubr » 14 май 2010, 11:54

а если человек видит картинку которую ему комп показывает.. то точно голяк :)

Если есть терпение, то можно покопаться в исходниках Elphel камер и посмотреть как там сделана автоэкспозиция. Работает по гистограмме.
А если хочешь глубже копнуть, то учти что гамма-коррекцию можно считать частным случаем tone-mapping (который есть сердце HDR рендеренга)
Почитай. Там с десяток интересных алгоритмов. И софт гнусный есть http://en.wikipedia.org/wiki/Tone_mapping
За здравый смысл у нас принимается мнение большинства.
zubr
 
Сообщения: 431
Зарегистрирован: 20 ноя 2008, 19:31
Откуда: Чернобыль
прог. языки: асмемблер
ФИО: Валентин Семенович

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение wb11 » 14 май 2010, 14:29

artymen писал(а):Другими словами, растянуть гистограмму.

а... похожую задачу и решал... отсечь слабые границы у гистограммы.
пороговый метод работал сносно. S1 - сумма значений гистограммы в точках <= x, S2 -сумма в точках > x.
При поиске границ x инкрементируется в цикле, а операция подсчёта сумм на очередном шаге - это просто сложение и вычитание G[x]. Когда отношение S1/S2 превысит порог - там левая точка. Таким же макаром ищем правую.
Вам надо растянуть яркость изображения линейно?
типа вот так: Если x1<Y<x2, То Y`= (Y - x1)*256/(x2-x1)

Добавлено спустя 46 минут 28 секунд:
Duhas писал(а):что-то мне говорит, что если человеческий глаз плохо видит что-то на изображении, то уж комп то точно не увидит...

можно не увидеть, но среагировать )) т.е. зависит какую задачу решаем )
wb11
 
Сообщения: 7
Зарегистрирован: 09 май 2010, 14:33

Re: Авто-коррекция уровней изображения (Auto Levels)

Сообщение artymen » 14 май 2010, 17:44

Спасибо, попробую !
Насчет автоматического определения границ. Это самое главное в моем алгоритме, оно и определяет задачу, которую я решаю. Дело в том, что я распознаю цвет и критерием фильтрации "плохих" пикселей я выбрал насыщенность, ведь чем она больше, тем больше можно доверять этому пикселю. Нужно либо установить фиксированный порог насыщенности, к которому и приводить растягивание гистограммы, либо наоборот, растянуть гистограмму, определив границы способом порога S1/S2, и из полученной гистограммы определить порог насыщенности.
Аватара пользователя
artymen
 
Сообщения: 353
Зарегистрирован: 06 окт 2009, 10:44
Откуда: Омск
Skype: artymen1
ФИО: Артем Константинович


Вернуться в Алгоритмы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9