Image 视野/凸度贴图

Image 视野/凸度贴图,image,matlab,image-processing,geometry,convex,Image,Matlab,Image Processing,Geometry,Convex,在逻辑图像的形状上,我试图在matlab上从形状内部的任何点提取视野: 我尝试了一些涉及到测试穿过点的每条线的方法,但它确实很长。(我希望对形状的每个点或者至少它的轮廓的每个点进行测试,这是相当多的次数) 我认为一种更快的方法是从考虑的角度通过扩展磁盘来迭代工作,但我不确定如何做到这一点 我怎样才能有效地找到这个视野 任何想法或解决方案都将不胜感激,谢谢。以下是一种可能的方法(背后的原则): 我创建了这个测试图像和一个任意的观点: testscene=zeros(500); testscene

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

我尝试了一些涉及到测试穿过点的每条线的方法,但它确实很长。(我希望对形状的每个点或者至少它的轮廓的每个点进行测试,这是相当多的次数)

我认为一种更快的方法是从考虑的角度通过扩展磁盘来迭代工作,但我不确定如何做到这一点

我怎样才能有效地找到这个视野


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

以下是一种可能的方法(背后的原则):

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

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
这样做的目的是从观察点到阵列中指定的每个方向绘制线
角度
,并查找与障碍物相交的位置或图像边缘

这将有助于可视化流程:

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

FieldofView = roipoly(testscene,intersec(:,1),intersec(:,2));
下面是它的外观(障碍物为白色,可见区域为灰色,视点为红色):


你所说的“视野”是什么意思?你能详细说明一下,或者展示一张图片吗。你在寻找到边缘的最小距离吗?我添加了一张图片。我正在寻找一条直线点可以到达的所有位置。(形状更精确,但这里可能太多)我想我有一个代码可以做到这一点。你有图像处理工具箱吗?有,我有8.1版。代码是如何工作的?我可以尝试一下,但有一些提示。如果它暂时改变了什么,我现在有最新的版本。这非常适合我想要做的事情,而且比我正在做的要快得多。注意:对于Matlab central上的文件,您可能希望使用输入图像作为输出“visiblefield”的掩码,以清除视野中形状的边界。谢谢