2016-12-11 5 views
3

バイナリイメージがあり、イメージの白い部分が頂点とエッジであるようなグラフを表現しようとしています。頂点であり、エッジは、頂点として検出した大きな白い部分の間をつなぐ白い部分です。 私は大きな白い部分の中心を、浸食、findContours、モーメントなどのOpenCV関数を使って、モーメントセントロイドを使って見つけることができました。 グラフの頂点があります。 私の次の目標は、2つの点(x1、y1)と(x2、y2)で表される白色領域のみの線を見つけることです。 は、私は、関数のすべての種類を使用してみましよう: cv2.Canny() cv2.findLine 1は迷路、としてそれについて考えることができます私の目標を理解するためのバイナリイメージOpenCVを使用してバイナリイメージのエッジ(グラフエッジ)を見つける

上の異なるパラメータを持つ cv2.findContourその冒頭が画像内の最大の白い点であり、迷路の最後が2番目に大きな白い点であり、歩くことができる場所はすべて画像の白い部分です。

私は私のプロジェクトで使用されている一部のコードセグメントを: まず、二値画像(finalImage)与えられた、エッジを検出し、私は重心を見つけたように(私はより多くの重心を見つけたい、

def findCentroids(finalImage): 
_, contours0, hierarchy = cv2.findContours(finalImage.copy(), cv2.RETR_LIST,     cv2.CHAIN_APPROX_NONE) 
moments = [cv2.moments(cnt) for cnt in contours0] 
centroids = [] 
for M in moments: 
    if M["m00"] != 0: 
     cX = int(M["m10"]/M["m00"]) 
     cY = int(M["m01"]/M["m00"]) 
     centroids.append((cX, cY)) 
return centroids 

ので、重心を返します画像をより鈍くする)し、おそらくこれらのセントロイドの間をつなぐすべてのエッジを見つけることができます。これは良い方法のようには見えないので、私は答えでより良いアプローチを得ることを望みます。

EDIT だから私は、接続されているコンポーネントのメソッドを使用することで、別のアイデア、考えました。

output = cv2.connectedComponentsWithStats((imageForEdges), 8, cv2.CV_32S) 

しかし、結果は唯一の黒い斑点が私は必要なものとして反対している、構成要素として認識されているということです。私は同様に、CV2によって提供される連結成分を使用してみてください。私は反転画像を使用しようとしたが、アルゴリズムは完全に境界を定めたもので、バックグラウンドではない(私の場合は白色で、縛られていない領域を見つけること )

答えて

1

Iwanowskiのアルゴリズムをチェックしましたか? https://pdfs.semanticscholar.org/cd14/22f1e33022b0bede3f4a03844bc7dcc979ed.pdf "この論文では、バイナリイメージの構造を見つけるために、バイナリイメージの内容を分析する方法について説明します。イメージのクラスは、グラフを形成するオブジェクトの前景グループ記述された方法は、この構造を画像ビットマップから自動的に抽出し、入力画像上に示される全てのオブジェクト間の接続を含む行列を生成する。 "

+0

答えをありがとう。私はアルゴリズムをチェックしますが、私は理論から実践への移行がこのケースでは長すぎると考えています:)うまくいけば、しかし、とにかくこれは私が解決策のためにはるかに効率的な検索に役立ちます。 – Sharonica

+0

OK!私はインターンシップに行った実験室で同じ問題があり、私の前の人はこのアルゴリズムを使っていたので、これを投稿しました。それはかなり複雑なコードでしたが、3D画像を扱っていましたので、おそらく2Dはより簡単です。また、アルゴリズムのいくつかの部分は、骨格化のようなC++コードとして既に利用可能であるかもしれません。 – Soltius

+0

とにかく、幸運! – Soltius

関連する問題