How To Rotate Image By Nearest Neighbor Interpolation Using Matlab

…衆ロ難τιáo~ 提交于 2019-11-27 02:50:32

问题


My Plain Code without interpolation:

im1 = imread('lena.jpg');imshow(im1);    
[m,n,p]=size(im1);
thet = rand(1);
m1=m*cos(thet)+n*sin(thet);
n1=m*sin(thet)+n*cos(thet);    

for i=1:m
    for j=1:n
       t = uint16((i-m/2)*cos(thet)-(j-n/2)*sin(thet)+m1/2);
       s = uint16((i-m/2)*sin(thet)+(j-n/2)*cos(thet)+n1/2);
       if t~=0 && s~=0           
        im2(t,s,:)=im1(i,j,:);
       end
    end
end
figure;
imshow(im2);

This code creates black spot, the problem is how to do interpolation? Thank you all for any illumination. P.S. Not asking for build-in function: imrotate(im1,1/thet,'nearest');


回答1:


To rotate the image without the black spots, you need to go in the reverse direction.

The inverse of the rotation matrix is the transpose of it. Also, the rotated image is always bigger with maximum being 45 degree rotation. Hence, the sqrt(2) factor

im1 = imread('lena.jpg');imshow(im1);  
[m,n,p]=size(im1);
thet = rand(1);
mm = m*sqrt(2);
nn = n*sqrt(2);
for t=1:mm
   for s=1:nn
      i = uint16((t-mm/2)*cos(thet)+(s-nn/2)*sin(thet)+m/2);
      j = uint16(-(t-mm/2)*sin(thet)+(s-nn/2)*cos(thet)+n/2);
      if i>0 && j>0 && i<=m && j<=n           
         im2(t,s,:)=im1(i,j,:);
      end
   end
end
figure;
imshow(im2);



回答2:


I remember a previous question on SO that had a similar problem.

The idea I had was to map the pixels in the opposite direction; for each pixel in the rotated image, find the pixel(s) that maps to it in the original image, then the problem becomes much simpler.

I don't have access to MATLAB at this moment, but I think it is doable. The difficulty here is looping over the rotated image pixels..




回答3:


Once you have all the transformed pixels, you can fill in the black spots with griddata which takes in a non-uniform spatial distribution of pixels (your rotated pixels) and interpolates the required pixels (your black spots) using linear, cubic or nearest-neighbor.




回答4:


Black Spots can be removed by these lines, while the rest of the code remains same:

im2= zeros(500,500);
im2(:)=1;


来源:https://stackoverflow.com/questions/1811372/how-to-rotate-image-by-nearest-neighbor-interpolation-using-matlab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!