Быстрый метод масштабирования цветных изображений
Весовые коэффициенты пропорциональны площади пересечения пикселя источника с пикселем приёмника. Веса вычисляются так:
Здесь 1 ≤ x ≤ end.
Weight1 считаем левым весом, weight2 – правым. Сумма левого и правого весов должна равняться 1. Заметим, что веса и индексы вычисляем в целых числах. Это сделано для упрощения вычислений и сокращения объёма необходимой памяти. В формуле, приведённой выше, использована 10-разрядная точность (множитель 1024) для преобразования вещественных значений в целые.
Индикатор первого пикселя источника равен 0, когда он не лежит на границе с первым уменьшенным пикселем или в случае, когда пиксель источника «проецируется» только на один из пикселей приёмника. Если же «проекция» приходится на 2 пикселя или левые границы пикселей источника и приемника идут точно по границе изображения, то индикатор устанавливается равным 1.
Векторы index(x), weight1(x) и weight2(x) хранятся в таблице, что помогает избежать их повторного вычисления при переходе на следующую после текущей строку. Коэффициент масштабирования постоянен для каждой строки. Обращение к таблице значительно повышает быстродействие, и в предлагаемом алгоритме таблицы используются во всех удобных случаях.
Как только веса и индексы по направлению х вычислены, приступаем к вычислению величин по у, пользуясь вышеприведёнными формулами.
На заключительном этапе алгоритма выполняется собственно масштабирование – вычисление значений пикселей приёмника. Для этого берутся значения пикселей с начального по конечный, а из таблицы считываются веса и индексы. Ниже приведены формулы, по которым производится расчёт:
Так как алгоритму требуются только пиксели с индикатором 1, то можно вычислять значения только одного или двух пикселей вместо четырёх. Тем самым нам удастся ускорить работу алгоритма, особенно в случае небольшого коэффициента масштабирования (большая часть индикаторов при таком раскладе равна 0). Значения пикселей каждой строки приёмника получаются путём сложения значений пикселей источника со значениями выходных буферов в каждой итерации цикла (см. рис. 5).
Рис. 5. Буферизация.
Один пиксель источника затрагивает до четырёх пикселей приёмника (A, B, C, D) в зависимости от значений indexX и indexY. Если indexX = 0 и indexY = 0, то само значение пикселя источника добавляется в буфер (пиксель А, рис. 5). При indexX = 1 и indexY = 0, пиксель В вычисляется как взвешенное среднее пикселей источника и добавляется в соответствующий буфер. Если indexX = 0, а indexY = 1, то пиксель С вычисляется как взвешенное среднее входных пикселей и добавляется во второй буфер. Ну а в случае, если indexX и indexY равны одновременно 1, вычисляется пиксель D и добавляется во второй буфер.
Как только алгоритм пройдёт целиком по строке изображения, значения первого буфера преобразуются в 8-битные целые числа (0…255) делением на 1024 и записываются в выходной буфер. Если текущая строка источника влияет на две строки приёмника (indexY = 1) и если уменьшенная строка полностью занесена в буфер, её можно вывести уже на приёмник. После этого буферы 1 и 2 обмениваются своими значениями, и процесс повторяется для следующей строки.
Заметим, что в рисунках с RGB-моделью представления цвета каждая из компонент должна обрабатываться отдельно, т. е. алгоритм выполнится 3 раза по каждой из компонент.
Помимо низкой вычислительной нагрузки предлагаемый алгоритм использует только одну строку источника, 2 строки приёмника, 2 выходных буфера, 2 вектора верхних индексов (по одному на ширину и высоту) и 4 весовых вектора (по 2 на ширину и высоту источника). Как видим, алгоритм нетребователен к объёму памяти и очень удобен для портативных устройств.
Алгоритм увеличения масштаба
Oснован на методе билинейной интерполяции и устроен так, чтобы избежать ненужных вычислений. Так как коэффициенты масштабирования по х и у равны для каждой строки и каждого столбца, то все веса и индексы могут быть занесены в память. В нашем примере рассмотрено растяжение изображения по оси х.
Рис. 6. Начальный и конечный пиксели.
Первый шаг алгоритма – определение начальных и конечных пикселей источника (см. рис. 6). Начальный пиксель вычисляется так:
Так как увеличенное изображение может быть панорамировано, то позиция начального пикселя зависит от коэффициента масштабирования и позиции панорамирования. Начало координат панорамирования должно находиться в центральном пикселе приёмника