我想知道是否有人推荐图像格式,该格式支持范围[0,2^32]或更高的整数值图像,例如[0],2^64]。我对MATLAB(如果可能的话,OpenCV)可能已经支持的解决方案感兴趣,也就是说,具有read&在MATLAB和C/C++(例如OpenCV)中对此类图像进行写访问。
我可以写我自己的读/写库,但我想避免重新发明轮子。如果不存在这样的库,我对通用格式感兴趣,这些格式将有助于实现此类图像的读/写库。
注意:我相信MATLAB对.png
文件中索引图像的支持仅限于[0,2^16]范围中的整数
感谢
您可以尝试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)
正如您所注意到的,PNG图像的灰度图像深度可达16。然而,您可以偷偷地将32位或64位的数据转换为一组红色、绿色、蓝色和alpha通道,并将其保存为具有alpha透明度的真彩色RGB图像,这将为您提供4个通道,每个通道16位,总共64位。
以下是几个例子。。。
在PNG文件中存储64位值:
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
。
在PNG文件中存储32位数据:
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
中的所有值都应该相等。
看看HDF5:https://hdfgroup.org/HDF5/
这实际上是Matlab 7+存储mat文件的格式,尽管Matlab完全放弃了HDF只存储行的严格定义,因为"性能原因",这可能是一个有点问题的处理。Matlab还提供了用于HDF5的低级别和高级别api,尽管如前所述有点奇怪。
您将能够使用任何比特深度和数字格式(ieee754单和双)以及您想要的信道,而没有任何实际限制(默认情况下最多32个维度)。如果你要查看它们,它还可以让你选择一些更适合你个人问题的无损压缩细节——因此文件往往会更小。与tiff一样,您也可以将多个图像(即数据集)存储在一个文件中,HDFView允许以多种方式查看,包括各种调色板中的图像。
每一种有价值的语言/平台都与HDF5绑定,因此可移植性也很好。