【问题标题】:Create four 3x3 sub-windows from a 5x5 window从 5x5 窗口创建四​​个 3x3 子窗口
【发布时间】:2012-12-10 13:52:21
【问题描述】:

我知道循环不应该嵌套,但我已经做了同样的事情来进一步将 5x5 窗口细分为四个 3x3 子窗口。请帮我解决这个问题,如何将 5x5 窗口细分为四个 3x3 子窗口而无需嵌套循环。

代码:

对于 i=1:m

对于 j=1:n

  if(i<=(m-4) && j<=(n-4))

      % Reading 5 x 5 window in an image

v=1; 
for p=i:i+4
    u=1;
    for q=j:j+4
        P(v,u)=L(p,q);
        u=u+1;
    end
    v=v+1;
end

    % Sub dividing the 5 x 5 window into four 3x3 sub windows 

k=1;
for r=1:3
    l=1;
    for s=1:3
        v2(k,l)=P(r,s);
        v1(k,l)=P(r,s+2);   
        v3(k,l)=P(r+2,s);
        v4(k,l)=P(r+2,s+2);
        l=l+1;    
    end
    k=k+1;
end

我需要这四个向量 v1、v2、v3 和 v4 进行进一步处理。我之前关于保留角像素的问题的链接:

https://stackoverflow.com/questions/13793103/retain-corner-pixels-in-an-image

【问题讨论】:

    标签: image matlab filter pixels


    【解决方案1】:

    除了回答您关于细分窗口的问题之外,让我再讲一点。

    1. 您在 5x5 窗口中从这样的图像中阅读:

      P=L(i:(i+4),j:(j+4));

      所以(i,j) 是原始图像上窗口的左上角。

    2. 这个“细分”在我看来就像是从 5x5 窗口的 TL、TR、BL 和 BR(*) 角开始的 3x3。这可以像这样简单地完成:

      tl = P(1:3, 1:3); % this is v2 in your question
      tr = P(1:3, 3:5); % this is v1 (didn't you mix up v2 and v1 by any chance?)
      bl = P(3:5, 1:3); % this is v3
      br = P(3:5, 3:5); % this is v4

      我建议使用tl, tr, bl, br 而不是v1, v2, v3, v4,因为它更具表现力。

    (*)(T=top, B=bottom, L=left, R=right)


    更新:(如何更改循环?)
    你想覆盖 L 上的所有窗口,所以第一个窗口是P=L(1:5, 1:5),最后一个窗口是P=L((m-4):m,(n-4):n)。所有其他人将介于两者之间。所以i的第一个值是i=1,最后一个是i=m-4,第一个j是j=1,最后一个是j=n-4。

    你也可以手动验证,在matlab的命令提示符下输入一个demo L,像这样:

    L=reshape([1:42], 6, 7); % a 6x6 test array
    m=6; n=7;
    
    i=1; j=1;
    P_first=L(i:(i+4),j:(j+4)); % should contain 1
    
    i=m-4; j=n-4;
    P_last=L(i:(i+4),j:(j+4)); % should contain 42
    

    【讨论】:

    • 非常感谢 Barnabas Szabolcs,你拯救了我的一天。我会试试这个,让你知道。
    • 我收到以下错误:???索引超出矩阵维度。 ==> PRM1 中的错误 45 P=L(i:(i+4),j:(j+5));
    • 我已经更正了错字。至于你的问题:你的for循环不能去m和n,而是for i=1:(m-4)和for j=1:(n-4)。
    • 感谢它正在工作......但为什么它应该适用于 i=1:(m-4) 和 j=1:(n-4) 而不是像问题中所述的原始代码那样从到 m 和 n(对于 i=1:m 和对于 j=1:n)。请解释..
    【解决方案2】:

    不确定这是否是您所需要的,但这个解决方案怎么样:

    % Some random matrices that are each one third the length and width of the total
    LU3 = rand(10);
    LM3 = rand(10);
    LD3 = rand(10);
    MU3 = rand(10);
    MM3 = rand(10);
    MD3 = rand(10);
    RU3 = rand(10);
    RM3 = rand(10);
    RD3 = rand(10);
    
    % Putting them together
    I = [LU3 MU3 RU3;LM3 MM3 RM3;LD3 MD3 RD3];
    
    % Splitting it up in four parts
    LU2 = I(1:15,1:15)
    RU2 = I(16:30,1:15)
    LD2 = I(1:15,16:)
    RD2 = I(16:30,16:30)
    

    它不是很笼统,但应该不难适应。

    【讨论】:

    • 非常感谢 EitanT 的想法
    • @DennisJaheruddin 实际上,我刚刚注意到您正在处理 30×30 矩阵,而问题是关于 5×5 矩阵...
    • @EitanT 大小确实不一样,但显然我误解了“窗口”和“子窗口”的含义。由于已经有一个公认的答案,我将把它留在这里。
    • @Dennis Jaheruddin,你能看看我在接受的答案中所说的错误吗?我收到以下错误:???索引超出矩阵维度。 ==> PRM1 中的错误 45 P=L(i:(i+4),j:(j+5));
    • @EitanT 你能看看我在接受的答案中所说的错误吗?我收到以下错误:???索引超出矩阵维度。 ==> PRM1 中的错误 45 P=L(i:(i+4),j:(j+5));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多