如何在MATLAB中将图像分成块?

时间:2009-10-28 12:36:56

标签: matlab image-processing

我有一个256x256的图像,我想将它分成4个128x128的块,并将它们分别为A1到A4。现在我想分别调用它们并对它们进行一些操作。我知道这可以使用blkproc函数完成 - 但究竟是怎么做的?

我这样打电话给blkproc吗?

B=blkproc(I,[4 4],?)

我应该用什么代替“?”,如何解决创建的4个块?

5 个答案:

答案 0 :(得分:12)

由于blockproc(以及已弃用的blkproc)都是Image Processing Toolbox中的函数,我想我会添加一个基本的MATLAB解决方案,不需要额外的工具箱...

如果要将矩阵划分为子矩阵,一种方法是使用mat2cell来打破矩阵并将每个子矩阵存储在单元阵列的单元格中。对于您的情况,语法如下所示:

C = mat2cell(I, [128 128], [128 128]);

C现在是一个2乘2的单元阵列,每个单元存储一个128乘128的I子矩阵。如果要对每个单元格执行操作,则可以使用函数cellfun。例如,如果您想获取每个子矩阵中值的平均值,您将执行以下操作:

meanValues = cellfun(@(x) mean(x(:)), C);

第一个参数是function handleanonymous function,它首先将每个子矩阵重新整形为一个列向量,然后取平均值。输出是每个子矩阵的平均值的2乘2矩阵。如果您传递给cellfun的函数为每个单元格创建了不同大小或类型的输出,那么cellfun会出现连接它们的问题,并会抛出错误:

??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.

如果您在..., 'UniformOutput', false);的通话结束时添加cellfun,则上述情况下的输出将是一个2 x 2的单元格数组在每个子矩阵上执行操作的结果。

答案 1 :(得分:7)

blockprocblkproc的新名称(已弃用)。它可用于将函数应用于图像中的每个块。例如,如果您想将矩阵I划分为8x8块并计算每个块的平均值,您可以这样做:

B=blockproc(I, [8 8], @(x) mean(x.data(:)));
然后,

B是包含块的平均值的矩阵。

这里有两点需要注意:

  • 说明符[8 8]指定块的 size ,而不是块的 number

  • 在传递给blockproc的函数之外,您无法访问块本身。如果您需要自己的块,您必须按照Adrien的建议:

    A1=I(1:128, 1:128);
    A2=I(129:256, 1:128);
    A3=I(1:128, 129:256);
    A4=I(129:256, 129:256);
    

    当然,在真实的程序中,您应该使用循环来完成此操作。

答案 2 :(得分:3)

如果myImage是你的256x256图像,那就不是

image_top_left = myImage(1:128,1:128);
image_top_right = myImage(1:128,129:256);
image_bottom_left = myImage(129:256,1:128);
image_bottom_right = myImage(129:256,129:256);

答案 3 :(得分:1)

最好让你的程序适用于所有尺寸的图像,而不仅仅是256 * 256。

[row, col]=size(your_image); mr = round(row/2); % median of rows mc = round(col/2); % median of columns % Now divide your image and call each of them separately and do what ever you want top_left = your_image(1:mr , 1:mc); top_right = your_image(1:mr , (mc+1):col); bot_left = your_image((mr+1):row , 1:mc); bot_right = your_image((mr+1):row , (mc+1):col); % final stage is to combining these parts again to return to its original shape Back_to_original = [top_left,top_right ; bot_left,bot_right];

%希望这对你有用。

答案 4 :(得分:0)

如果你想把图片分割成大小为gs的正方形(例如2,3,4,5,6,7,8,9,10,...),你可以使用下面的代码。此函数从输入图像中逐个提取 gs 块,并将它们存储到 'patch' 变量中。请注意,如果输入图像的宽度或高度不是 gs 的倍数,那么在补丁提取中将不会覆盖等于分割残差的偏移量。

function [ patchim , npatchim ] = divideimage (im , gs)
 imheight=size(im,1);
 imwidth=size(im,2);
maxgsrow =  floor( imheight / gs);
maxgscol =  floor( imwidth / gs );
npatch = 1;
for i = 1 : maxgsrow
  for j = 1 : maxgscol
    rmin = ( i - 1 ) * gs + 1;
    rmax = i * gs;
    cmin = ( j - 1) * gs + 1;
    cmax = j * gs;
%%%%%%    do processes
    patch ( : , : , : , npatch) = im( rmin : rmax , cmin : cmax , : );
    npatch = npatch + 1;
  endfor
endfor   
 npatchim = npatch - 1;
patchim = patch;
end