0

Matlabで手動で画像を回転させる作業をしています。別の画像でコードを実行するたびに、回転した前の画像が図に表示されます。私はそれを理解できませんでした。どんな助けでもかなりあります。コードはここにあります:

ここに画像の説明を入力してください[スクリーンショット]

im1 = imread('gradient.jpg');

[h, w, p] = size(im1);
theta = pi/12;
hh = round( h*cos(theta) + w*abs(sin(theta)));      %Round to nearest integer
ww = round( w*cos(theta) + h*abs(sin(theta)));      %Round to nearest integer

R = [cos(theta) -sin(theta); sin(theta) cos(theta)];
T = [w/2; h/2];
RT = [inv(R) T; 0 0 1];
for z = 1:p
for x = 1:ww
    for y = 1:hh
        % Using matrix multiplication
        i = zeros(3,1);
        i = RT*[x-ww/2; y-hh/2; 1];


        %% Nearest Neighbour
        i = round(i);
        if i(1)>0 && i(2)>0 && i(1)<=w && i(2)<=h
            im2(y,x,z) = im1(i(2),i(1),z);
        end
    end
end
end



 x=1:ww;
 y=1:hh;

 [X, Y] = meshgrid(x,y);      %  Generate X and Y arrays for 3-D plots
 orig_pos = [X(:)' ; Y(:)' ; ones(1,numel(X))];   %  Number of elements in array or   subscripted array expression
 orig_pos_2 = [X(:)'-(ww/2) ; Y(:)'-(hh/2) ; ones(1,numel(X))];

 new_pos = round(RT*orig_pos_2); % Round to nearest neighbour

 % Check if new positions fall from map:
 valid_pos = new_pos(1,:)>=1 & new_pos(1,:)<=w & new_pos(2,:)>=1 & new_pos(2,:)<=h;

 orig_pos = orig_pos(:,valid_pos);
 new_pos = new_pos(:,valid_pos);

 siz = size(im1);
 siz2 = size(im2);

%  Expand the 2D indices to include the third dimension.
 ind_orig_pos = sub2ind(siz2,orig_pos(2*ones(p,1),:),orig_pos(ones(p,1),:), (1:p)'*ones(1,length(orig_pos)));
 ind_new_pos  = sub2ind(siz, new_pos(2*ones(p,1),:), new_pos(ones(p,1),:), (1:p)'*ones(1,length(new_pos)));

 im2(ind_orig_pos) = im1(ind_new_pos);
  imshow(im2);
4

1 に答える 1

2

の初期化im2、またはむしろそれの欠如に問題があります。im2以下に示すセクションで作成されます。

if i(1)>0 && i(2)>0 && i(1)<=w && i(2)<=h
    im2(y,x,z) = im1(i(2),i(1),z);
end

このim2コードが実行される前に存在し、その幅または高さが生成している画像よりも大きい場合、新しい画像は既存のの左上隅のみを上書きしますim2im2追加して初期化してみてください

im2 = zeros(hh, ww, p);    

for z = 1:p
    for x = 1:ww
        for y = 1:hh
             ...

im2ボーナスとして、Matlabはループ内で大きくなるときにサイズを変更する必要がないため、コードが少し速くなる可能性があります。

于 2013-03-26T19:34:02.313 に答える