Blockproc
对于#34; gridding"是一个非常有用的功能。 MATLAB中的图像。它记录得非常好,甚至还有一个tutorial page。但是,当你想要在块之间进行某种重叠时,事情会变得棘手。 Mathworks论坛有一些解释,包括this one和this 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 = []
答案 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');
注意网格线?在这种特殊情况下,您只需在完整图像上调用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');
所以 - 你真的需要修剪边框(默认)
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');
注意 - 我以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,而不是块