Main Content

blockproc

图像的非重复块处理

说明

示例

B = blockproc(A,[m n],fun) 通过对大小为 [m n] 的每个非重叠图像块应用 fun 函数并将结果串联到输出图像 B 中,来处理输入图像 A

示例

B = blockproc(src_filename,[m n],fun) 处理文件名为 src_filename 的图像,一次读取和处理一个图像块。此语法对于处理大型图像很有用。

B = blockproc(adapter,[m n],fun) 处理由 adapter(一个 ImageAdapter 对象)指定的源图像。如果您需要自定义 API 来读写特定图像文件格式,请使用此语法。

示例

B = blockproc(___,Name,Value) 使用名称-值对组参量来控制图像块行为的各个方面。

示例

全部折叠

将图像读入工作区。

I = imread('pears.png');

创建图像块处理函数。

fun = @(block_struct) imresize(block_struct.data,0.15);

逐块处理图像。

I2 = blockproc(I,[100 100],fun);

显示原始图像和处理后的图像。

figure;
imshow(I);

figure;
imshow(I2);

创建图像块处理函数。

fun = @(block_struct) ...
   std2(block_struct.data) * ones(size(block_struct.data));

执行图像块处理运算,以文件名指定输入图像。

I2 = blockproc('moon.tif',[32 32],fun);

显示原始图像和处理后的版本。

figure;
imshow('moon.tif');

figure;
imshow(I2,[]);

将图像读入工作区。

I = imread('peppers.png');

创建图像块处理函数。

fun = @(block_struct) block_struct.data(:,:,[2 1 3]);

执行图像块处理运算。

blockproc(I,[200 200],fun,'Destination','grb_peppers.tif');

显示原始图像和处理后的图像。

figure;
imshow('peppers.png');

figure;
imshow('grb_peppers.tif');

注意:要运行此示例,您必须用您的文件名替换 "largeImage.tif"

创建图像块处理函数。

fun = @(block_struct) block_struct.data;

将 TIFF 图像转换为新的 JPEG2000 图像。用实际图像文件的名称替换 "largeImage.tif"

blockproc("largeImage.tif",[1024 1024],fun,"Destination","New.jp2");

输入参数

全部折叠

要处理的图像,指定为数值数组。

源文件名,指定为字符向量或字符串标量。文件必须具有下列文件类型之一,并且必须以列出的文件扩展名之一命名。

  • TIFF(*.tif、*.tiff)

  • JPEG2000(*.jp2、*.jpf、*.jpx、*.j2c、*.j2k)

数据类型: char | string

图像适配器,指定为 ImageAdapter 对象。ImageAdapter 是用户定义的类,它为 blockproc 提供通用 API,用于读写特定的图像文件格式。有关详细信息,请参阅Perform Block Processing on Image Files in Unsupported Formats

图像块大小,指定为二元素向量。m 是图像块中的行数,n 是列数。

函数句柄,指定为句柄。该函数必须接受 block_struct 作为输入,并返回数组、向量或标量。如果 fun 返回空值,则 blockproc 不会生成任何输出,并且在处理完所有图像块后返回空值。

有关函数句柄的详细信息,请参阅创建函数句柄

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量后,但对各个参量对组的顺序没有要求。

示例: B = blockproc(A,[m,n],fun,BorderSize=[8 4]) 在每个图像块周围创建一个 8 行 4 列的边框。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: B = blockproc(A,[m,n],fun,"BorderSize",[8 4]) 在每个图像块周围创建一个 8 行 4 列的边框。

输出的目标,指定为下列各项之一。当您指定 Destination 参量时,blockproc 不会将处理后的图像作为输出参量返回,而是将输出写入目标文件。

  • 具有目标文件名的字符向量或字符串标量。文件必须具有下列文件类型之一,并且必须以列出的文件扩展名之一命名。

    • TIFF(*.tif、*.tiff)

    • JPEG2000(*.jp2、*.j2c、*.j2k)

    如果存在同名文件,则该文件将被覆盖。

  • ImageAdapter 对象,它提供用于读写特定图像文件格式的通用 API。有关详细信息,请参阅Perform Block Processing on Image Files in Unsupported Formats

Destination 参量在您预计输出太大而无法放入内存时非常有用。它可为任意大的图像提供文件到文件的图像处理工作流。

注意

指定 Destination 参量时,您无法请求输出参量。

