[0,2^32]或更高范围内的整数值图像.支持MATLAB或/和OpenCV



我想知道是否有人推荐图像格式,该格式支持范围[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);

并且dataresult中的所有值都应该相等。

看看HDF5:https://hdfgroup.org/HDF5/

这实际上是Matlab 7+存储mat文件的格式,尽管Matlab完全放弃了HDF只存储行的严格定义,因为"性能原因",这可能是一个有点问题的处理。Matlab还提供了用于HDF5的低级别和高级别api,尽管如前所述有点奇怪。

您将能够使用任何比特深度和数字格式(ieee754单和双)以及您想要的信道,而没有任何实际限制(默认情况下最多32个维度)。如果你要查看它们,它还可以让你选择一些更适合你个人问题的无损压缩细节——因此文件往往会更小。与tiff一样,您也可以将多个图像(即数据集)存储在一个文件中,HDFView允许以多种方式查看,包括各种调色板中的图像。

每一种有价值的语言/平台都与HDF5绑定,因此可移植性也很好。

相关内容

  • 没有找到相关文章

最新更新