图像分块原理和实现个人理解和整理
Posted nanke_yh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像分块原理和实现个人理解和整理相关的知识,希望对你有一定的参考价值。
目录
把一幅大尺寸图像分块的目的除为了实现并行处理之外,还能够将子块分次调入内存处理,增强算法的适用性,避免过大图像处理不了的问题。大尺寸图像被分块后,减少了每次运算的数据量和计算压力。
图像分块方式一般存在两种形式:一种是已知分块的数量n*m份,即将源图像的宽高分别分成n和m等份;另一种就是已知子块的宽高Blockwidth×Blockheight,然后从原点开始切分。
1、无重叠分块
针对不重叠的图像分块,以上两种形式可视为相同的,两者之间的对应关系为:n=Width/Blockwidth,m=Height/Blockheight。不重叠子块分割原理如下图所示,其重点是如何在子块像素位置上填充对应的原图像像素值。
如上图,原图像宽高Width、Height,子块宽高Blockwidth、Blockheight,需要分割的份数为n×m,每一个子块的索引可表示为(0,0)、(0,1)、...、(i,j)、...、(n-1,m-1)。找子块与原图像的对应关系重点反映在起始点P上。P为第(i,j)子块的原点,对应原图像的位置是哪里呢?可以发现第(i,j)子块是(0,0)子块向右移动了i*Blockwidth个单位,向下移动了j*Blockheight个单位,如此P在原图像对应位置上的像素应该为SrcImg[j*Blockheight*Width+ i*Blockwidth]。如此同理即可以将(i,j)子块上的所有像素值取到并填充。
根据上面原理介绍,那么假设将宽高分别为Width和Height的源图像srcImg分割成wblock*hblock份,那么每一个子块blockImg获取的代码和分块结果如下:
for (int n = 0;n < hblock;n++)
for (int m = 0;m < wblock;m++)
for (int i = 0;i < blockheight;i++)
for (int j = 0;j < blockwidth;j++)
//逐个像素赋值
blockImg[i*blockwidth+j] = srcImg[(i+n*blockheight)*Width+m*blockwidth+j];
//这里可以对各个子块进行处理
//将源图像分成3*3的结果 |
2、有重叠分块
有重叠分块一般指边缘存在一定重叠区域的大面积子块,而非小块邻域,邻域将主要在后续的滤波中讲到。
有重叠的分块,往往不会规定分割的份数,因为子块之间存在上下左右的重叠,没法直接确定分割的数量。一般是根据子块的宽高和重叠行列情况来计算原图像能够分割出多少个子块。在图像处理中,带有重叠区域的图像主要可用于影像的匹配和配准,乃至镶嵌融合等。
继不重叠分块原理上假设增加上下重叠度为Overlap_y,左右重叠度为Overlap_x。其原理如下图所示:
对于Δy一般会剩余一部分无法形成一个完整的子块,如果有要求,那么得到的分块数量会加1,如果没有,一般是舍弃掉。那么可以得到最终图像分块的数量:
图像横向块数:n=(Height-Overlap_y)/(Blockheight-Overlap_y)
图像纵向块数:m=(Width-Overlap_x)/(Blockwidth-Overlap_x)
在得到子块个数后,获取各个子块内部的像素值的步骤则与前面不重叠分块类似了,重点就是找到起始点的像素索引坐标对应关系。这里将不具体展开和实现了,这部分没有进行代码和实际实现,仅做了理论推演,若存在问题可提出来大家一起讨论。参考的一篇文章中(立体匹配中图像重叠分块的实现方法_VisualMan_whu的专栏-CSDN博客_图像重叠分块)其得到推导公式,没能理解怎么获得的,还是说分块的出发点和对象不一致,有了解的也可以分享一下的。
以上是关于图像分块原理和实现个人理解和整理的主要内容,如果未能解决你的问题,请参考以下文章