史蒂夫与MATLAB图像处理

图像处理的概念、算法和MATLAB

Feret直径和映顶点

最后一次,我写了一篇关于寻找对象的最大Feret直径在一个二进制图像,结束了这个图:

我计算凸壳所有像素的角落,然后计算两两之间的距离每一对凸壳顶点找到最大距离。

过程将在许多情况下工作得很好,但找到最大距离所需的时间这样生长的平方凸壳顶点的数量。随着现代数字图像分辨率,不难想象成千上万的顶点,因此数百金宝搏官方网站万两两距离来计算。

有一个程序减少顶点的数量对我们可以考虑。它是基于这个定理:

一个凸图的直径是平行线之间最大的距离的支持。金宝app(定理4,18岁,说明附子和沙漠,计算几何,1985)

一个线的支持金宝app多边形是一行包含一个顶点的多边形,多边形完全躺在一边的线。

让我给你一个图片上次使用凸包的点。

船体= [2.5000 5.5000 3.5000 4.5000 6.5000 2.5000 9.5000 1.5000 10.5000 1.5000 10.5000 3.5000 9.5000 5.5000 5.5000 7.5000 2.5000 7.5000 2.5000 - 5.5000);情节(船体(:1)船体(:,2),“r”,“线宽”,2)情节(船体(:1)船体(:,2),的r *)举行平等的ij轴([0 15 0 10])θ= 55:5:-35 drawFullLine (gca,[9.5 - 5.5],θ,“颜色”,(。6。6。6]);结束

情节上面的五个不同的支持通过顶点(9.5,5.5)。金宝app现在,我将添加一些行支持通过顶点(2.5,7.5)。金宝app

θ= 10:10:80 drawFullLine (gca,[2.5 - 7.5],θ,“颜色”,(。6。6。6]);结束

可以看到,没有线的支持(2.5,7.5)顶点平行于一行支持顶点(9.5,5金宝app.5)。排除了这一对顶点计算最大Feret直径。

现在我画线支持不同的顶点。金宝app

情节(船体(:1)船体(:,2),“r”,“线宽”,2)情节(船体(:1)船体(:,2),的r *)举行平等的ij轴([0 15 0 10])drawFullLine (gca[6.5 - 2.5], -30年,“颜色”,(。6。6。6]); drawFullLine(gca,[9.5 5.5],-30,“颜色”,(。6。6。6]);

因为顶点(6.5,2.5)和(9.5,5.5)平行线的支持,他们被称为金宝app映顶点。有一个算法说明附子和沙漠的书(参考上图),发现所有的映凸多边形的顶点。在一个函数的实现算法在这篇文章的底部。我将使用它来找到所有的映对凸包顶点。

pq = antipodalPairs(船体);

重要提示:该算法在antipodalPairs假定其输入是凸的。进一步,它假设输入不包含任何顶点之间的直线上两个相邻的顶点。为了满足这个条件,计算凸壳使用的调用:k = convhull (P,“简化”,真的)

现在,让我们加入每一对映绘制线段。

情节(船体(:1)船体(:,2),“r”,“线宽”,2)情节(船体(:1)船体(:,2),的r *)轴平等的ij轴([0 15 0 10])k = 1:尺寸(pq, 1) x =[赫尔(pq (k, 1), 1)船体(pq (k, 2), 1)];y =[赫尔(pq (k, 1), 2)船体(pq (k, 2), 2)];情节(x, y,“颜色”,(。6。6。6]);结束持有

找到最大Feret直径,我们只需要检查这些10段的距离,而不是10 * 9 = 90线段。

p1 =船体(pq (: 1),:);p2 =船体(pq (:, 2):);v = p1, p2;d =函数(v (: 1), (2):,);[d_max, idx] = max (d);p1_max = p1 (idx:);p2_max = p2 (idx:);持有情节([p1_max (1) p2_max (1)]、[p1_max (2) p2_max (2)),“b”,“线宽”,2)
d_max
d_max = 10

有最大Feret距离。

我相信,在很多情况下,它将更快地找到最大距离蛮力的比较所有双凸壳顶点。映的计算对确实需要一段时间,毕竟。我没有做过性能研究进一步探讨这个问题。然而,映对计算是有用的为另一个度量:最低Feret距离。

下次我要看。

结束后

算法、可视化和上面的代码使用的效用函数

