题目:用 Matlab 将提供给的全方位照片展开为普通图像。 机械 0804 何延浩 u200810546
解:
题目提供的全方位图像为 image360.bmp,如图 1 所示,需要将其展开为普通横版图像。
图 1
一、解题思路
1.利用图像中心处的黑色圆,找出展开原点的精确坐标;2.依据该原点,把周围点的坐
标全部变换为极坐标并储存在新矩阵中;3.显示新矩阵中的图形,即为所求图形。
二、Matlab 编程:
1、IM_read.m --- 读取原图像信息
%Read Image Data
clear
I = imread('image360.bmp'); %读取原始图像数据
[iheight,iwidth,icolors] = size(I); %获取图像的宽度和高度
%End of File
2、findCEN.m --- 确定展开原点
%Find Centroid
Ibw = im2bw(I,0.5); %对图像进行二值化处理(门限值0.5)
nExSh = 4;
IM_ExSh; %对二值图进行 4 次“扩张-收缩”和“收缩-扩张”
IL = bwlabel(~Ibw,8); %标记出二值图中的 8 连通域
cSect_ID = IL(round(iheight/2),round(iwidth/2)); %获取原图片中心点所在连通域的序号
cSect_stats = regionprops(IL); %获取各连通域的属性集合
icenterY = round(cSect_stats(cSect_ID).Centroid(1));%把中心所在连通域的重心作为展开原点
icenterX = round(cSect_stats(cSect_ID).Centroid(2));
%End of File
3、IM_ExSh.m --- 用扩张和收缩的方法对二值图像进行补漏洞、去毛刺
%Smooth the Binary Image
IbwES = Ibw; %开辟一块新的存储空间
for nEx = 1:1:nExSh %4 次扩张
for ESx = 2:1:(iheight-1)
for ESy = 2:1:(iwidth-1)
if ~Ibw(ESx-1,ESy)|~Ibw(ESx+1,ESy)|~Ibw(ESx,ESy-1)|~Ibw(ESx,ESy+1)
IbwES(ESx,ESy) = 0;
end
end
end
Ibw = IbwES; %更新二值图
end
for nSh = 1:1:(nExSh*2) %8 次收缩
for ESx = 2:1:(iheight-1)
for ESy = 2:1:(iwidth-1)
if Ibw(ESx-1,ESy)|Ibw(ESx+1,ESy)|Ibw(ESx,ESy-1)|Ibw(ESx,ESy+1)
IbwES(ESx,ESy) = 1;
end
end
end
Ibw = IbwES; %更新二值图
end
for nEx = 1:1:nExSh %4 次扩张
for ESx = 2:1:(iheight-1)
for ESy = 2:1:(iwidth-1)
if ~Ibw(ESx-1,ESy)|~Ibw(ESx+1,ESy)|~Ibw(ESx,ESy-1)|~Ibw(ESx,ESy+1)
IbwES(ESx,ESy) = 0;
end
end
end
Ibw = IbwES; %更新二值图
end
%End of File
4、IM_Plr.m --- 以图形中心为坐标原点,将图片中各点坐标转化为极坐标
%into Polar Coordination
Rmax = min(min(icenterX,icenterY),min((iheight-icenterX),(iwidth-icenterY)));
%计算展开原点与原图片各边缘的距离,取最小值为展开半径
Cout = 360 %将一个圆周均分为 360 份
for rr = 1:1:Rmax %遍历圆周范围内各点,计算极坐标
for angl = 1:1:Cout
Ixx = icenterX+(rr-1)*sind(360*angl/Cout);
Iyy = icenterY+(rr-1)*cosd(360*angl/Cout);
IPlr((Rmax-rr+1),(Cout-angl+1),1:3) = round(... %用线性加权内插法对各点颜色插值
图 2
(fix(Ixx)+1-Ixx) * (fix(Iyy)+1-Iyy) * I(fix(Ixx),fix(Iyy),1:3) + ...
(fix(Ixx)+1-Ixx) * (Iyy-fix(Iyy)) * I(fix(Ixx),fix(Iyy)+1,1:3) + ...
(Ixx-fix(Ixx)) * (fix(Iyy)+1-Iyy) * I(fix(Ixx)+1,fix(Iyy),1:3) + ...
(Ixx-fix(Ixx)) * (Iyy-fix(Iyy)) * I(fix(Ixx)+1,fix(Iyy)+1,1:3));
end
end
%End of File
5、IM_run.m --- 执行
%Run and View
IM_read
findCEN
IM_Plr
imview(IPlr)
%End of File
三、结果及分析
在 Matlab 命令窗口中
输入 IM_run 并回车,运行程序,弹出如图 2 所示窗口,即为全方位照片展开结果。此时工
作空间窗口显示如图 3。
图 3
分析其中一些重要变量:
I
iheight
iwidth
Ibw
nExSh
icenterX
icenterY
Rmax
IPlr
--- 原图像数据矩阵(X×Y×3)
--- 原图像的高度
--- 原图像的宽度
--- 原图像二值化并进行圆滑处理后的图像数据矩阵
--- 二值图像进行“扩张-收缩”和“收缩-扩张”的次数
--- 图像展开原点的 X 坐标
--- 图像展开原点的 Y 坐标
--- 展开原点与原图片边缘的最小距离
--- 用极坐标表示的图像数据矩阵(半径×角度×3)
其他变量为中间过渡变量。
对于二值图像,采用“扩张-收缩”算法可以填补图像实体中的漏洞,采用“收缩-扩张”
算法可以去除实体边缘上的毛刺。图 4-a 到图 4-e 依次为原图像进行二值化、二值图 4 次扩
张、4 次收缩、4 次收缩、4 次扩张后的形貌(按上述顺序操作),可以看出,经过这样的处
理后,图片中间的黑色圆形变得饱满且容易辨认。此时计算出它的重心坐标,就可以认为是
图像展开时的坐标原点。
(a)
(b)
(c)
(d)
(e)
图 4
四、总结
上述程序中把圆周分为了 360 等份,每一度对应于新图像中的一个单位宽度。这就是说,
对图中像素进行角度定位时,可以精确到 1 度。若需要更高的定位精度,可增大变量 Cout
的值,将圆周分成更多份。
进行极坐标变换时,各点颜色的插值在最初方案中采用的是最近邻点法,输出图片有明
显的锯齿现象。改进后采用了线性加权四点内插法,使图片内部各要素边界连续、颜色变化
自然,质量得到了很大提高。
另外,选取展开原点时,利用了二值化后图片中心处的孤立黑色圆,这意味着此程序只
适用于中心有明显标志物的图片。对于中心为空白、中心与周围物体相连或者中心有较高亮
度的图片,这种算法可能会产生错误。更优、更具有普遍性的算法有待进一步研究。