如何将M×N图像分成[3,3]的非重叠块?

时间:2013-11-19 14:33:26

标签: matlab image-processing block

我有一个M×N图像,应该被分成[3 3]的非重叠块。对于每个块,我应该制作渐变向量,使用mean并最终进行标准化。

我已将图片调整为[3 3]的可分割尺寸并使用blockproc,但是当我测试时

fun = @(block_struct) mean2(block_struct.data);
A   = blockproc(im,[3 3],fun);

我看到该块未应用于整个图像,而是应用于图像的左上角。

注意:块数未知。

[x,y]=size(im)
r=floor(x/3)
c=floor(y/3)
ext_x = mod(x,3);
ext_y = mod(y,3);
a = im(1:(end-ext_x), 1:(end-ext_y));
f= @(block_struct) gradient(block_struct.blockSize);
b=blockproc(im,[3,3],f);
imshow(b)

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你知道如果你imshow(A),显示的图像尺寸将比im的尺寸小3倍吗?那是因为mean2当然会将每个3×3的块减少到一个标量......

除了显而易见的,我不认为你正在做的事情有什么不妥。我也无法重现你所说的话。

作为部分解决方案:请记住,MATLAB的许多功能都可以让普通用户尽可能轻松地生活。它们通常非常复杂,只需要耗费一些时间。

将你自己的基本blockproc

一起烹饪是相当微不足道的
%// Some bogus data
A = reshape(1:16, 4, 4);

%// Desired blocksize
blockSize = [2 2];

%// The desired function 
fcn = @(x) mean2(gradient(x));

%// "blockproc"
m = 1;
blocks = size(A)./blockSize;
out = cell(blocks);
for jj = 1:blocks(2)
    for ii = 1:blocks(1)

        % The indices to the current block
        blockIndsX = (1:blockSize(1)) + (ii-1)*blocks(1);
        blockIndsY = (1:blockSize(2)) + (jj-1)*blocks(2);

        %// Apply the function to the current block and store the result
        out{m} = fcn( A(blockIndsX, blockIndsY, :) );

        %// the index to the next output value
        m = m + 1;
    end
end

%// Make outcomes more intuitive; if every entry is a scalar, make the result a matrix
if all(cellfun(@isscalar, out(:)))
    out = reshape([out{:}], size(out)); end

答案 1 :(得分:0)

您可以使用im2col命令 你可以在这里看到它的用法:

Sum of Absolute differences between images in Matlab