【问题标题】:How to divide an M×N image into non-overlapping blocks of [3,3]?如何将 M×N 图像划分为 [3,3] 的非重叠块?
【发布时间】:2013-11-19 14:33:26
【问题描述】:

我有一个 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)

有什么想法吗?

【问题讨论】:

    标签: matlab image-processing block


    【解决方案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
    

    【讨论】:

    • 谢谢罗迪,我刚刚在上面添加了我的代码来看看它。它给了我一个黑色的正方形(正如它所没有的那样)除此之外我如何计算块?
    • @Biju:数积木?你什么意思?你看过我代码中的blocks 变量了吗?它定义了 X 和 Y 方向上有多少块......
    • 是的,我已经注意到了,但是是否可以使用 blockproc() 本身?因为我测试了你的代码,它警告我索引超出了矩阵维度。 (而不是 A,我在上面的代码中使用了 a 变量,并且我为块做了地板)......而且它给了我 m=4 的 296*160 的图像,这是错误的。
    • @Biju:当然可以,但我不知道你做错了什么,因为我没有遇到和你一样的问题。我写了上面的代码,这样你就可以更容易地玩这些块了。它真的只是为了帮助找出正常的blockproc 出了什么问题。不要迷失在我方法的细节上;试着让它在一个小图像上工作,然后用它来找出真正的问题。
    【解决方案2】:

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

    Sum of Absolute differences between images in Matlab

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 2017-11-20
      相关资源
      最近更新 更多