文档

不同块处理

不同的块处理,你把一个矩阵分成——- - - - - -n部分。这些部分,或不同的块,从左上角开始覆盖图像矩阵,没有重叠。如果块不能完全覆盖图像,则可以向图像添加填充,或者在图像的右侧或底部边缘使用部分块。下图显示了一个15 × 30的矩阵被划分为4 × 8的块。右侧和底部边缘有部分块。您可以按原样处理部分块,或者您可以填充图像,使结果大小为16 × 32。有关更多信息,请参见应用填充.(要对图像一次操作一个像素,而不是一次操作一个块,请使用滑动邻域处理函数。有关更多信息,请参见滑动邻域运算.)

图像划分为不同的块

使用blockproc函数实现块处理

要执行不同的块操作,请使用blockproc函数。的blockproc函数从图像中提取每个不同的块,并将其传递给指定的函数进行处理。的blockproc函数组装返回的块以创建输出图像。

例如,下面的命令处理映像在25 * 25块的函数中myfun.在这种情况下,myfun函数调整块的大小以生成缩略图。(有关函数句柄的更多信息,请参见创建函数句柄(MATLAB)。有关匿名函数的详细信息,请参见匿名函数(MATLAB)。)

Myfun = @(block_struct) imresize(block_struct.data,0.15);I = imread('tire.tif');I2 = blockproc(I,[25 25],myfun);

请注意

由于块边缘效果,调整图像大小使用blockproc不会产生与一次性调整整个图像大小相同的结果。

下面的示例使用blockproc函数将图像的每个32 × 32块中的每个像素设置为该块中元素的平均值。匿名函数计算块的平均值,然后将结果乘以1的矩阵,使输出块与输入块大小相同。因此,输出图像与输入图像的大小相同。的blockproc函数不要求图像大小相同。如果这是你想要的结果,请确保你指定的函数返回适当大小的块:

Myfun = @(block_struct)…uint8(非常刻薄的(block_struct.data) *……的(大小(block_struct.data)));I2 = blockproc('moon.tif',[32 32],myfun);图;imshow(“moon.tif”);图;imshow (I2, []);

请注意

很多操作blockproc如果在矩阵列上执行计算,而不是在矩形块上执行,则可以实现运行得更快。有关此方法的信息,请参见使用列处理来加速滑动邻域或不同块操作

应用填充

当以块为单位处理图像时,出于以下两个原因,您可能希望添加填充:

  • 解决部分区块的问题

  • 创建重叠的边界

如在不同块处理,如果块不完全适合图像,则部分块出现在图像的底部和右侧边缘。默认情况下,这些部分块按原样处理,没有额外的填充。设置“PadPartialBlocks”参数真正的以填充图像的右侧或底部边缘,并使块全尺寸。

您还可以为每个块添加边框。使用“BorderSize”参数指定块外像素的额外行和列,在处理块时将考虑这些值。当有边界时,blockproc将扩展块(包括边框)传递给指定函数。

图像划分为具有指定边界的不同块

使用函数句柄处理上图中的块myfun时,呼叫为:

B = blockproc (8 [4], myfun,“BorderSize”,[1 - 2],…“PadPartialBlocks”,真的)

部分块的填充和块边界都增加了图像的整体大小,如图所示。由于部分块的填充,原来的15 × 30矩阵变成了16 × 32矩阵。此外,图像中的每个块都使用1 × 2像素的边界进行处理——顶部和底部边缘有一个额外的像素,左侧和右侧边缘有两个像素。沿着图像边缘的块(扩展到包括边界)扩展到超出原始图像的边界。沿着图像边缘的边界像素将输入矩阵的最终大小增加到18 × 36。图中最外层的矩形描绘了添加了所有填充后图像的新边界。

默认情况下,blockproc用零填充图像。如果需要不同类型的填充,请使用blockproc函数的“PadMethod”参数。

这个话题有用吗?