次のようなイメージがあります。
そして、このように暗い部分のエッジを見つけたいです(赤い線は私が探しているものです):
私はいくつかのアプローチを試しましたが、どれもうまくいかなかったので、私を助けてくれるemguの達人がそこにいることを願っています...
アプローチ1
- 画像をグレースケールに変換する
- ノイズを除去して反転
- あまり明るくないものはすべて取り除いてください
- キャニーとポリゴンを手に入れよう
このためのコード (物事を適切に処分する必要があることはわかっていますが、コードを短くしています):
var orig = new Image<Bgr, byte>(inFile);
var contours = orig
.Convert<Gray, byte>()
.PyrDown()
.PyrUp()
.Not()
.InRange(new Gray(190), new Gray(255))
.Canny(new Gray(190), new Gray(255))
.FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
RETR_TYPE.CV_RETR_TREE);
var output = new Image<Gray, byte>(orig.Size);
for (; contours != null; contours = contours.HNext)
{
var poly = contours.ApproxPoly(contours.Perimeter*0.05,
contours.Storage);
output.Draw(poly, new Gray(255), 1);
}
output.Save(outFile);
結果は次のとおりです。
アプローチ 2
- 画像をグレースケールに変換する
- ノイズを除去して反転
- あまり明るくないものはすべて取り除いてください
- キャニーを取得し、次に行を取得します
このためのコード:
var orig = new Image<Bgr, byte>(inFile);
var linesegs = orig
.Convert<Gray, byte>()
.PyrDown()
.PyrUp()
.Not()
.InRange(new Gray(190), new Gray(255))
.Canny(new Gray(190), new Gray(255))
.HoughLinesBinary(
1,
Math.PI/45.0,
20,
30,
10
)[0];
var output = new Image<Gray, byte>(orig.Size);
foreach (var l in linesegs)
{
output.Draw(l, new Gray(255), 1);
}
output.Save(outFile);
結果は次のとおりです。
ノート
これら 2 つのアプローチですべてのパラメーターを調整し、スムージングを追加しようとしましたが、暗い領域は単色ではないため、必要な単純なエッジを取得できません。
膨張と浸食も試しましたが、単一の色を得るにはこれらのパラメーターを入力する必要があるため、右側に灰色のものをいくつか含めてしまい、精度が失われます。