1

我知道循环不应该嵌套,但我做了同样的事情来进一步将 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

4

2 回答 2

0

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

% 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)

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

于 2012-12-10T14:37:58.180 回答
0

让我说的不仅仅是回答您关于细分窗口的问题。

  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=上, B=下, L=左, R=右)


更新:(如何更改循环?)
你想覆盖 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
于 2012-12-10T14:57:30.503 回答