Как сжать 10-битные данные RAW RGB?

Это может показаться общим вопросом, однако я не смог найти ответ на него. В частности, я использую датчик изображения CMOS со следующими общими возможностями:

  • Размер массива: 1280 x 1024 (SXGA), также может принимать 640 x 480 (VGA)
  • Выходные форматы (10-бит): необработанные данные RGB

Когда я беру SXGA (1280 x 870), я сохраняю файл (прагматически) с расширением .RAW. Размер файла около 1000 КБ. Когда я беру VGA (640 х 480) размер составляет около 300 КБ.

Они уже считаются "сжатыми"? Можно ли сжать их до меньшего размера (возможно, как tiff без потерь, так и jpeg с потерями)?

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

Ссылки для достижения моей цели очень ценятся.

Какова ваша общая цель? Будут ли данные изображения анализироваться с научной точки зрения или они предназначены исключительно для демонстрации? Как вы указали в другом комментарии, время передачи не имеет значения в среде с ограниченной пропускной способностью, поэтому вы можете уточнить это.
Оба. Таким образом, не обязательно должно быть 100% разрешение или четкость. Я ищу хорошее качество с уменьшенным временем передачи, я пытаюсь балансировать между ними.
Просто заархивируйте файлы.
Сжатие без потерь общих данных возможно с помощью zip и многих других процедур. Степень возможного сжатия зависит от энтропии, присутствующей в данных. Поскольку у вас есть дополнительные знания: данные представляют собой изображение (цвет?), это может помочь найти более оптимальное кодирование без потерь. Tiff предлагает сжатие zip (и, возможно, другие, поскольку это открытый расширяемый формат). jpeg2000 и другие форматы предлагают сжатие изображений без потерь, которое может работать лучше, чем zip
FWIW, Класс файлов «raw bitmap», на который ссылается ваша ссылка, отличается от изображений «RAW», которые обсуждаются на этом сайте. Одночиповый цветной датчик изображения не записывает значения RGB для каждого пикселя. Он записывает только красный цвет для некоторых пикселей, только зеленый для некоторых и только синий для других. Изображение RAW с камеры не содержит ничего, кроме этих отдельных одноцветных значений пикселей. Процесс преобразования этого изображения в изображение RGB называется «демозаикой». Я думаю, что камера, которую вы используете, выполняет демозаику за вас, а затем выдает вам RGB-изображение в виде «сырого растрового изображения».
@SolomonSlow Я не думаю, что он делает демозаику, потому что, когда я конвертирую его в JPEG с помощью MATLAB, он кажется серым, но когда я демозаику, а затем конвертирую, он становится цветным
Ой! Я действительно не читал техпаспорт. Я исходил из того, что вы говорили о получении изображений разных размеров с камеры. Это часто означает вывод демозаики, но, согласно спецификации, даже изображения меньшего размера с этой камеры действительно имеют формат RAW.
@Sarahcartenz Что вы используете для подключения и получения данных от датчика? Что ты фотографируешь? Какова ваша «цель»?
@SolomonSlow Это сложнее. «Красные» фильтры пропускают немного зеленого и синего света и наоборот. Все это измеряется как одно значение яркости. Цвет «красных» фильтров редко, если вообще когда-либо, совпадает с цветом «красного» в наших устройствах вывода RGB. То же самое для «G» и «B».
@xiota технически, я использую камеру, в которой используется микроконтроллер PIC и буфер памяти, чтобы получать данные изображения с датчика, описанного выше. Затем я использую связь UART для передачи изображения в мою файловую систему через буфер. Моя цель — сжать эти RAW-данные, чтобы я мог передавать их по воздуху. Это отвечает на вопрос?
@MichaelC, я не собирался начинать дискуссию о математике демозаики. Я только хотел обратить внимание на тот факт, что каждый пиксель файла RAW имеет только одно значение, представляющее одно из трех возможных значений цвета, тогда как более типичный файл цветного изображения имеет (или может быть декодирован для получения) три значения цвета на пиксель.
@xiota Я фотографирую природу, цель если для показа, никакой дальнейшей обработки, только просмотр.
@SolomonSlow Но очень важный момент заключается в том, что необработанные данные не имеют значений цвета. Он имеет только значения яркости. Каждая «пиксельная ячейка» записывает значения яркости в широком диапазоне длин волн. Длины волн, разрешенные для каждого цветового фильтра, значительно перекрываются с длинами волн, разрешенными для двух других фильтров, точно так же, как длины волн, к которым чувствительны каждый тип колбочек в нашей сетчатке. Поскольку цвета фильтров не совпадают с цветами наших систем цветопередачи, все три значения необходимо интерполировать.
Говорить, что «зеленые» отфильтрованные пиксели записывают значение яркости только для «зеленых», в корне неверно.
@MichaelC, я этого не говорил.
@SolomonSlow Вы сказали: «Одночиповый цветной датчик изображения не записывает значения RGB для каждого пикселя. Он записывает только красный цвет для некоторых пикселей, только зеленый для некоторых и только синий для других. Изображение RAW с камеры ничего не содержит. но эти отдельные одноцветные значения пикселей». Это в корне неверно. Каждый сенсор записывает значение яркости, включающее часть света всех трех диапазонов. Но каждый сенсор наиболее чувствителен к свету, наиболее близкому к цвету покрывающего его фильтра. Цвет этих фильтров не соответствует длинам волн света, который мы используем для цветопередачи...
... системы для каждого из испускаемых субпикселей «R», «G» и «B» для каждого пикселя RGB на выходе.
@MichaelC, я бы сказал, «упрощенно», а не «в корне неправильно». У меня не было намерения начинать дискуссию о математике демозаики. Я только хотел обратить внимание на структурную разницу между RAW-изображением и «нормальным» изображением. Я не хотел вдаваться в подробности, которые вряд ли помогут ответить на первоначальный вопрос ОП о том, как сжимать данные RAW.
«Структурное различие» между необработанными данными датчика и цветным изображением заключается в том, что необработанные данные содержат только монохроматические значения яркости для каждого сенсора. Это принципиально отличается от любой формы вывода, которая включает значения для нескольких цветов для каждого пикселя результирующего изображения. Делать вывод о том, что необработанные данные изображения содержат какое-либо значение цвета на уровне «пикселя» (измеренный выходной сигнал от одного датчика на датчике), вводит в большое заблуждение, и почему многие даже не начинают понимать, какую информацию содержит необработанный файл, а также что он не содержит. Чтобы понять это, не требуется никакой математики.

