1

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

在此处输入图像描述

我尝试了一些涉及测试通过该点的每条线的方法,但它真的很长。(我希望为形状的每个点或至少它的轮廓的每个点都做很多次)

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

我怎样才能以有效的方式找到这个视野?

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

4

1 回答 1

0

这是一种可能的方法(我编写的函数背后的原理,可在 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

它看起来像这样(圆圈标记了我选择的视点):

场景

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

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并寻找与障碍物或图像边缘相交的位置。

这应该有助于可视化该过程: 十字路口

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

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

这是它的样子(白色障碍物,灰色可见区域,红色视点):

最后一幕

于 2014-12-03T17:20:16.257 回答