主要内容

不同块处理

不同的块处理,将图像矩阵划分为矩形块,并在各个块上执行图像处理操作。块从左上角开始,完全覆盖图像,没有重叠。如果块不完全适合图像,那么任何不完整的块都被认为是部分块。图中显示了一个15 × 30像素的图像被划分为4 × 8像素块。右侧和底部边缘有部分块。

图像划分为不同的块

您可以按原样处理部分块,或者您可以向图像添加填充,以便图像大小是块大小的倍数。有关更多信息,请参见应用填充

使用blockproc函数实现块处理

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

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

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);

请注意

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

应用填充

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

  • 当图像大小不是块大小的倍数时,处理部分块。

  • 为每个块创建重叠的边界。

默认情况下,部分块按原样处理,没有额外的填充。设置“PadPartialBlocks”参数真正的以填充图像的右侧或底部边缘,并使块全尺寸。

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

例如,该命令处理图像一个在4 × 8像素块中,在每个块周围添加1 × 2像素的边框,并在完整块大小中添加零填充部分块。在处理过程中,该像素边界将每个块的顶部和底部边缘扩展一个像素,并沿左右边缘扩展两个像素。该图描述了一个示例图像一个并以灰色表示添加到三个样本块的像素边界。

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

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

部分块的填充和块边框都增加了图像的整体大小一个,如图所示。由于填充了部分块,原始的15 × 30像素图像的大小增加到块大小的下一个倍数,在本例中为16 × 32像素。由于每个块都添加了1 × 2像素的边界,因此沿图像边缘的块包括超出原始图像边界的像素。沿图像边缘的边界像素将输入矩阵的有效大小增加到18 × 36像素。图中最外层的矩形描绘了添加了所有填充后图像的新边界。

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

相关的话题