函数h = drawFullLine (ax,点,angle_degrees变长度输入宗量)% drawFullLine画一条线,横跨整个阴谋%% drawFullLine (ax,点,angle_degrees)画一条线%指定轴通过指定的点%指定角(度)。线路跨越所吸引%的整个情节。%% drawFullLine(___、名称、值)传递参数名称-值对%线函数。%史蒂夫·埃丁限制=轴(ax);宽度= abs(限制(2)- (1));身高= abs(限制(4)- (3));d = 2 *函数(宽度、高度);x1 = (1) - d * cosd (angle_degrees);x2 = (1) + d点* cosd (angle_degrees);日元= (2)- d *信德(angle_degrees);y2 =点(2)+ d *信德(angle_degrees);h =线(ax,“XData”(x1, x2)),“YData”(y1 y2),变长度输入宗量{:});结束函数pq = antipodalPairs (S)% antipodalPairs映顶点对简单凸多边形。%% pq = antipodalPairs (S)计算对映顶点对一个简单的,%凸多边形。年代是一个Px2矩阵(x, y)顶点的坐标%的多边形。年代必须简单、凸没有重复的顶点。它是%不检查满足这些条件。可以关闭或%。pq,输出是一个(矩阵代表对顶点% S的坐标k映两人年代(pq (k, 1),:)% S (pq (k, 2):)。%%的术语%%为凸多边形,一对映的顶点是一个你在哪里%可以画出不同的线通过每个顶点,这样的支持金宝app%的支持是平行的。金宝app%%的支持是一条直线,穿过金宝app一个多边形顶点%,多边形的内部是完全的一侧。%%的例子%%计算对映一个多边形的顶点和策划相应的%线段。%% x = (0 0 1 3 5 4 0);% y = [0 1 4 5 4 0];% S = (x, y);% pq = antipodalPairs(年代);%%的阴谋(S (: 1), (2):,)%抓住% k = 1:尺寸(pq, 1)% xk = [S (pq (k, 1), 1)年代(pq (k, 2), 1)];% yk = [S (pq (k, 1), 2)年代(pq (k, 2), 2)];%的阴谋(xk,即“线型”,“——”,“标记”,“o”,“颜色”,[0.7 0.7 0.7])%结束%推迟%轴平等%%算法笔记%%这个函数使用“映对”算法,说明附子和%沙漠,计算几何:介绍,斯普林格出版社,1985年版% p。174。%史蒂夫·埃丁n =大小(年代,1);如果isequal (S (1:), S (n,:))%的输入多边形是关闭的。删除重复的顶点%。S (n:) = [];n = n - 1;结束%的算法假定输入顶点按照逆时针顺序。%如果顶点按顺时针方向的,反向的顶点。顺时针= simplePolygonOrientation (S) < 0;如果顺时针S = flipud(年代);结束%以下变量,包括两个匿名函数,设置%的符号在伪代码说明附子和174页%沙漠。p和q指标(基于)识别p0和顶点% q0确定起始顶点算法。区(i, j, k)是该地区%与对应的三角形顶点的S:年代(我:),S (j:)%和S (k,:)。下一个(p)返回下一个顶点的索引的年代。%%初始化的p0丢失说明附子和沙漠文本。面积= @ (i, j, k) signedTriangleArea((我,:),年代(j:), S (k,:));下= @ (i)国防部(我,n) + 1;%国防部((张)+ 1,n) + 1p = n;p0 =下一个(p);q =下一个(p);%对映顶点的列表将会建立在向量pp和qq。页= 0 (0,1);qq = 0 (0, 1);%映对步骤3。(面积(p (p),下一个(q)) >区域(p (p), q)) q =下一个(q);结束q0 =问;%步骤4。(问~ = p0)%步骤5。p =下一个(p);%步骤6。%步骤7。(p, q)是一对映。页=[页;p];qq = [qq;问);%步骤8。(面积(p (p),下一个(q)) >区域(p (p), q)) q =下一个(q);%第9步。如果~ isequal ([p q], [q0, p0])%第10步。页=[页;p];qq = [qq;问);其他的%这个循环打破省略说明附子和沙漠%的文本。打破结束结束%第11步。检查平行边。如果(面积(p (p),下一个(q)) = =区域(p (p), q))如果~ isequal ([p q], [q0 n])%步骤12。(p, q)是一对映。页=[页;p];qq = [qq;下一个(q)];其他的%这个循环打破省略说明附子和沙漠%的文本。打破结束结束结束如果顺时针方向%赔偿翻转的多边形顶点。页= n + 1 - pp;qq = n + 1 - qq;结束pq = (pp qq);结束函数s = vertexOrientation (P0, P1, P2)% vertexOrientation顶点对线段的方向。%% s = vertexOrientation (P0, P1, P2)返回如果P2是一个正数%的左边线通过P0 P1。如果P2在它返回0%。它返回一个负数如果P2是正确的。%%声明它的另一种方式,积极对应一个输出%逆时针方向遍历P0 P1, P2。%% P0, P1, P2双元素包含(x, y)坐标向量。%%参考:http://geomalgorithms.com/a01-_area.html isLeft()函数%史蒂夫·埃丁s = (P1 (1) - P0 (1)) * (P2 (2) - P0 (2))(P2 (1) - P0 (1)) * (P1 (2) - P0 (2));结束函数s = simplePolygonOrientation (V)% simplePolygonOrientation确定简单多边形顶点顺序。%% s = simplePolygonOrientation (V)返回一个正数,如果简单%多边形V是逆时针方向。它返回一个负数的%多边形是顺时针。简并情况下返回0。V是一个Px2% (x, y)顶点坐标的矩阵。%%参考:http://geomalgorithms.com/a01-_area.html函数% orientation2D_Polygon ()%史蒂夫·埃丁n =大小(V, 1);如果n < 3 s = 0;返回结束%发现右边的最低vertext多边形。x = V (: 1);y = V (:, 2);ymin = min (y, [], 1);y_idx =找到(y = = ymin);如果isscalar (y_idx) idx = y_idx;其他的[~,x_idx] = max (x (y_idx), [], 1);idx = y_idx (x_idx (1));结束%多边形是逆时针如果边缘留下V (idx:)的%进入边缘。如果idx = = 1 s = vertexOrientation (V (n:), (1):), V (2:));elseifidx = = n s = vertexOrientation (V (n - 1:) (n:), V (1:));其他的s = vertexOrientation (V (idx-1:), V (idx:), V (idx + 1,:));结束结束

版权2017年MathWorks公司。


发表与MATLAB®R2017b

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。