使用列处理来加速滑动邻域或不同块操作
如果可能的话,按列执行滑动邻域和不同块操作可以减少处理图像所需的执行时间。
例如,假设您正在执行的操作涉及计算每个块的平均值。如果首先将数据块重新排列为列,则计算速度会快得多,因为只需调用的意思是
函数,而不是调用的意思是
对于每个块单独。
若要使用列处理,请使用colfilt
函数。这个函数
将图像矩阵的每个滑动块或不同块重新塑造为临时矩阵中的一列
将临时矩阵传递给指定的函数
将生成的矩阵重新排列回原始形状
使用带滑动邻域操作的列处理
对于滑动邻域操作,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
.