我有一个256x256的图像,我想将它分成4个128x128的块,并将它们分别为A1到A4。现在我想分别调用它们并对它们进行一些操作。我知道这可以使用blkproc
函数完成 - 但究竟是怎么做的?
我这样打电话给blkproc
吗?
B=blkproc(I,[4 4],?)
我应该用什么代替“?”,如何解决创建的4个块?
答案 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 handle到anonymous 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)
blockproc
是blkproc
的新名称(已弃用)。它可用于将函数应用于图像中的每个块。例如,如果您想将矩阵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