12

我没有插值的纯代码:

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

这段代码产生了黑点,问题是如何进行插值?谢谢大家的任何启发。PS 不要求内置函数:imrotate(im1,1/thet,'nearest');

4

4 回答 4

11

要旋转没有黑点的图像,您需要朝相反的方向前进。

旋转矩阵的逆是它的转置。此外,旋转后的图像总是更大,最大旋转 45 度。因此,sqrt(2)因数

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);
于 2009-12-03T23:50:31.810 回答
6

我记得之前关于 SO 的问题也有类似的问题。

我的想法是将像素映射到相反的方向;对于旋转图像中的每个像素,在原始图像中找到映射到它的像素,那么问题就变得简单多了。

我目前无法访问 MATLAB,但我认为这是可行的。这里的困难是循环旋转的图像像素..

于 2009-11-28T03:18:32.010 回答
0

一旦你有了所有的转换像素,你可以填充黑点,griddata这些黑点采用像素的非均匀空间分布(你的旋转像素),并使用线性、三次或最近邻插值所需的像素(你的黑点) .

于 2009-11-28T07:06:24.700 回答
0

这些行可以删除黑点,而其余代码保持不变:

im2= zeros(500,500);
im2(:)=1;
于 2013-01-13T16:23:49.500 回答