matlab:读取图像的子部分
Posted
技术标签:
【中文标题】matlab:读取图像的子部分【英文标题】:matlab: read subsection of an image 【发布时间】:2012-04-18 08:58:00 【问题描述】:我有一系列大图像,我想加载到 matlab 中,然后也进行一些处理。由于图像大小,读取它们需要很长时间,并且会很快填满计算机内存。
但是,我只对图像的中间部分感兴趣,大约 100 x 100 像素左右的区域。
有没有办法只读取图像的那个部分,从而节省时间和内存?
目前我正在使用:
ROIx = 450:550;
ROIy = 650:750;
image = double( imread( filename ) );
image = image(ROIx, ROIy);
但是,imread() 会加载整个图像,这需要很长时间。有没有办法只阅读我感兴趣的部分?
(一个过程是将每个图像裁剪成一个较小的图像并重新保存。但我不想裁剪图像)。
谢谢, 实验室垃圾
【问题讨论】:
您既没有指定文件格式、位深度也没有指定颜色模型(灰度、RGB 或其他?)。这些数据将有助于寻找替代解决方案。 它们是灰度、1024 x 1392 像素、16 位 tiff 图像。 我认为 Matlab 没有任何简单的方法可以做到这一点。根据格式,您可能可以使用memory mapping 编写自己的图像加载器以随机访问文件。不过,您需要对格式有非常深刻的理解才能编写它。 Matlab 似乎不太可能无法加载单个 1024 x 1392 16 位图像。你一次加载多少?加载单个图像时是否会耗尽内存? 似乎一个通用的 TIFF 加载器的编码会相当复杂,但如果您使用的 TIFF 仅由一个具有相同图像参数(大小、位深度、打包等)的程序生成,则任务会轻松很多。 TIFF 规范似乎有一个 StripOffsets 字段,然后从 StripOffsets 你可以得到每一行的偏移量,我想。但是,数据的解释并非易事,因为 TIFF 支持几种不同的压缩方法。如果您使用的是 Linux,您可以尝试cmp -l -n 142 image1.tiff image2.tiff
来查看文件之间的哪些标头字节存在差异。
【参考方案1】:
Matlab 2012a 表明您可以从 JPEG2000 和 TIFF 图像中读取部分图像。查看 imread 的文档,检查选项 'PixelRegion' 以读取 TIFF。
【讨论】:
【参考方案2】:您将需要使用fopen 之类的东西来打开文件并手动读取部分内容。当然,您将需要处理大量的编码/解码。或者反之,如果您遇到内存不足错误,请增加系统的swap space.。
【讨论】:
以上是关于matlab:读取图像的子部分的主要内容,如果未能解决你的问题,请参考以下文章