MATLAB函数——分块处理矩阵函数blockproc()

对图像进行不同的块处理

句法

B = blockproc(A,[m n],fun)
B = blockproc(src_filename,[m n],fun)
B = blockproc(adapter,[m n],fun)
blockproc(___,Name,Value)

描述

A是要处理的图像矩阵,如果图像太大不能完全导入内存,也可以用图像文件名src_filename来表示。[M,N]是希望每次分块处理的矩阵大小,fun是函数句柄,即对每块矩阵的处理函数。需要说明的是blockproc默认支持tiff/tif和jpeg2000格式的任意大图像处理,如果要读取其他格式的大图像需要针对该图像格式再写一个继承自MATLAB中ImageAdapter这个抽象类的子类adapter,来满足blockproc的输入要求。MATLAB帮助文档中有一个读取lan格式的LanAdapter示例类,大家可以参照那个格式来构造任意图像格式的Adapter类来实现blockproc函数对任意大图像文件的支持。最后一种调用格式可以实现读取大图像文件,分块处理后再在指定路径写入处理后的图像文件,这个非常有用。


例子

1、直观感受,分块取最小值

A = round(100 * rand(10, 10))
d = ones(2, 2);
fun = @(block_struct) min(min(block_struct.data)) * d;
dark = blockproc(A, [2, 2], fun)

A =

    15     5    83     6    59    15    62    65    14    84
    96    14    70    26    77    83    33    92    88    32
    88    73    33    44    39    74    28    89     2    74
    49    48    58    28    61    10    43   100    34    66
    41    34    29    68    25    82    35     7    24    29
    13    24    26    95    29    23    88    13    98    34
    93    45    26    77     2    11     1    98    85    91
     1    19    68    64    35    66    70     9    79     3
    19    32    52    75    14    95    34    69    90    70
    32    26     8    75    41    81    30    93    78    21


dark =

     5     5     6     6    15    15    33    33    14    14
     5     5     6     6    15    15    33    33    14    14
    48    48    28    28    10    10    28    28     2     2
    48    48    28    28    10    10    28    28     2     2
    13    13    26    26    23    23     7     7    24    24
    13    13    26    26    23    23     7     7    24    24
     1     1    26    26     2     2     1     1     3     3
     1     1    26    26     2     2     1     1     3     3
    19    19     8     8    14    14    30    30    21    21
    19    19     8     8    14    14    30    30    21    21

A = round(100 * rand(10, 10))
d = ones(3, 3);
fun = @(block_struct) min(min(block_struct.data)) * d;
dark = blockproc(A, [3, 3], fun)

A =

    82    50    24     9     8    91    29    44    91    99
    22    99    34    91     4     9    70    30    55    68
    10    74    55    21    49    18    24    25    60    43
    62    31     7    38    45    95    96    96     8    65
    10    60    41    66    49    10    31    22    58    59
    80    78    24    76    17    39    15    40    90    75
    90    11    49    17    36    29    56    22    46    64
    31    58    81    52    88     7    79    27    40    50
    28    87    38   100    74    19    44    42    10    94
     1    69    52    71    42    42   100   100    65    61


dark =

    10    10    10     4     4     4    24    24    24    43    43    43
    10    10    10     4     4     4    24    24    24    43    43    43
    10    10    10     4     4     4    24    24    24    43    43    43
     7     7     7    10    10    10     8     8     8    59    59    59
     7     7     7    10    10    10     8     8     8    59    59    59
     7     7     7    10    10    10     8     8     8    59    59    59
    11    11    11     7     7     7    10    10    10    50    50    50
    11    11    11     7     7     7    10    10    10    50    50    50
    11    11    11     7     7     7    10    10    10    50    50    50
     1     1     1    42    42    42    65    65    65    61    61    61
     1     1     1    42    42    42    65    65    65    61    61    61
     1     1     1    42    42    42    65    65    65    61    61    61

2、创建图像缩略图

将图像分块缩小为原来的0.15倍

%将图像读入工作区。
I= imread('pears.png');

%创建块处理功能。
fun = @(block_struct)imresize(block_struct.data,0.15);

%逐块处理图像。
I2 = blockproc(I,[100 100],fun);

%显示原始图像和处理过的图像。
figure;
imshow(I);
imshow(I2);
 

