Как я могу уменьшить массив необработанных данных RGB на 16-битном дисплее - PullRequest
2 голосов
/ 11 апреля 2009

У меня есть массив необработанных данных rgb на 16-битном дисплее с размером 320 * 480. Размер массива составляет 320 * 480 * 4 = 6144000.

Я хотел бы знать, как я могу уменьшить это (80 * 120) без потери качества изображения?

Я нашел эту ссылку о масштабировании изображения в двумерном массиве, но как я могу применить это к моему массиву 16-битного дисплея? Это не двумерный массив (поскольку он имеет 16-битный цвет).

Масштабирование и поворот изображения в C / C ++

Спасибо.

Ответы [ 5 ]

5 голосов
/ 11 апреля 2009

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

Вопрос в том, как минимизировать эту потерю.

Существует множество алгоритмов, каждый из которых имеет свои сильные и слабые стороны.

Как правило, вы применяете какой-то фильтр к вашему изображению, например, Bilinear или Nearest Neighbor. Вот обсуждение таких фильтров в контексте ImageMagick.

Кроме того, если выходной сигнал будет менее 16 бит на пиксель, вам необходимо выполнить некоторую форму Цветовое квантование .

3 голосов
/ 11 апреля 2009

Я предполагаю, что вы имеете в виду 16-битный дисплей RGB, а не дисплей, каждый из цветов (красный, зеленый и синий) которого равен 16 битам. Я также предполагаю, что вы знаете, как ваши значения r, g и b кодируются в этом 16-битном пространстве, потому что есть две возможности .

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

Учитывая эти предположения, вопрос действительно отвечает, сколько времени у вас есть на вашем устройстве. Если у вас очень быстрое устройство, вы можете реализовать Lanczos resampling . Если у вас менее быстрое устройство, бикубическая интерполяция также работает очень хорошо. Если у вас устройство еще медленнее, билинейная интерполяция ваш друг.

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

2 голосов
/ 11 апреля 2009

Существует множество способов уменьшения изображения, но ни один из них не может гарантировать отсутствие потери качества. В конечном итоге информация теряется в процессе масштабирования.

0 голосов
/ 11 апреля 2009

Поскольку вы уменьшаете в 4 раза, каждый блок пикселей 4x4 в исходном изображении будет соответствовать одному пикселю в выходном изображении. Затем вы можете перебрать каждый блок 4x4 в исходном изображении, а затем уменьшить его до одного пикселя. Простой способ (возможно, не самый лучший) сделать это сокращение - взять среднее или медианное значение компонентов RGB.

Следует отметить, что вы не можете выполнять масштабирование изображения без потери качества изображения, если только для всех блоков исходного изображения каждый пиксель не будет одного цвета (что маловероятно).

0 голосов
/ 11 апреля 2009

У вас есть 16-битные цвета = 2 байта, но в ваших вычислениях вы используете 4 умножителя.
Может быть, вам не нужно уменьшать размер изображения?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...