改变插值RGB图像的图像宽高比。正方形到矩形

时间:2014-04-23 23:55:46

标签: matlab image-processing aspect-ratio fisheye

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

该代码的灵感来自于Prakash Manandhar“极地转换/来自图像的矩形变换”文件交换。

EDIT。代码现在有效。

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< - 图片链接

3 个答案:

答案 0 :(得分:1)

我对MATLAB中图像处理的细节不太熟悉,但根据imP填充机制的确切操作,您可以通过执行以下操作获得所需的内容。变化:

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

要:

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

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

答案 1 :(得分:1)

第A部分

要删除方形输入图像的要求,您可以将输入图像的大小调整为方形 -

%%// 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也可以被视为安全选项。

B部分

现在,在完成鱼眼图像展平的主要处理后, 在代码的最后,似乎必须旋转图像 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]);

此案例的结果看起来不错。

答案 2 :(得分: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);