Дискретизация изображений

Прежде чем работать с изображением его нужно перевести в цифровую форму, это делается при помощи квантования. Физически изображение представляет собой непрерывную функцию яркости от двух переменных X и Y (для цветного – это три функции, для каждой компоненты цвета – своя). Во-первых, ее нужно квантовать по осям X и Y (чтобы получить пикселы), во-вторых – нужно квантовать яркость (чтобы перейти от непрерывных значений яркости к дискретным значениям). Обычно квантование происходит на аппаратном уровне, например, при сканировании. В этом случае частота дискретизации (разрешение изображения) и кол-во градаций яркости пикселов (глубина цвета) зависят от параметров сканера.

 
 

Но бывает нужно произвести дискретизацию некоторого готового изображения, например, для уменьшения его разрешения или глубины цвета, как правило это нужно для вывода его на экран или принтер.

Для уменьшения разрешения изображения можно просто выбирать значения с некоторым шагом, но в этом случае могут возникнуть существенные ошибки дискретизации. Более правильным в данном случае было бы считать интегралы от этой функции (когда дискретизацию делает сканер – это происходит автоматически, т.к. на яркость каждого пиксела будет влиять не одна точка изображения, а некоторая область вокруг нее). Тут можно провести аналогию с anialising-ом, там была такая же проблема и она решалась либо более частой выборкой с последующим усреднением (почти интеграл), либо расчетом площади фигуры под пикселем (точный интеграл).

Если же разрешение нужно увеличить – применяют билинейную интерполяцию между соседними пикселами, по тем же формулам, что и при работе с текстурами. Ее же имеет смысл применять, если требуется уменьшить разрешение (от 1 до 2-х раз), т.е. сначала применить интерполяцию, а затем посчитать интегралы под этой интерполированной функцией.

       
   


Одним из видов преобразования является приведение цветного изображения в черно-белое. При в качестве результирующей картинки используется значение яркости пикселов, которое считается по формуле Y = 0.30*R+0.59*G+0.11*B.

При уменьшении глубины цвета или приведении изображения к палитре качество изображения может сильно ухудшиться, если не применять специальных методов. Например, нужно черно-белую картинку с глубиной цвета 8 бит (256 оттенков серого) привести к глубине цвета 1 бит (например, для печати на принтере). Самым простым было бы все оттенки с яркостью меньше половины (от 0 до 127) заменить на черный цвет, а с яркостью больше половины (от 128 до 255) – на белый. Но тогда появятся большие области с одинаковым цветом, границы между ними будут очень портить изображение. Для того, чтобы избежать этого эффекта, применяют методы псевдотонирования (dithering). Псевдотонирование позволяет увидеть в изображении больше цветов, чем их есть на самом деле. Если pазноцветные пикселы группируются вместе то, человеческий глаз смешивает их цвета, воспринимая результат как дополнительный цвет.

Первый алгоритм – Флойда-Стейнберга (диффузия ошибки). Его суть состоит в том, что ошибка между истинным значением цвета и цветом поставленной точки не теряется, а распространяется на соседние пикселы. Например, яркость текущего пиксела 200, ставим на его место белый пиксел с яркостью 255, и распространяем ошибку -55 (отрицательная – т.к. поставили более яркий пиксел, чем следовало бы и это нужно компенсировать) на соседние 3 пиксела. Если яркость следующего пиксела 140, то вместе с 3/8 долей ошибки она составит 120 и нужно будет ставить черный пиксел с яркостью 0, ошибка составит 120 и ее нужно распространять дальше. Его можно не только для формирования однобитных изображений, но и для любой другой глубины цвета. Причем цвет можно выбирать как равномерно распределенные градации, например для 2-х битового режима – 20, 60, A0, E0, так и создать палитру для наиболее часто используемых цветов и искать цвета в ней.

Второй алгоритм Байера. Применяется в основном для получения черно-белых изображений (с глубиной цвета в 1 бит), хотя его можно модифицировать и для изображений с большей глубиной цвета. Для его работы сначала требуется построить матрицу. Она получается из нулевой матрицы 1х1 в результате рекуррентного соотношения.

Ее размер определяется кол-вом битов, исходного изображения. Сколько бит в его глубине цвета, столько элементов должно быть в матрице. Например, если оно имеет 16 цветов, то достаточно матрицы 4х4, если 256 – 16х16.

Затем значение яркости пиксела сравнивается со значением в матрице и если яркость больше – пиксел подсвечивается, если меньше – то нет (I=(I < matrix[x % 8][y % 8])? 0: 0xFF).

Этот алгоритм просто вносит некоторые ошибки в изображение, но за счет этого оно выглядит лучше. Например, если оно имеет среднюю яркость, то подсветится половина пикселов на этом участке, чем больше будет яркость – тем больше их будет подсвечено и тем ярче будет казаться эта область наблюдателю. Одним из недостатков является то, что кол-во бит должно быть кратно 2-м (2,4,6,8) и то, что на полученном изображении можно выделить четкую сетку.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: