略论图像的分块读写策略

                                朱金灿

 

在图像处理系统中一般采取分块读写的办法,因为一般不可能一下子开辟一个大内存把整幅图像读进来。分块读取的道理一般大家都懂,不过如何分块里面却是有学问的。下面谈谈我的看法。

 

在大图像处理中磁盘I/O一般是效率的主要瓶颈。因此如何分块的着眼点应该是如何减少磁盘I/O。一般的图像处理系统采取将块分成256*256或者512*512的块。实际上我认为这是不利于减少磁盘I/O次数。如下图:

 

     

                        

                         分块示意图1

 

假设上图是按照256*256进行分块的,一般而言图像文件在磁盘上是按行存贮的,就是从第一行到最后一行的,那么我们很快就可以看到其中弊端,就是当将数据写入到某一块时,其写入顺序是怎样的呢?首先当然是从块的起始地址写,将块的第一行的数据写入,这时你要问块的第二行数据和第一行数据在连续的?很显然,它们不是连续的,它们相隔图像宽度*通道类型(通道类型32R图像取416U16S28U1),那么你读写时必须先移动文件指针,那么读取一块数据你就需要移动256次文件指针。整幅图像就需要至少移动块数*256次文件指针,这样的磁盘I/O次数有点惊人。

 

   为此我想到一种改进办法,就是采取如下图的分块策略:

 

                         

                                 分块示意图2

 

 这种分块方法就是采取一次读取若干行数据的办法。这种分块方法有两个好处:首先降低了程序的逻辑复杂度,如果采用第一种分块方法,求取某一块的行列起始号较为复杂,因为行列号都要变化,而我这种分块方法,只是行号变化,列号不需变化;其次更为重要的是这种分块方法能大大减少磁盘I/O次数,理由很简单,每一块的每行数据在磁盘上都是连续的,因此在读写时只需将文件指针定位到块的起始位置,就能实现整块的读写。毫无疑问,这种分块方法比前一种分块方法磁盘I/O次数要少很多。

 

 有人会问:你说采取一次读取若干行数据的办法,那么这个若干行采取多大的值较为合适呢?因为每幅图像的宽度是不一样的。其实我们可以通过设定块内存的大小来获得这个若干行。比如你打算块内存的大小为256*256*通道类型(通道类型32R图像取416U16S28U1),那么这个若干行的数值可以是256*256/图像宽度。

 

 

原文地址:https://www.cnblogs.com/lanzhi/p/6471231.html