对图像进行不同的块处理
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
左侧和右侧添加列。每个结果块的大小为:
[m + 2 * v,n + 2 * h]
默认情况下,该函数会自动从结果中删除边框fun
。有关TrimBorder
更多信息,请参阅 参数。
功能垫块具有以零为单位延伸超出图像边缘的边框。
'PadPartialBlocks'
- 填充部分块false
(默认)|true
填充部分块以使其成为全尺寸,指定为由逗号分隔的对'PadPartialBlocks'
和由false
或组成true
。当图像大小不能完全被块大小整除时,会出现部分块。如果它们存在,则部分块位于图像的右边缘和底边缘。
当设置为true
,blockproc
垫部分块,使他们全尺寸 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
参数定义v
和h
。
'UseParallel'
- 使用并行处理false
(默认)|true
使用并行处理,指定为逗号分隔的一对组成的'UseParallel'
和 false
或true
。如果您有并行计算工具箱™安装,当设置为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 字段指定输入图像中块数据的第一个像素(最小行,最小列)的位置。如果指定了边框,则该位置指的是离散块数据的第一个像素,而不是添加的边框像素。 |