Ответы (1)

1280*1024*10/8 = 1638400 байт.
640*480*10/8=384000.

Все, что меньше этого, должно быть сжато. В частности, если вы видите разные размеры файлов в зависимости от содержимого изображения, вы знаете, что происходит некоторое сжатие.

Но на самом деле, если вы хотите что-то сделать с данными, вам в любом случае нужно знать формат изображения, а если вы знаете, как его декодировать, то знаете, сжато оно или нет.

Получив декодированное изображение, вы можете сохранить его в любом другом формате, будь то TIFF или JPEG.

Вы можете, конечно, также попытаться заархивировать необработанные файлы.

Причина, по которой его необходимо сжать до меньшего размера, заключается в том, что после сохранения в файле RAW он должен передаваться по воздуху с ограниченной пропускной способностью, вся остальная обработка будет выполняться в части приемника. Меньший размер позволит ему передавать за более короткое время, где время имеет существенное значение в этом приложении. В любом случае я могу сжать без декодирования?
как я уже сказал, застегни его. (или любой другой вариант алгоритма сжатия общего назначения). по определению вы не можете применять алгоритмы, специфичные для изображения, без предварительного получения изображения, т.е. расшифровка.
Вы не можете заархивировать файл изображения, как текстовый файл. Это просто так не работает.
@ths, если вы имеете в виду «декодировать», как при просмотре, то я могу декодировать его в файл BMP. Теперь вы говорите, что его BMP я могу сжать во что-то меньшее (например, JPEG)? Но как RAW я могу только ZIP его исправить?
Таким образом, мы говорим не о необработанном файле камеры, мы говорим о данных прямо с чипа обработки изображений. В этом случае это не место здесь, оно принадлежит переполнению стека. Это выходит за рамки «фотографии» и касается обработки данных.
верно. но преобразование его в JPEG с потерями само по себе не является сжатием; это изменяет фактические данные изображения.
Я только что обнаружил, что функция (imwrite) в mathlab берет массив изображений, как и мой, и конвертирует его в JPEG, что уменьшает размер. Это означает, что мне не нужно ZIP прямо, как описано. Однако это немного сбивает с толку. mathworks.com/help/matlab/ref/imwrite.html
@Sarahcartenz Обратите внимание, что преобразование необработанного файла в JPEG является операцией с потерями как при преобразовании, так и потому, что сам JPEG использует алгоритм сжатия с потерями. Это может или не может быть хорошо для вашей цели.
обратите внимание, что необработанное изображение ~ 300 КБ для цветной камеры 640x480 означает, что вам также нужен шаг демозаики перед сжатием jpeg - в противном случае вы будете сжимать байеровский шаблон в градациях серого, что является наименее разумным, что вы можете сделать с jpeg
Быстрый вопрос: если я использую сжатие без потерь, такое как zip, и во время передачи некоторые данные теряются или некоторые биты переворачиваются, можно ли их успешно распаковать?