' BorderSize'和' TrimBorder'在MATLAB中的blockproc函数

时间:2016-01-12 04:53:02

标签: matlab image-processing

Blockproc对于#34; gridding"是一个非常有用的功能。 MATLAB中的图像。它记录得非常好,甚至还有一个tutorial page。但是,当你想要在块之间进行某种重叠时,事情会变得棘手。 Mathworks论坛有一些解释,包括this onethis one,并尝试解释here(问题#1),但没有人真正解释为什么某些标志需要与其他人一起设置。有人可以解释一下'BorderSize'参数的用途是什么吗?似乎当'Trim Borders'设置为false时,'BorderSize'参数完全符合文档所说的内容(以及您期望的内容):

  

' BorderSize':一个双元素矢量,[V H],指定要添加到每个块的边界像素数量。该函数在每个块的上方和下方添加V行,并在每个块的左侧和右侧添加H列。每个得到的块的大小为:[M + 2 * V,N + 2 * H]

     

默认情况下,该功能会自动从乐趣结果中删除边框。请参阅' TrimBorder'参数以获取更多信息。功能块填充边框,使用零填充图像边缘。

但是,当您阅读'TrimBorder'详细信息时,它并没有明白:

  

' TrimBorder':逻辑标量。设置为true时,blockproc函数会修剪用户函数输出中的边框像素,很有趣。该函数从fun输出的顶部和底部删除V行,从左边缘和右边缘删除H列。 ' BorderSize'参数定义V和H.默认值为true,表示blockproc函数自动从有趣的输出中删除边框。

为什么我要包含'BorderSize'(即重叠切片)但不将其应用于输出?这只是一个解释不佳的标志:'TrimBorder'必须关闭才能使用'BorderSize',或者是否有更大的错误?我想我的困惑的主旨是:我何时希望'TrimBorder'设置为false

示例:

% Non-overlapping
A = ones(10);
B = blockproc(A, [2,2], @(x)sum(sum(x.data)));
% B = 
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]
% [ 4 4 4 4 4 ]

% GOOD Overlapping--one-pixel border
B = blockproc(A, [2,2], @(x)sum(sum(x.data)), 'BorderSize', [1,1], 'TrimBorder', false);
% B =
% [ 9  12 12 12 9  ]
% [ 12 16 16 16 12 ]
% [ 12 16 16 16 12 ]
% [ 12 16 16 16 12 ]
% [ 9  12 12 12 9  ]

% BAD Overlapping--one-pixel border
B = blockproc(A, [2,2], @(x)sum(sum(x.data)), 'BorderSize', [1,1]);
% B = []

2 个答案:

答案 0 :(得分:5)

  

为什么我要包含一个' BorderSize' (即重叠瓷砖)但是   不适用于输出?

考虑要在图像中的每个MxN块上应用函数fun的所有工作流,但为了使结果有效,您实际需要MxN块周围的边框像素。 (滤波,形态学,单个输出像素值取决于mxn周围邻域的任何函数)。即你需要(M + m,N + n)输入块来计算一个MxN输出块。

简单(又名制作)示例:

h = fspecial('gaussian', 3);
im = imread('peppers.png');
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h));
imshowpair(im, B1,'montage');

enter image description here

注意网格线?在这种特殊情况下,您只需在完整图像上调用imfilter即可。但是blockproc允许您处理大于物理内存的图像。所以对于这个讨论,想象我是一个巨大的tiff文件。

对于此工作流程 - 如果您刚使用BorderSize在每个20x20块周围包含3个像素边框, 修剪输出边框:

h = fspecial('gaussian');
im = imread('peppers.png');
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h), 'BorderSize', [3 3], 'TrimBorder', false);
imshowpair(im, B1,'montage');

enter image description here

所以 - 你真的需要修剪边框(默认)

h = fspecial('gaussian');
im = imread('peppers.png');
B1 = blockproc(im, [20 20], @(bs)imfilter(bs.data,h), 'BorderSize', [3 3], 'TrimBorder', true);
imshowpair(im, B1,'montage');

enter image description here

注意 - 我以IMFILTER为例。对于小图像,可以直接使用IMFITLER。仅对于大型图像,可以考虑在BLOCPROC中使用IMFITLER。

答案 1 :(得分:0)

以防您正在寻找重叠区块并保存 -

    function cropSaveBlock(bs,ii) 
   subBlockRegion =(bs.data(:,:));
   fileName = [strrep(num2str(bs.location,ii),' ','_') '.jpg'];
   imwrite(subBlockRegion, fileName);
   end
    a = imread('cameraman.tif');

ii = [1 - 任何你想要的文件名]%[1:20]如果你的图像有20个结果块

aa=blockproc(a, [257 257], @(bs)cropSaveBlock(bs,ii),'BorderSize', [10 10 ])

%这里,borderize是整个图像的x,y 10,10,而不是块