【问题标题】:Changing image aspect ratio of interpolated RGB image. Square to rectangular更改插值 RGB 图像的图像纵横比。正方形到长方形
【发布时间】:2014-06-09 01:22:14
【问题描述】:

我有一些代码可以获取鱼眼图像并将其转换为每个 RGB 通道中的矩形图像。我遇到了输出图像是正方形而不是矩形的问题。 (这意味着图像失真,水平压缩。)我尝试将输出矩阵更改为更合适的格式,但没有成功。除此之外,我还发现要使代码正常工作,输入图像必须是 500x500 的正方形。知道如何解决这个问题吗?这是代码:

代码的灵感来自 Mathworks 上的 Prakash Manandhar“图像的极坐标到/从矩形变换”文件交换。

编辑。代码现在可以工作了。

function imP = FISHCOLOR2(imR)

rMin=0.1; 
rMax=1;

[Mr, Nr, Dr] = size(imR); % size of rectangular image 
xRc = (Mr+1)/2; % co-ordinates of the center of the image 
yRc = (Nr+1)/2; 
sx = (Mr-1)/2; % scale factors 
sy = (Nr-1)/2;

reduced_dim = min(size(imR,1),size(imR,2));
imR = imresize(imR,[reduced_dim reduced_dim]);

M=size(imR,1);N=size(imR,2);


dr = (rMax - rMin)/(M-1); 
dth = 2*pi/N;

r=rMin:dr:rMin+(M-1)*dr; 
th=(0:dth:(N-1)*dth)'; 

[r,th]=meshgrid(r,th); 

x=r.*cos(th); 
y=r.*sin(th); 
xR = x*sx + xRc; 
yR = y*sy + yRc; 

 for k=1:Dr % colors
   imP(:,:,k) = interp2(imR(:,:,k), xR, yR);        % add k channel
end

 imP = imresize(imP,[size(imP,1), size(imP,2)/3]);

 imP = imrotate(imP,270);

已解决

Input image

Output image

【问题讨论】:

    标签: matlab image-processing aspect-ratio fisheye


    【解决方案1】:

    第一部分

    要消除正方形输入图像的要求,您可以使用此方法将输入图像调整为正方形 -

    %%// Resize the input image to make it square
    reduced_dim = min(size(imR,1),size(imR,2));
    imR = imresize(imR,[reduced_dim reduced_dim]);
    

    关于此图像大小调整以使其成为方形图像,我想在此提出几点。这是一种快速而肮脏的方法,并且会扭曲非方形图像的图像,如果图像不是太“方形”,您可能不想要这种图像。在许多非方形图像中,您会在图像边界上发现黑色边框。如果您可以使用某种图像处理算法或仅手动进行photoshoping来删除它,那将是理想的选择。之后,即使图像不是正方形,imresize 也可以被认为是一个安全的选择。

    第二部分

    现在,在完成了鱼眼图像的主要处理之后, 在您的代码末尾,似乎必须旋转图像 90 度 clockwisecounter-clockwise 取决于鱼眼是否 图像分别有对象inwardlyoutwardly

    %%// Rotating image 
    imP = imrotate(imP,-90); %%// When projected inwardly
    imP = imrotate(imP,-90); %%// When projected outwardly
    

    请注意,展平图像的高度必须等于 输入正方形图像的大小,即图像的半径。

    因此,最终输出图像的行数必须为 - size(imP,2)/2

    由于您正在展平鱼眼图像,我假设宽度 展平图像的高度必须是2*PI 乘以它的高度。所以,我尝试了这个 -

    imP = imresize(imP,[size(imP,2)/2 pi*size(imP,2)]);
    

    但结果看起来过于平淡。所以,下一个合乎逻辑的实验 值看起来像 PI 乘以高度,即 -

    imP = imresize(imP,[size(imP,2)/2 pi*size(imP,2)/2]);
    

    这种情况下的结果看起来不错。

    【讨论】:

    • @KristianMoesgaard 非常有趣的项目我必须说,我很想发布一些结果。查看PART B 进行一些修改。如果其他人尚未完成,为什么不将其发布为文件交换代码?
    • 我可能会这样做。我实际上也有兴趣将输入图像映射到纬度经度图像。您是否有任何想法如何做到这一点? :)
    • @KristianMoesgaard 抱歉,对此还没有太多了解!
    【解决方案2】:

    我在 MATLAB 中图像处理的细节方面不是很有经验,但是根据 imP 填充机制的确切操作,您可能会通过执行以下操作来获得所需的内容。变化:

    M = size(imR, 1);
    N = size(imR, 2);
    

    收件人:

    verticalScaleFactor = 0.5;
    M = size(imR, 1) * verticalScaleFactor;
    N = size(imR, 2);
    

    如果我的预感是正确的,您应该能够调整比例因子以使图像恰到好处。但是,它可能会破坏您的代码。如果它不起作用,请告诉我,并编辑您的帖子以准确充实每个代码部分的作用。然后我们应该可以再试一次。祝你好运!

    【讨论】:

    • 感谢您的回答:)
    【解决方案3】:

    这是有效的代码。

    function imP = FISHCOLOR2(imR)
    
    rMin=0.1; 
    rMax=1;
    
    [Mr, Nr, Dr] = size(imR); % size of rectangular image 
    xRc = (Mr+1)/2; % co-ordinates of the center of the image 
    yRc = (Nr+1)/2; 
    sx = (Mr-1)/2; % scale factors 
    sy = (Nr-1)/2;
    
    reduced_dim = min(size(imR,1),size(imR,2));
    imR = imresize(imR,[reduced_dim reduced_dim]);
    
    M=size(imR,1);N=size(imR,2);
    
    
    dr = (rMax - rMin)/(M-1); 
    dth = 2*pi/N;
    
    r=rMin:dr:rMin+(M-1)*dr; 
    th=(0:dth:(N-1)*dth)'; 
    
    [r,th]=meshgrid(r,th); 
    
    x=r.*cos(th); 
    y=r.*sin(th); 
    xR = x*sx + xRc; 
    yR = y*sy + yRc; 
    
     for k=1:Dr % colors
       imP(:,:,k) = interp2(imR(:,:,k), xR, yR);        % add k channel
    end
    
     imP = imresize(imP,[size(imP,1), size(imP,2)/3]);
    
     imP1 = imrotate(imP1,270);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      相关资源
      最近更新 更多