要添加到每个图像块中的边框像素数,指定为由正整数组成的二元素向量,形式为 [v h]。该函数在每个图像块的上方和下方各添加 v 行,在每个图像块的左侧和右侧各添加 h 列。每个结果图像块的大小为:

[m+2*v, n+2*h]

默认情况下,该函数会自动从 fun 的结果中删除边框。有关详细信息,请参阅 TrimBorder 参量。

该函数会用零填充边框超出图像边缘的图像块。

填充不完整块以使其具有完整大小,指定为 falsetrue。当图像大小不能被块大小整除时,就会出现不完整块。如果存在不完整块,则这些块通常位于图像的右边缘和下边缘。

当设置为 true 时,blockproc 会填充不完整块以使它们成为完整大小的 m×n 块。默认值为 false,表示该函数不会填充不完整块,而是按原样处理它们。blockproc 会在必要时使用零填充不完整块。

用于填充图像边界的方法,指定为以下项之一。

描述
"replicate"重复边框元素。
"symmetric"用自身的镜面反射填充图像。
数值标量用标量值填充图像。默认情况下,用值 0 填充图像边界。

数据类型: char | string

从用户函数的输出中删除边框像素,指定为 truefalse。当设置为 true 时,blockproc 函数会从用户函数 fun 的输出中删除边框像素。该函数从 fun 的输出的顶部和底部各删除 v 行,从左边缘和右边缘各删除 h 列。BorderSize 参量定义 vh

使用并行处理,指定为 falsetrue。如果您安装了 Parallel Computing Toolbox™,则当设置为 true 时,MATLAB® 会自动在您的本地计算机上打开并行工作进程池。blockproc 会在可用的工作进程上运行计算。有关详细信息,请参阅Parallel Block Processing on Large Image Files

显示等待条,指定为 truefalse。当设置为 true 时,blockproc 会显示等待条,指示长时间运行运算的进度。要防止 blockproc 显示等待条,请将 DisplayWaitbar 设置为 false

输出参量

全部折叠

已处理的图像,以数值数组形式返回。

详细信息

全部折叠

块结构体

块结构体是一种 MATLAB 结构体,包含块数据和有关块的其他信息。块结构体中的字段包括:

字段描述
border[v h] 形式的二元素向量。border 字段指定数据块周围垂直和水平填充的大小。有关详细信息,请参阅 BorderSize 参量。
blockSize[rows cols] 形式的二元素向量。blockSize 字段指定块数据的大小。如果指定了边框,则大小不包括边框像素。
data由块数据组成的 m×nm×n×p 数组。
imageSize[rows cols] 形式的二元素向量。imageSize 字段指定输入图像的完整大小。
location[row col] 形式的二元素向量。location 字段指定输入图像中块数据的第一个像素的位置(最小行最小列)。如果指定了边框,则该位置指离散块数据的第一个像素,而不是添加的边框像素。

提示

  • 选择合适的块大小可以显著提高性能。有关详细信息,请参阅Block Size and Performance

  • 如果输出图像 B 太大而无法放入内存,则省略输出参量,改用 Destination 名称-值对组参量将输出写入文件。

  • blockproc 可以读取 BigTIFF 图像,但对将 BigTIFF 图像写入文件的支持有限。如果您将图像写入文件,则 blockproc 会根据文件的大小自动选择文件类型。如果图像小于或等于 4.0 Gb,则 blockproc 将图像保存为标准 TIFF 图像。如果文件大小大于 4.0 Gb,则 blockproc 将图像保存为 BigTIFF 图像。

    blockproc 没有提供参量来支持您在文件大小小于或等于 4.0 Gb 时将文件类型指定为 BigTIFF。如果要将小图像作为 BigTIFF 文件写入,则可使用 adapter 参量指定自定义图像适配器。有关详细信息,请参阅 TIFF、BigTIFF 和 blockproc

  • 要确定写入的 TIFF 文件是标准 TIFF 还是 BigTIFF,请使用 imfinfo 函数查询图像格式签名:

    tiffinfo = imfinfo(Destination);
    tiffformat = tiffinfo.FormatSignature

    如果 tiffformat 的最后一个非零值为 42,则文件为标准 TIFF 格式。如果最后一个非零值是 43,则文件是 BigTIFF 格式。

扩展功能

版本历史记录

在 R2009b 中推出