Ruhi Akaboy
Ruhi Akaboy

Reputation: 485

Matlab figure keeps the history of the previous images

I am working on rotating image manually in Matlab. Each time I run my code with a different image the previous images which are rotated are shown in the Figure. I couldn't figure it out. Any help would be appreciable. The code is here:

enter image description here[screenshot]

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

Upvotes: 0

Views: 180

Answers (1)

erikced
erikced

Reputation: 732

There is a problem with the initialization of im2, or rather, the lack of it. im2 is created in the section shown below:

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

If im2 exists before this code is run and its width or height is larger than the image you are generating the new image will only overwrite the top left corner of your existing im2. Try initializing im2 by adding adding

im2 = zeros(hh, ww, p);    

before

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

As a bonus it might make your code a little faster since Matlab won't have to resize im2 as it grows in the loop.

Upvotes: 2

Related Questions