Целочисленные изображения в диапазоне [0, 2 ^ 32] или выше. Поддержка в MATLAB или OpenCV? - PullRequest
4 голосов
/ 15 июня 2011

Мне было интересно, есть ли у кого-нибудь рекомендация для формата изображения , который поддерживает целочисленные изображения в диапазоне [0, 2 ^ 32] или выше, например, [0, 2 ^ 64] . Меня интересуют решения, которые уже могут поддерживаться MATLAB (и, если возможно, OpenCV), то есть форматы изображений с поддержкой библиотек с доступом для чтения и записи в MATLAB и C / C ++ (например, OpenCV ) для такие образы.

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

Примечание : Я считаю, что поддержка MATLAB индексированных изображений в файлах .png ограничена целыми числами в диапазоне [0, 2 ^ 16]

Спасибо

Ответы [ 3 ]

4 голосов
/ 15 июня 2011

Вы можете попробовать TIFF.

MATLAB имеет мощный интерфейс: http://www.mathworks.com/help/techdoc/ref/tiffclass.html

Например, посмотрите здесь: http://www.mathworks.com/help/techdoc/import_export/f5-123068.html#br_c_iz-1

или:

t = Tiff('uint32.tif','w');

imgdata=uint32(magic(10));
tagstruct.ImageLength = size(imgdata,1)
tagstruct.ImageWidth = size(imgdata,2)
tagstruct.Photometric = Tiff.Photometric.MinIsBlack
tagstruct.BitsPerSample = 32;
tagstruct.SampleFormat = Tiff.SampleFormat.UInt;
tagstruct.SamplesPerPixel = 1
tagstruct.RowsPerStrip = 16
tagstruct.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky
tagstruct.Software = 'MATLAB'
t.setTag(tagstruct)

t.write(imgdata);

t.close();

info = imfinfo('uint32.tif');

data = imread('uint32.tif');
class(data)
3 голосов
/ 15 июня 2011

Как вы заметили, PNG-изображения могут иметь битовую глубину до 16 для полутоновых изображений . Тем не менее, вы можете быть хитрыми и конвертировать свои 32-битные или 64-битные данные в набор красного, зеленого, синего и альфа-каналов и сохранять их как RGB-изображение настоящего цвета с альфа-прозрачностью, что даст вам 4 канала из 16 каждый бит для работы с 64 битами.

Вот несколько примеров ...


Сохранение 64-битного значения в файле PNG:

64-разрядное число можно разбить на 4 16-разрядных числа и сохранить следующим образом:

value = intmax('uint64')-1;  %# Sample 64-bit value

%# Writing the value to a file:

redChannel = uint16(bitshift(value,-48));                  %# 16 bits for red
greenChannel = uint16(bitand(bitshift(value,-32),65535));  %# 16 bits for green
blueChannel = uint16(bitand(bitshift(value,-16),65535));   %# 16 bits for blue
alphaChannel = uint16(bitand(value,65535));                %# 16 bits for alpha
imageData = cat(3,redChannel,greenChannel,blueChannel);    %# Concatenate color
                                                           %#   channels to 3-D
imwrite(imageData,'test.png','Alpha',alphaChannel);        %# Create the file

%# Reading the value from the file:

[imageData,~,alphaChannel] = imread('test.png');    %# Load the image data
result = bitshift(uint64(imageData(:,:,1)),48)+...  %# Recover the 64-bit value
         bitshift(uint64(imageData(:,:,2)),32)+...
         bitshift(uint64(imageData(:,:,3)),16)+...
         uint64(alphaChannel);

И вы должны увидеть, что исходное 64-разрядное число value равно восстановленному 64-разрядному числу result.


Хранение 32-битных данных в файле PNG:

32-битные данные можно разбить на 4 набора 8-битных данных и сохранить следующим образом:

data = [0 100 1000 2^32-1];  %# Sample vector of double values
data = uint32(data);         %# Convert to unsigned 32-bit values

%# Writing the data to a file:

redChannel = uint8(bitshift(data,-24));                  %# 8 bits for red
greenChannel = uint8(bitand(bitshift(data,-16),255));    %# 8 bits for green
blueChannel = uint8(bitand(bitshift(data,-8),255));      %# 8 bits for blue
alphaChannel = uint8(bitand(data,255));                  %# 8 bits for alpha
imageData = cat(3,redChannel,greenChannel,blueChannel);  %# Concatenate color
                                                         %#   channels to 3-D
imwrite(imageData,'test.png','Alpha',alphaChannel);      %# Create the file

%# Reading the data from the file:

[imageData,~,alphaChannel] = imread('test.png');    %# Load the image data
result = bitshift(uint32(imageData(:,:,1)),24)+...  %# Recover the 32-bit values
         bitshift(uint32(imageData(:,:,2)),16)+...
         bitshift(uint32(imageData(:,:,3)),8)+...
         uint32(alphaChannel);

И все значения в data и result должны быть равны.

1 голос
/ 21 апреля 2015

Взгляните на HDF5: https://hdfgroup.org/HDF5/

На самом деле это формат, в котором Matlab 7+ хранит файлы матов, хотя Matlab полностью отбрасывает строгое определение, что HDF хранит только основные строки для «производительности».причины ", с которым может быть немного проблематично иметь дело.Matlab также обеспечивает низко- и высокоуровневые apis для работы с HDF5, хотя и несколько странно, как указано ранее.

Вы сможете работать с любыми битовыми глубинами и числовыми форматами (например, с одинарным и двойным числом 754) иканалы, которые вы хотите без каких-либо практических ограничений (до 32 измерений по умолчанию).Это также позволяет вам выбрать некоторые детали сжатия без потерь, лучше подходящие для ваших индивидуальных проблем, если вы хотите их рассмотреть - в результате файлы, как правило, становятся меньше.Как и TIFF, вы также можете хранить несколько изображений (то есть наборов данных) в одном файле, а HDFView позволяет просматривать их различными способами, включая изображения во всех видах палитр.

Каждый язык / платформа, достойная своей соли, имеетпривязка к HDF5, поэтому переносимость также велика.

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