主要内容

使用列处理来加速滑动邻域或不同块操作

如果可能的话,按列执行滑动邻域和不同块操作可以减少处理图像所需的执行时间。

例如,假设您正在执行的操作涉及计算每个块的平均值。如果首先将数据块重新排列为列,则计算速度会快得多,因为只需调用的意思是函数,而不是调用的意思是对于每个块单独。

若要使用列处理,请使用colfilt函数。这个函数

  1. 将图像矩阵的每个滑动块或不同块重新塑造为临时矩阵中的一列

  2. 将临时矩阵传递给指定的函数

  3. 将生成的矩阵重新排列回原始形状

使用带滑动邻域操作的列处理

对于滑动邻域操作,colfilt创建一个临时矩阵,其中原始图像中的每个像素都有一个单独的列。与给定像素相对应的列包含该像素的邻域值。

下图说明了这个过程。在这个图中,一个6 × 5的图像矩阵在2 × 3的邻域中被处理。colfilt为图像中的每个像素创建一列,因此临时矩阵中总共有30列。每个像素的列包含其邻域像素的值,因此有六行。colfilt必要时对输入图像进行零填充。例如,图中左上像素的邻域有两个零值邻域,这是由于零填充。

colfilt为滑动邻域创建一个临时矩阵

临时矩阵被传递给一个函数,该函数必须为每一列返回一个值。(许多MATLAB®函数是这样工作的,例如,的意思是中位数性病总和等)然后将结果值分配给输出图像中的适当像素。

colfilt能产生与nlfilter执行时间更快;然而,它可能会使用更多的内存。下面的示例将每个输出像素设置为输入像素邻域中的最大值,产生与nlfilter示例见实现线性和非线性滤波滑动邻域操作

I2 = colfilt(I,[3 3],“滑动”, @max);

使用具有不同块操作的列处理

对于一个不同的块操作,colfilt通过将图像中的每个块重新排列为一列来创建临时矩阵。colfilt如果有必要,在创建临时矩阵之前,用0填充原始图像。

下图说明了这个过程。一个6 × 16的图像矩阵在4 × 6的块中处理。colfilt首先对图像进行零填充,使其大小为8 × 18(6个4 × 6块),然后将这些块重新排列为6列,每列有24个元素。

colfilt为不同块操作创建一个临时矩阵

在将图像重新排列成临时矩阵后,colfilt将这个矩阵传递给函数。函数必须返回一个与临时矩阵相同大小的矩阵。如果块大小为——- - - - - -n,图像为毫米——- - - - - -神经网络,临时矩阵的大小为(m * n)——- - - - - -(装天花板(毫米/米)*装天花板(nn / n)).在函数处理临时矩阵后,输出被重新排列成原始图像矩阵的形状。

这个示例将图像的每个8 × 8块中的所有像素设置为该块的平均像素值。

I = im2double(imread(“tire.tif”));F = @(x) ones(64,1)*mean(x);I2 = colfilt(I,[8 8],“不同”f);

示例中的匿名函数计算块的平均值,然后将结果乘以以1为单位的向量,以便输出块与输入块大小相同。因此,输出图像与输入图像的大小相同。

限制

你可以使用colfilt来实现许多相同的截然不同的块操作blockproc执行。然而,colfilt有一定的限制blockproc不:

  • 输出图像必须与输入图像大小相同。

  • 这些块不能重叠。

对于不满足这些约束的情况,请使用blockproc