史蒂夫与MATLAB图像处理

图像处理的概念、算法和MATLAB

TIFF、BigTIFF blockproc

我想欢迎回来客人博阿施施Uthama对于今天的帖子。阿施施,开发人员在图像处理工具箱的团队,这里发布之前失败的神秘TIFF附加循环

内容

简要介绍TIFF格式

TIFF文件是,标记图像文件格式(TIFF)。顾名思义,文件本身由一大堆“标签”和相应的值。例如,所有TIFF文件预计ImageWidth和ImageLength标记,其值是图像的宽度和长度(高度)存储在。

这种格式的一个核心特征在于图像数据被组织在一个物理文件。TIFF允许图像数据存储在块“砖”或“条”。你可以把一条作为瓷砖的宽度是一样的形象。格式存储偏移量为每个这些条或瓦片图像标题。这允许高效的图像中任何一部分随机存取。最初的TIFF格式规范要求使用32位文件偏移值。我猜你可以想象,我要与比特的信息。32位意味着最大值2 ^ 32抵消。请注意,这些都是文件的偏移量从一开始。实际上,32位的要求限制了最大可能的TIFF文件的大小是4 g。 This was fine for a long time (The earliest TIFF release was in 1986), but we now have more data producers hitting this limit.

进入BigTIFF

libtiff社区志愿者组织松散的软件开发人员,维护和发展libtiff库。LibTIFF实现例程来操纵TIFF文件。从版本4.0.0 LibTIFF,他们包括变体TIFF格式,使用64位的偏移量而不是32位。你可以想象,这允许很大的TIFF文件。这变种是适当的BigTIFF。注意,这个潜在的改变导致BigTIFF 32位抵消TIFF格式的不兼容的变体(现在称为经典格式)。libtiff BigTIFF支持的第一个稳定版本出来及时为我们能够有资格与MATLAB R201万博1manbetx2b测试它出去。

在MATLAB 万博1manbetxBigTIFF支持

正如我在介绍中提到的,有标签和值TIFF文件。这种方法的灵活性给格式很多类型的数据可以保存,是的,与伟大的灵活性是伟大的复杂性。

阅读在MATLAB BigTIFF文件没有不同于阅读经典(32位抵消)版本TIFF文件。imread和它的所有TIFF相关选项BigTIFF一起工作。BigTIFF文件,最相关的选项是“PixelRegion”参数。如果一个BigTIFF图像文件太大了,适合在系统内存中,您可以使用这个参数加载图像的一小部分。imwrite可以很容易地写出经典的TIFF文件。然而,写出BigTIFF文件稍微复杂一些。假设使用的关键imwrite是整个图像数据在内存中可以作为一个矩阵,BigTIFF东西不一定如此。Tiff图像可以复杂,可能有数百个不同的标记值的组合。此外,执行规则(见格式表2、3、4和5)法律标签的组合值。

MATLAB提供了一个通向LibTIFF库例程通过Tiff。这个接口支持万博1manbetx60标签,允许MATLAB用户工作与广泛的TIFF文件。此外,该界面还支持使用BigTIFF文件。万博1manbetx这是一个使用的代码片段Tiff类写一个(尽管小)BigTIFF文件:

imdata = imread (“example.tif”);% ' w '将创建一个经典的TIFF文件%的w8将创建一个BigTIFF文件%这个选项是唯一的区别在编写这两种格式。bt = Tiff (“myfile.tif”,“w8”);

关于下面的标签使用的更多信息在这里

标签。ImageLength =大小(imdata, 1);标签。ImageWidth =大小(imdata, 2);标签。光度= Tiff.Photometric.RGB;标签。BitsPerSample = 8;标签。SamplesPerPixel =大小(imdata, 3); tags.TileWidth = 128; tags.TileLength = 128; tags.Compression = Tiff.Compression.JPEG; tags.PlanarConfiguration = Tiff.PlanarConfiguration.Chunky; tags.Software =MATLAB的;setTag (bt、标签);写(bt, imdata);关闭(bt);

用BigTIFF BLOCKPROC(图像处理工具箱)

图像的存储和检索能力部分瓷砖让TIFF图像适合图像处理工具箱函数blockprocblockproc旨在处理庞大的数据,也有一个并行模式,利用并行计算工具箱功能运行在大型集群。阅读是由支万博1manbetx持TIFF文件imread在底层,因此blockproc继承了读取BigTIFF文件的能力。然而,编写支持仅限于经典TIF万博1manbetxF文件。要启用blockproc写出一个BigTIFF文件,我们需要一个自定义图像适配器。布伦丹博客关于这个时候回来。我整理一个简单BigTIFF作家图像适配器根据他的博客。也可用文件交换下载。

