3

元の画像を前処理した後、この画像を取得しました。さて、私の質問は、長方形(最大)の四隅の座標をどのように取得できるかということです。これがとても初心者の質問であるならば申し訳ありません。

ここに画像の説明を入力してください

更新:私はOpenCVで開発しているので、この回答を使用することになりました

4

1 に答える 1

6

簡単な方法の1つは、次のとおりです。

  1. 接続されているすべてのコンポーネントを検索
  2. 各コンポーネントの凸包を計算します
  3. 凸包の面積が最大のコンポーネントを選択します
  4. 凸包ポリゴンを単純化する
  5. 簡略化されたポリゴンの頂点は、探しているポイントです。

Quick&dirty 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]}
   }]]

結果

于 2012-04-12T16:52:12.263 に答える