在来自逻辑图像的形状上,我试图从 matlab 形状内的任何点提取视野:
我尝试了一些涉及测试通过该点的每条线的方法,但它真的很长。(我希望为形状的每个点或至少它的轮廓的每个点都做很多次)
我认为一种更快的方法是通过从考虑的点扩展磁盘来迭代地工作,但我不知道该怎么做。
我怎样才能以有效的方式找到这个视野?
任何想法或解决方案将不胜感激,谢谢。
在来自逻辑图像的形状上,我试图从 matlab 形状内的任何点提取视野:
我尝试了一些涉及测试通过该点的每条线的方法,但它真的很长。(我希望为形状的每个点或至少它的轮廓的每个点都做很多次)
我认为一种更快的方法是通过从考虑的点扩展磁盘来迭代地工作,但我不知道该怎么做。
我怎样才能以有效的方式找到这个视野?
任何想法或解决方案将不胜感激,谢谢。
这是一种可能的方法(我编写的函数背后的原理,可在 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));
这是它的样子(白色障碍物,灰色可见区域,红色视点):