首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改变插值RGB图像的图像高宽比。正方形到矩形

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

Stack Overflow用户
提问于 2014-04-23 23:55:46
回答 3查看 703关注 0票数 2

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

该代码是由mathworks上的Prakash“极地到/从图像的矩形变换”文件交换而来的。

编辑。代码现在起作用了。

代码语言:javascript
复制
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);

解决了

输入图像 <-图像链接

输出图像 <-图像链接

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-24 03:55:20

A部分

为了消除方形输入图像的要求,您可以将输入图像调整为正方形图像,如下所示-

代码语言:javascript
复制
%%// Resize the input image to make it square
reduced_dim = min(size(imR,1),size(imR,2));
imR = imresize(imR,[reduced_dim reduced_dim]);

关于这个图像,我想提几点--调整大小,使之成为正方形图像。这是一个快速和肮脏的方法,扭曲了非方形图像的图像,如果图像不是太“正方形”,你可能不想要这个图像。在许多非正方形图像中,你会发现图像的边界是黑色的。如果您可以使用某种图像处理算法或仅使用手动光刻,那么它将是理想的。在此之后,即使图像不是方形的,imresize也可以被认为是一个安全的选项。

B部分

现在,在对鱼眼图像进行主要处理之后,在代码的末尾,看起来图像必须旋转90度clockwisecounter-clockwise,这取决于鱼眼图像是否分别有inwardlyoutwardly对象。

代码语言:javascript
复制
%%// Rotating image 
imP = imrotate(imP,-90); %%// When projected inwardly
imP = imrotate(imP,-90); %%// When projected outwardly

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

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

因为你是在平平鱼眼图像,所以我假设扁平图像的宽度必须是它的高度的2*PI倍。所以,我试过-

代码语言:javascript
复制
imP = imresize(imP,[size(imP,2)/2 pi*size(imP,2)]);

但结果看上去太平平了。因此,下一个逻辑实验值看起来像PI乘以高度,即-

代码语言:javascript
复制
imP = imresize(imP,[size(imP,2)/2 pi*size(imP,2)/2]);

这个病例的结果看起来很好。

票数 1
EN

Stack Overflow用户

发布于 2014-04-24 01:37:41

我在MATLAB中的图像处理方面不是很有经验,但是取决于imP填充机制的精确操作,您可以通过以下操作得到您想要的结果。更改:

代码语言:javascript
复制
M = size(imR, 1);
N = size(imR, 2);

至:

代码语言:javascript
复制
verticalScaleFactor = 0.5;
M = size(imR, 1) * verticalScaleFactor;
N = size(imR, 2);

如果我的预感是正确的,你应该能够调整那个比例因子来得到正确的图像。但是,它可能会破坏您的代码。让我知道,如果它不工作,并编辑您的文章,以充实确切的每一段代码所做的。那我们就能再试一次了。祝好运!

票数 1
EN

Stack Overflow用户

发布于 2014-04-24 07:11:13

这是有效的代码。

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23257358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档