2012-04-12 13 views

答えて

6

一つの簡単な方法は、になります使用して終了:接続されているすべてのコンポーネント

  • が凸包を計算見つけ

    1. を各コンポーネントについて
    2. 凸包が最大であるコンポーネントを選択するエリア
    3. は凸包多角形を単純化
    4. 簡略化されたポリゴンの頂点は、あなたが

    クイック&汚れのMathematicaソリューション

  • を探しているポイントです。

    (* find all connected components, calculate the convex hull for each component *) 
    convexHulls = ComponentMeasurements[ColorNegate[Binarize[src]], {"ConvexArea", "ConvexVertices"}]; 
    
    (* pick the component where the convex hull has the largest area *) 
    vertices = SortBy[convexHulls[[All, 2]], First][[-1, 2]] 
    
    (* simplify the convex hull polygon, by iteratively removing the vertex with the lowest distance to the line through the vertex before and after it *) 
    distanceToNeighbors[vertices_] := MapThread[Abs[(#1 - #2).Cross[#1 - #3]/Norm[#1 - #3]]&, RotateLeft[vertices, #] & /@ {-1, 0, 1}] 
    removeVertexWithLowestDistance[vertices_] := With[{removeIndex = Ordering[distanceToNeighbors[vertices], 1]}, Drop[vertices, removeIndex]] 
    verticesSimplified = NestWhile[removeVertexWithLowestDistance, vertices, Min[distanceToNeighbors[#]] < 10&] 
    
    (* the vertices of the simplified polygon are the points you're looking for *) 
    Show[src, Graphics[ 
        { 
        {EdgeForm[Red], Transparent, Polygon[verticesSimplified]}, 
        {Red, PointSize[Large], Point[verticesSimplified]} 
        }]] 
    

    Result

    +0

    はそう素晴らしい解決策のように。ありがとう! –

    関連する問題