在逻辑图像的形状上,我试图从matlab中的形状内的任何点提取视野:
我尝试了一些涉及测试通过该点的每一条线的东西,但它确实很长。(我希望对形状的每个点或至少它的轮廓的每个点都做很多次)< / p>
我认为更快的方法是通过从考虑点扩展磁盘来迭代地工作,但我不知道该怎么做。
如何以有效的方式找到这个视野?
任何想法或解决方案都将不胜感激,谢谢。
答案 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
看起来像这样(圆圈标志着我选择的观点):
下一行计算从视点到图像边缘的最长距离:
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));
以下是它的样子(白色的障碍物,灰色的可见视野,红色的视野):