我有一些代码可以拍摄鱼眼图像并将其转换为每个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< - 图片链接
答案 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度clockwise
或counter-clockwise
取决于是否是鱼眼
图片分别包含对象inwardly
或outwardly
。
%%// 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);