类型bigTiffWriter.m
classdef bigTiffWriter < ImageAdapter % bigTiffWriter -基本图像适配器写大TIFF文件。% %一个简单的ImageAdapter类实现一个Tiff作家为使用BLOCKPROC ImageAdapter %对象。% -瓷砖尺寸必须是16的倍数。%,只有uint8, RGB输入图像数据支持。万博1manbetx% %基于“不支持的格式处理数据”# bse_q4y-1 % % % ht万博1manbetxtps://www.tianjin-qmedu.com/help/toolbox/images/f7 - 12726. - html例子:% % % % %设置文件名和获取信息从输入文件大小。% inFile =“example.tif”;% inFileInfo = imfinfo (inFile);%输出文件=“out.tif”;% % % % %与瓷砖的大小创建一个输出TIFF文件128 x128 % tileSize = (128、128);% 16的倍数。 % outFileWriter = bigTiffWriter(outFile, inFileInfo(1).Height, inFileInfo(2).Width, tileSize(1), tileSize(2)); % %% % % Now call blockproc to rearrange the color channels. % blockproc(inFile, tileSize, @(b) flipdim(b.data,3), 'Destination', outFileWriter); % outFileWriter.close(); % imshowpair(imread(inFile), imread(outFile),'montage'); % % See also: blockproc, Tiff, Tiff/writeEncodedTile % % Copyright 2013 The MathWorks, Inc. properties(GetAccess = public, SetAccess = private) Filename; TiffObject; TileLength; TileWidth; end methods function obj = bigTiffWriter(fname, imageLength, imageWidth, tileLength, tileWidth) % Constructor validateattributes(fname, {'char'}, {'row'}); validateattributes(imageLength, {'numeric'},{'scalar'}); validateattributes(imageWidth, {'numeric'},{'scalar'}); validateattributes(tileLength, {'numeric'},{'scalar'}); validateattributes(tileWidth, {'numeric'},{'scalar'}); if(mod(tileLength,16)~=0 || mod(tileWidth,16)~=0) error('bigTiffWriter:invalidTileSize',... 'Tile size must be a multiple of 16'); end obj.Filename = fname; obj.ImageSize = [imageLength, imageWidth, 1]; obj.TileLength = tileLength; obj.TileWidth = tileWidth; % Create the Tiff object. obj.TiffObject = Tiff(obj.Filename, 'w8'); % Setup the tiff file properties % See "Exporting Image Data and Metadata to TIFF files % //www.tianjin-qmedu.com/help/techdoc/import_export/f5-123068.html#br_c_iz-1 % obj.TiffObject.setTag('ImageLength', obj.ImageSize(1)); obj.TiffObject.setTag('ImageWidth', obj.ImageSize(2)); obj.TiffObject.setTag('TileLength', obj.TileLength); obj.TiffObject.setTag('TileWidth', obj.TileWidth); obj.TiffObject.setTag('Photometric', Tiff.Photometric.RGB); obj.TiffObject.setTag('BitsPerSample', 8); obj.TiffObject.setTag('SampleFormat', Tiff.SampleFormat.UInt); obj.TiffObject.setTag('SamplesPerPixel', 3); obj.TiffObject.setTag('PlanarConfiguration', Tiff.PlanarConfiguration.Chunky); end function [] = writeRegion(obj, region_start, region_data) % Write a block of data to the tiff file. % Map region_start to a tile number. tile_number = obj.TiffObject.computeTile(region_start); % If region_data is greater than tile size, this function % warns, else it will silently pad with 0s. obj.TiffObject.writeEncodedTile(tile_number, region_data); end function data = readRegion(~,~,~) %#ok % Not implemented. error('bigTiffWriter:noReadSupport',... 'Read support is not implemented.'); end function close(obj) % Close the tiff file obj.TiffObject.close(); end end end

让我们运行所包括的示例:

设置文件名和获取信息从输入文件大小。

inFile =“example.tif”;inFileInfo = imfinfo (inFile);输出文件=“out.tif”;

创建一个输出与瓷砖大小为128 x128 TIFF文件

tileSize = (128、128);% 16的倍数。outFileWriter = bigTiffWriter(输出文件,inFileInfo (1)。高度,inFileInfo (2)。宽度,tileSize (1) tileSize (2));

现在叫blockproc重新排列的颜色通道。

blockproc (inFile tileSize, @ (b) flipdim (b.data, 3),“目的地”,outFileWriter);outFileWriter.close ();imshowpair (imread (inFile) imread(输出文件),“蒙太奇”);

这个适配器可以作为一个起点为您的特定标记编写更复杂的作家适配器Tiff格式的组合。你处理大型图像数据吗?你,或者你会使用BigTIFF为你工作吗?做让我们知道!




发表与MATLAB®R2013a

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。