MATLAB函数——分块处理矩阵函数blockproc()_第1张图片

                                                            MATLAB函数——分块处理矩阵函数blockproc()_第2张图片  

 

3、切换RGB图像的红色和绿色波段

%将图像读入工作区。

我= 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');

MATLAB函数——分块处理矩阵函数blockproc()_第3张图片

MATLAB函数——分块处理矩阵函数blockproc()_第4张图片

 

注意:

名称 - 值对参数

指定可选的以逗号分隔的Name,Value参数对。Name是参数名称,Value是相应的值。 Name必须出现在引号内。您可以按任何顺序指定多个名称和值对参数Name1,Value1,...,NameN,ValueN

例: 'BorderSize',[8 4]

'Destination'- 目的地
字符向量 | ImageAdapter宾语

输出的目标,指定为以逗号分隔的对'Destination'和由以下之一组成。

  • 带有目标文件名的字符向量。文件必须具有这些文件类型之一,并且必须使用列出的文件扩展名之一进行命名。

    • TIFF(* .tif,* .tiff)

    • JPEG2000(* .jp2,*。j2c,*。j2k)

    如果存在具有此名称的文件,则会覆盖该文件。

  • 一个ImageAdapter 对象,它提供用于读取和写入特定图像文件格式的通用API。有关更多信息,请参阅 以不支持的格式对图像文件执行块处理。

 

指定'Destination'参数时, blockproc不会将处理后的图像作为输出参数返回,而是将输出写入 'Destination''Destination'当您希望输出太大而无法放入内存时,该 参数很有用。它为任意大图像的文件到文件图像处理提供了工作流程。

注意

'Destination'指定参数时,不能请求输出参数。

 

'BorderSize'- 边框大小
[0 0](默认)| 正整数的2元素向量

要添加到每个块的边框像素数,指定为由形式组成的逗号分隔对'BorderSize'和正整数的2元素向量[v h]。该函数v在每个块的上方和下方添加行,并在每个块的h左侧和右侧添加列。每个结果块的大小为:

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

 

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

功能垫块具有以零为单位延伸超出图像边缘的边框。

'PadPartialBlocks'- 填充部分块
false(默认)|true

填充部分块以使其成为全尺寸,指定为由逗号分隔的对'PadPartialBlocks' 和由false或组成true。当图像大小不能完全被块大小整除时,会出现部分块。如果它们存在,则部分块位于图像的右边缘和底边缘。

当设置为trueblockproc垫部分块,使他们全尺寸 m-by- n块。默认值是 false,意味着函数不填充部分块,但按原样处理它们。blockproc 必要时使用零填充部分块。

'PadMethod'- Pad方法
0(默认)| 'replicate''symmetric'| 数字标量

用于填充图像边界的方法,指定为由'PadMethod'以下之一组成的逗号分隔对。

描述
'replicate' 重复边框元素。
'symmetric' 垫镜像与自己的镜像反射。
数字标量 使用标量值填充图像。默认情况下,图像边界用值填充 0

数据类型:char |string

'TrimBorder'- 删除边框像素
true(默认)|false

从用户函数的输出,指定为逗号分隔的一对组成的除去边界像素 'TrimBorder'true或 false。设置为时true,该 blockproc函数从用户函数的输出中删除边框像素fun。该函数删除v由的输出的顶行和底行fun,并且h从左侧边缘和右边缘的列。该BorderSize参数定义vh

'UseParallel'- 使用并行处理
false(默认)|true

使用并行处理,指定为逗号分隔的一对组成的'UseParallel'和 falsetrue。如果您有并行计算工具箱™安装,当设置为true,MATLAB ®自动打开工在本地计算机上的并行池。blockproc在可用的工作人员之间运行计算。有关更多信息,请参阅大图像文件上的并行块处理。

'DisplayWaitbar'- 显示等待栏
true(默认)|false

显示等待栏中,指定为逗号分隔的一对组成的 'DisplayWaitbar'true或 false。设置为时true, blockproc显示一个等待栏以指示长时间运行操作的进度。要防止blockproc 显示等待栏,请设置DisplayWaitbar为 false

输出参数

全部收缩

B- 输出矩阵
数字矩阵

输出矩阵,作为数字矩阵返回。

更多关于

全部收缩

块结构

块结构是一个MATLAB结构,它包含的块数据和关于块的其他信息。块结构中的字段是:

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

你可能感兴趣的:(MATLAB学习)