不同块处理
在不同的块处理,你把一个矩阵分成米
——- - - - - -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”
参数。