在matlab中有效地将图像分割成网格

时间:2012-11-25 18:13:52

标签: matlab matrix sift image-segmentation vlfeat

目前,我使用下面的代码将图像分割成cellSizeX像素的网格乘以cellSizeY像素:

    grid = zeros(cellSizeX, cellSizeY, ColorCount, cellTotalX, cellTotalY);
    for i = 1:cellSizeX:(HorRowCount)        
        for j = 1:cellSizeY:(VertColumnCount)
                try
                    grid(:,:,:,icount, jcount) = img(i:i+cellSizeX-1, j:j+cellSizeY-1, :);
                catch

                end

            jcount = jcount + 1;

        end
        icount = icount + 1;
        jcount = 1;
    end

虽然这段代码运行良好且令人满意,但有些事情让我感到困惑:

  1. 通过tic和toc的一些测试,比较切换索引位置,例如grid(:,:,:,icount,jcount)和grid(icount,jcount,:,:,:),我看到那个网格(:,:,:,icount,jcount)是最快的。但是这里有什么可以改进的吗?

  2. 仅当请求的cellSizeX和cellSizeY与图像img成比例时,代码才有效。因此,在尺寸为40 x 40的图像上请求9 x 9的cellSizeX和cellSizeY将导致matlab抱怨超出矩阵的维度。对此有何建议?我不想简单地为那些细胞填充空白区域。 这些单元格将在Vlfeat SIFT中进一步使用。

1 个答案:

答案 0 :(得分:1)

  1. 如何将每个格式为CellSizeX x CellSizeY x ColorCount的图像转换为细胞柱,然后将所有这些细胞堆叠到单个阵列网格中?

    ca = mat2cell( img, cellSizeY * ones(1, cellTotalY), ...
    cellSizeX * ones(1, cellTotalX), ...
    ColorCount );
    grid = reshape( cat( 4, ca{:} ),...
    cellSizeX, cellSizeY, ColorCount, cellTotalX, cellTotalY);

  2. 在图像处理领域习惯于根据边界处图像的值来填充具有非零值的图像。查看函数padarray以获取更多信息。您可以填充输入图像,使其填充大小与CellSizeX和CellSizeY成比例(填充在两个轴上不必相同)。