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

                                                              

 

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

 

注意:

名称 - 值对参数

指定可选的以逗号分隔的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左侧和右侧添加列。每个结果块的大小为:

<span style="color:#404040"><span style="color:inherit">[m + 2 * v,n + 2 * h]</span></span>

 

默认情况下,该函数会自动从结果中删除边框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字段指定块数据的大小。如果指定了边框,则尺寸不包括边框像素。
datam-by- n或 m-by- n-by- p 块数据的矩阵。
imageSize形式的2元素向量[rows cols]。该imageSize字段指定输入图像的完整大小。
location形式的2元素向量[row col]。该location字段指定输入图像中块数据的第一个像素(最小行,最小列)的位置。如果指定了边框,则该位置指的是离散块数据的第一个像素,而不是添加的边框像素。
Matlab是一个高性能的数值计算环境和第四代编程语言,它提供了强大的矩阵操作能力。在Matlab中,虽然没有直接的“分块函数”这一术语,但是可以通过矩阵索引和逻辑运算来实现对矩阵进行分块操作。 下面是一些方法来实现矩阵分块操作: 1. 使用索引进行分块: 可以使用冒号(:)操作符和矩阵的大小来创建子矩阵。例如,如果有一个矩阵`A`,可以通过`A(row_start:row_end, col_start:col_end)`来获取一个子矩阵。这里的`row_start:row_end`和`col_start:col_end`代表了行和列的索引范围。 示例代码: ```matlab A = [1 2 3; 4 5 6; 7 8 9]; B = A(1:2, 1:2); % 获取左上角2x2的子矩阵 ``` 2. 使用逻辑索引进行分块: 可以创建一个与原矩阵同样大小的逻辑矩阵(0和1组成的矩阵),然后用这个逻辑矩阵与原矩阵相乘来获得分块后的矩阵。这种方法常用于根据条件选择数据的某些部分。 示例代码: ```matlab A = [1 2 3; 4 5 6; 7 8 9]; logical_matrix = logical([1 0 0; 0 0 1]); % 创建一个逻辑矩阵 B = A .* double(logical_matrix); % 逻辑矩阵和A相乘,获取分块后的矩阵 ``` 3. 使用`blkproc`函数: 在Matlab中,`blkproc`是一个可以用来处理矩阵分块函数,但是该函数是图像处理工具箱中的一个函数,并非Matlab核心部分的函数。使用前需要确保安装了相应的工具箱。 示例代码: ```matlab A = [1 2 3; 4 5 6; 7 8 9]; block_size = [2 2]; % 定义分块的大小 B = blkproc(A, block_size, @(x) mean(x(:))); % 对每个2x2的块求均值 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值