2

我有一些代码可以获取鱼眼图像并将其转换为每个 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);

解决了

输入图片<- 图片链接

输出图像<- 图像链接

4

3 回答 3

1

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

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

至:

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

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

于 2014-04-24T01:37:41.160 回答
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]);

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

B部分

现在,在对鱼眼图像进行了主要处理之后,在代码的最后,似乎图像必须旋转 90 度clockwise,或者counter-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]);

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

于 2014-04-24T03:55:20.973 回答
1

这是有效的代码。

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);
于 2014-04-24T07:11:13.793 回答