0

私はこのイメージを持っています:

画像

ここでは、緑色の背景に画像があり、その中に赤い線でマークされた領域があります。画像に対するマーク部分の面積を計算したい。

緑の背景を削除するために画像をトリミングし、トリミングされた画像の面積を計算しています。ここから、どう進めばいいのかわからない。

これにはContourを使用できることに気付きましたが、問題はこの場合にどのように輪郭を描くかです。

輪郭を作成し、マークされた領域を色で塗りつぶすことができれば、(トリミングされた) 画像全体からそれを差し引いて、両方の領域を取得できると思います。

4

1 に答える 1

1

あなたのリンクではthreshold、パラメーターに色を指定したメソッドを使用しています。基本的に、ソース画像を取得し、この値よりも大きいすべてのピクセルを白に設定するか、そうでない場合は黒に設定します (これは、ソース画像がグレースケール画像である必要があることを意味します)。このしきい値により、輪郭検出を可能にするために「マークされた領域を塗りつぶす」ことができます。

inRangeただし、トリミングした画像でこの方法を使用する必要があると思います。とほとんど同じthresholdですが、1 つのしきい値ではなく、最小境界と最大境界があります。ピクセルが境界によって指定された色の範囲内にある場合、白に設定されます。そうでない場合は、黒として設定されます。これが機能するかどうかはわかりませんが、範囲内の「最も緑の」色を分離しようとすると、右上に大きな白い領域が表示される可能性があります.

次に、バイナリ化されたfindContours画像にメソッドを適用します。見つかったすべての輪郭が得られるため、画像の他の場所に小さな白い点があっても問題ありません。この方法で見つかった最大の輪郭を選択するだけで済みます。

の範囲がinRange適切でない場合、右上にある大きな白いゾーンにノイズが含まれている可能性があり、輪郭の検出を台無しにする可能性があることに注意してください。それを避けるために、画像をぼかすことができ、侵食/膨張などのいくつかのことを行うことができます. これにより、より良い検出が得られる可能性があります。


編集

ここにコードを追加しますが、そのままでは使用できません。私が言ったように、私は Python の知識がないので、ここでできることは、OpenCV メソッドに提供するパラメーターを提供することだけです。

手順の確認も行いましょう。

  1. で画像を二値化しますinRange。最小境界と最大境界の適切な値を見つける必要があります。ここでやりたいことは、主に輪郭内の領域を構成するものであるため、緑色を分離することです。最適なしきい値を見つけるために、試行錯誤以上に優れた方法を提案することはできません。これらの最小値と最大値から始めましょう: (0, 125, 0) と (255, 250, 255)

inRange(source_image, Scalar(0, 125, 0), Scalar(255, 250, 255), binarized_image)

  1. 結果を確認してくださいimshow

imshow("bin", binarized_image)

  1. 2値化に問題がなければ(必要な領域をうまく検出できます)、 を適用しますfindContours。申し訳ありませんが、チュートリアルやドキュメントで使用されている構文がわかりませんが、パラメーターは次のとおりです。

    • binarized_mat: 二値化された画像
    • contoursPoint:検出されたすべての輪郭を含む配列の配列。各輪郭は点の配列として保存されます。
    • mode: 好きなものを選択できますが、あなたの場合は RETR_EXTERNAL をお勧めします。
  2. 最大サイズの配列を取得します。これは、最大数のポイントを持つ輪郭である可能性があるためです (最大のもの)。

  3. 内部の面積を計算する

お役に立てれば!

于 2016-12-08T11:28:21.337 に答える