为什么我要包含'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');
Note - 我以IMFILTER为例 . 对于小图像,可以直接使用IMFITLER . 仅对于大型图像,可以考虑在BLOCPROC中使用IMFITLER .