Линейная и гамма-коррекция - постеризованная

Я пишу приложение для обработки изображений, ориентированное на астро-картинки. Особенность таких изображений состоит в том, что они получаются из калибровочных инструментов с очень узкой гистограммой, которую необходимо растянуть.

Я реализовал следующий код для растяжения, который предусматривает линейное растяжение плюс гамма-коррекцию на основе входных данных, предоставленных пользователями. Я работаю на 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.

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

С уважением

0 ответов

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