MATLAB编程(2)——图像划分图像块,得到标记矩阵。

在进行图像处理时,有时需要将图像划分成若干个图像块。

下面的程序实现的功能:

输入图像的大小(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,使用上述函数,得到的标记图结果为:

MATLAB编程(2)——图像划分图像块,得到标记矩阵。_第1张图片

PS:由上图中,会发现位于边界处的图像块(右侧和底部)的大小与其他块之间会有差异。所以可以考虑对原图像进行边界像素扩展(使用MATLAB自带函数padarray())。扩展后再进行分块。经过自己的一系列处理操作后,剔除掉扩展的像素,只保留中间的对应源图像的区域即可。

 

你可能感兴趣的:(MATLAB编程(2)——图像划分图像块,得到标记矩阵。)