视野/凸面图

时间:2014-11-20 16:48:32

标签: image matlab image-processing geometry convex

在逻辑图像的形状上,我试图从matlab中的形状内的任何点提取视野:

enter image description here

我尝试了一些涉及测试通过该点的每一条线的东西,但它确实很长。(我希望对形状的每个点或至少它的轮廓的每个点都做很多次)< / p>

我认为更快的方法是通过从考虑点扩展磁盘来迭代地工作,但我不知道该怎么做。

如何以有效的方式找到这个视野?

任何想法或解决方案都将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

这是一种可行的方法(the function I wrote, available on Matlab Central背后的原则):

我创建了这个测试图像和一个任意的观点:

testscene=zeros(500);
testscene(80:120,80:120)=1;
testscene(200:250,400:450)=1;
testscene(380:450,200:270)=1;

viewpoint=[250, 300]; 
imsize=size(testscene); % checks the size of the image

看起来像这样(圆圈标志着我选择的观点):

scene

下一行计算从视点到图像边缘的最长距离:

maxdist=max([norm(viewpoint), norm(viewpoint-[1 imsize(2)]), norm(viewpoint-[imsize(1) 1]), norm(viewpoint-imsize)]);

angles=1:360; % use smaller increment to increase resolution

然后生成一组均匀分布在视点周围的点。:

endpoints=bsxfun(@plus, maxdist*[cosd(angles)' sind(angles)'], viewpoint);

for k=1:numel(angles)
        [CX,CY,C] = improfile(testscene,[viewpoint(1), endpoints(k,1)],[viewpoint(2), endpoints(k,2)]);
        idx=find(C);
        intersec(k,:)=[CX(idx(1)), CY(idx(1))];
end

这样做是从视点到数组angles中指定的每个方向绘制线条,并查找与障碍物或图像边缘的交点位置。

这应该有助于可视化过程: intersections

最后,让我们使用内置的roipoly函数从一组坐标创建二进制掩码:

FieldofView = roipoly(testscene,intersec(:,1),intersec(:,2));

以下是它的样子(白色的障碍物,灰色的可见视野,红色的视野):

final scene