Octave 4.0 `imwrite` png:` BitDepth` 4? - PullRequest
0 голосов
/ 14 мая 2018

Matlab imwrite позволяет мне указывать парные аргументы 'BitDepth',4 при записи 2D uint16 массива в файл '* .png'.imwrite моей Октавы не принимает парные аргументы 'BitDepth',4.Однако я могу осуществлять ограниченный контроль глубины в битах, если масштабирую данные для uint8 и сохраняю их в массив 2D uint8;«* .png» из imwrite в два раза больше размера файла для массива uint16.Я получил идею сделать это, посмотрев на imread, для которого битовая глубина исходного файла изображения определяет тип uint целевой переменной.Предполагая, что тип uint исходного массива двумерных изображений аналогично определяет битовую глубину целевого файла imwrite, uint8 дает битовую глубину 8. Однако я обнаружил, что битовая глубина 2 часто бывает достаточнодля сканирования в оттенках серого с разрешением 100 точек на дюйм. Есть ли простой способ иметь такой произвольный контроль глубины в битах для imwrite?

В сторону: Что касается ссылки на uint16 выше, я не сделалпросто сделай это.По умолчанию это конверсия из цветного RGB.Из веб-поиска я нашел способ конвертации для моей старой Octave 4.0 (без rgb2gray):

im=imread('rgb.jpeg');
[imInd,Ind]=rgb2ind(im);
imGray16=ind2gray(imInd,Ind); imwrite(imGray16,'gray16b.png');
imGray8=uint8(imGray16/256); imwrite(imGray8,'gray8b.png');

Я использую установку Octave, которая является частью Cygwin.Однако у моего ноутбука есть ограниченные права пользователя, и обновление Octave требует феноменального количества времени.

1 Ответ

0 голосов
/ 14 мая 2018

Отвечая на ваш вопрос, вы не можете установить BitDepth при звонке imwrite. Функция запишет изображение с типом данных переменной (при условии, что это поддерживает тип файла изображения).

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

Однако в ваших комментариях есть несколько вещей:

  1. проблема преобразования из uint16 -> uint8 и получения более половины размера, я предполагаю, потому что изображение сжато.

  2. rgb2ind не конвертируется в uint16 по умолчанию. Он преобразуется в uint8 или uint16 в зависимости от количества уникальных цветов в вашем изображении.

  3. функция rgb2gray является частью пакета изображений. Загрузите этот пакет, если вы хотите эту функцию.

...