在进行图像处理时,有时需要将图像划分成若干个图像块。
下面的程序实现的功能:
输入图像的大小(height, width)和图像块的大小(windowSize)。
返回图像块划分后的索引图(或者称为标记图,大小与源图像相同),该索引图中相同图像块的像素点共用一个标记值。
注:这里划分的图像块之间没有像素重叠。
function idxImg = generateIdxImg( height, width, windowSize )
% 输入图像的大小(height,width)和图像块的大小(windowSize)
% 返回图像块划分后的索引图(大小与源图像相同),该索引图中相同图像块的像素点共用一个标记值。
% 注:这里划分的图像块之间没有像素重叠。
%
% Inputs:
% height -- 源图像大小——高度
% width -- 源图像大小——宽度
% Output:
% idxImg -- 索引图
%{
% test:
height = 14;
width = 20;
windowSize = 6;
%}
xSplitPt = 1 : windowSize : width;
if width - xSplitPt(end) + 1 < windowSize / 3
xSplitPt( end ) = [];
end
xNum = length( xSplitPt );
ySplitPt = 1 : windowSize : height;
if height - ySplitPt(end) + 1 < windowSize / 3
ySplitPt( end ) = [];
end
yNum = length( ySplitPt );
% horizontal direction
cnt = zeros( 1, width );
cnt( xSplitPt ) = 1;
ind_h = cumsum( cnt );
% vertical direction
cnt = zeros( height, 1 );
cnt( ySplitPt ) = 1;
ind_v = cumsum( cnt ) - 1;
idxImg = repmat( ind_h, [ height, 1 ] ) + repmat( ind_v, [ 1, width ] ) * xNum;
end
例如,测试一幅大小为14*20的图像,设置划分图像块大小为6*6,使用上述函数,得到的标记图结果为:
PS:由上图中,会发现位于边界处的图像块(右侧和底部)的大小与其他块之间会有差异。所以可以考虑对原图像进行边界像素扩展(使用MATLAB自带函数padarray())。扩展后再进行分块。经过自己的一系列处理操作后,剔除掉扩展的像素,只保留中间的对应源图像的区域即可。