Линейная и гамма-коррекция - постеризованная
Я пишу приложение для обработки изображений, ориентированное на астро-картинки. Особенность таких изображений состоит в том, что они получаются из калибровочных инструментов с очень узкой гистограммой, которую необходимо растянуть.
Я реализовал следующий код для растяжения, который предусматривает линейное растяжение плюс гамма-коррекцию на основе входных данных, предоставленных пользователями. Я работаю на 8bpp RGB пространстве, поэтому входные данные:
- BlackR / Грайр / белее
- BlackG / GrayG / WhiteG
BlackB / GrayB / WhiteB
' Start Linear sloper = 255 / (WhiteR - BlackR) slopeg = 255 / (WhiteG - BlackG) slopeb = 255 / (WhiteB - BlackB) For i As Integer = 0 To (WhiteR - BlackR - 1) newranger(BlackR + i) = i * sloper Next For i As Integer = 0 To (WhiteG - BlackG - 1) newrangeg(BlackG + i) = i * slopeg Next For i As Integer = 0 To (WhiteB - BlackB - 1) newrangeb(BlackB + i) = i * slopeb Next For i As Integer = WhiteR To 255 newranger(i) = 255 Next For i As Integer = WhiteG To 255 newrangeg(i) = 255 Next For i As Integer = WhiteB To 255 newrangeb(i) = 255 Next ' End Start Linear ' Start Logarithmic For i As Integer = 0 To 255 gammaranger(i) = Math.Max(Math.Min(255, CType(255 * Math.Pow(i / 255, 1 / Me.GrayRStretch), Integer)), 0) gammarangeg(i) = Math.Max(Math.Min(255, CType(255 * Math.Pow(i / 255, 1 / Me.GrayGStretch), Integer)), 0) gammarangeb(i) = Math.Max(Math.Min(255, CType(255 * Math.Pow(i / 255, 1 / Me.GrayBStretch), Integer)), 0) Next ' End Logaritmic
Затем я отображаю выходное изображение следующим образом:
For counter = 0 To rgbValues.Length - 1 Step 4
rgbValues(counter + 2) = finalr(Me.OriginalFittedStream(counter + 2))
rgbValues(counter + 1) = finalg(Me.OriginalFittedStream(counter + 1))
rgbValues(counter) = finalb(Me.OriginalFittedStream(counter))
Next
Я делаю некоторые модульные тесты моей программы по сравнению с PSCS5, и я замечаю, что мой инструмент производит очень раздражающую постеризацию. По сути, я сделал снимок и применил оба инструмента и PSCS5:
- 8 для черного на всех каналах
- 38 для белого на всех каналах
- 1,02 для серого на всех каналах
Мой инструмент генерирует выходные гистограммы с несколькими взглядами, в то время как PSCS5 распространяет информацию немного лучше, так что постеринг отсутствует. Теперь мой вопрос: после линейного и логарифмического растяжения есть какой-то другой алгоритм, который мне нужно применять, как PSCS5? Я ничего не могу найти в сети.
26.09.2012 20:25UTC
Я хотел бы дать вам обновление по этой теме. Предпосылка: как вы знаете, в VB невозможно легко работать с изображениями с 48bpp, поэтому мне приходится жить с 24bpp. По сути, даже если изображение 48bpp VB преобразует его в 24bpp.
Во всяком случае, я частично (60/70%) смог избавиться от постеризации следующим образом.
Я создал 3 справочных таблицы (по одной на каждый канал), которые я использовал для преобразования из RGB 24bpp в RGB 48bpp. Я создал 3 других справочных таблицы (по одной для каждого канала), которые я использовал для преобразования из 48bpp RGB в 24bpp RGB. Итак, теперь мой алгоритм предусматривает преобразование из 24bpp в 48bpp через первый LUT в начале. Затем я применяю (на уровне 65535) линейное растяжение и альфа-коррекцию. Наконец, я преобразовываю новые значения обратно в формат 24bpp с помощью второго LUT.
Как я уже сказал, я избавился от значительной части постеризации. Некоторые из них все еще присутствуют, но учтите, что изображение, которое я использую для тестирования, является очень узкой гистограммой.
С уважением