Blockproc
是一个非常有用的功能,用于在MATLAB中"网格化"图像.它有很好的文档记录,甚至还有一个教程页面.但是,当你想要在块之间进行某种重叠时,事情会变得棘手.Mathworks公司论坛上有一些解释,包括这一个和这一个,并有在解释试图在这里(问题1),但没有人真正解释了为什么在任何地方某些标志需要与其他的设置.有人可以解释一下'BorderSize'
参数的用途是什么吗?似乎当'Trim Borders'
设置为时false
,'BorderSize'
参数完全符合文档所说的内容(以及您期望的内容):
'BorderSize':一个双元素矢量,[VH],指定要添加到每个块的边界像素数量.该函数在每个块的上方和下方添加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 = []
Ashish Utham.. 5
为什么我要包含'BorderSize'(即重叠切片)但不将其应用于输出?
考虑要fun
在图像中的每个MxN块上应用函数的所有工作流,但为了使结果有效,您实际需要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包括围绕每一个20×20块中的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.
为什么我要包含'BorderSize'(即重叠切片)但不将其应用于输出?
考虑要fun
在图像中的每个MxN块上应用函数的所有工作流,但为了使结果有效,您实际需要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包括围绕每一个20×20块中的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.