• 略论图像的分块读写策略


                                    朱金灿

     

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

     

    在大图像处理中磁盘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/图像宽度。

     

     

  • 相关阅读:
    连通图是不是欧拉图
    P1127 词链 题解
    ClickHouse的JDBC连接
    ClickHouse集群搭建和使用
    ClickHouse引擎
    ClickHouse 的安装和使用
    SNMP3安装
    解决springboot打不出业务log
    如何用电脑下载微信视频号中的视频?
    【Swing】如何打开文件选择对话框,选择文件
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6471231.html
Copyright © 2020-2023  润新知