MATLAB图像处理:平面卫星图转换成立体球形图

MATLAB图像处理:平面卫星图转换成立体球形图

过年期间回老家,一跟亲戚朋友们说起是搞计算机的,各种好奇的眼光就投过来了,

“会手机贴膜不?”

“正好我家电脑坏了,可以帮我看看么?”

“”
有好气的也有好笑的,倒是大表弟提了个很有意思问题,让我想了很久

大概是说手机上的卫星地图都是平面的,但是家里的地球仪却是一个立体的图像,怎么把卫星拍到的平面图变成立体图贴在地球仪上面哦。

当时两眼一懵,手心一凉,心里波澜起伏

用语言表达当时的情况大概是:我去,这TM熊孩子,你不待在家里写作业就算了,干嘛跑我这来瞎提这些捣蛋问题。。

但是总不能说不知道吧,那多丢人啊,于是我还是正经的回答了他的问题“小朋友,等你长大了就知道了。(呵呵)”

闲下来细想,这还真是个问题哈,我们可以卫星拍成的照片通过图像拼接的方法变成一个平面的地图,但是想要得到一个三维的卫星地图还真不是一个随便想想就能得到的诶

之后受到了全景拍摄和鱼眼相机的启发突发奇想想要写这个程序

我们大可以把平面的卫星地图看做是一个手机从地球侧面拍摄的全景图

于是乎三维的地图就变成了鱼眼相机从地球顶部的角度拍摄的地图

全景图的上方的像素就等价于鱼眼相机中间的像素,同样的,全景图 下方的像素就变成了鱼眼相机四周的像素了,,,于是乎,只要在鱼眼图中找到全景图中像素对应的位置,就可以完成卫星图到球面图的转换了

接下来是无尽的改bug时间。。。。。

最后matlab函数如下

function [imgn,imgc] = rec2global(I,r1)
%全景图转换成穹顶图片,输入img为全景图,输出imgn为穹顶图,r为穹顶内环半径
%%
subplot(2,2,[1,2]);
imshow(I);
[m,n]=size(I);

%r1=100; %内环半径
r2=r1+m;%外环半径

imgc=zeros(2*r2,2*r2,3,'uint8');%用于保存图像
%%
imgn=zeros(2*r2,2*r2);
[re_m,re_n]=size(imgn);
for y=1:re_m
for x=1:re_n
dis_x=x-re_n/2;
dis_y=y-re_m/2;

l=sqrt(dis_x^2+dis_y^2);
if l<=r2 && l>=r1
theta=0;
if y>re_m/2
theta=atan2(dis_y,dis_x);
end
if y<re_m/2
theta=pi+atan2(-dis_y,-dis_x);
end
if y==re_m/2
theta=atan2(dis_y,dis_x)+0.0001;
end

xx=ceil(n*theta/(2*pi));
yy=ceil(l-r1);
if yy>=1 && yy<=m && xx>=1 && xx<=n
imgn(y,x)=I(yy,xx);
XX=ceil(xx/3);
imgc(y,x,:)=I(yy,XX,:);%此处要对计算出来的XX取整
end
end
end
end
%%
subplot(2,2,3);
imshow(imgn);
subplot(2,2,4);
imshow(imgc);
end

运行如下

>>imread('earth.jpg');
>>[imgn,imgc]=rec2global(Ie,0);

结果如下:

(原图)
MATLAB图像处理:平面卫星图转换成立体球形图_第1张图片
(效果图)

MATLAB图像处理:平面卫星图转换成立体球形图_第2张图片
(matlab里面的尿性结果)
MATLAB图像处理:平面卫星图转换成立体球形图_第3张图片

到这里,请容我问一句,

嗯哼,刚那熊孩子人呢?

之后我添加了第二个参数,为球形图的内径,修改它的值,然后发现还挺好玩的哈哈

MATLAB图像处理:平面卫星图转换成立体球形图_第4张图片

你可能感兴趣的:(matlab,摄影,地图,图像处理,图像拼接)