当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《MATLABblockproc函数中的'BorderSize'和'TrimBorder'》经验,为你挑选了1个好方法。

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.



1> Ashish Utham..:

为什么我要包含'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.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有