6

私はこのような多くのスケルトンの画像がありますか? これを行う「特別な」機能はありますか、それともグラフとして実装する必要がありますか?どのようにして、スケルトン画像のサイクルをPythonライブラリで見つけることができますか?私はサイクル、スケルトンのループを検出することができますどのように</p> <p><img src="https://i.stack.imgur.com/vdosF.png" alt="enter image description here"> <img src="https://i.stack.imgur.com/u52Gg.gif" alt="enter image description here"></p> <p>:

グラフオプションしかない場合は、PythonグラフライブラリNetworkXを使用してもいいですか?

+0

単純なグラフの実装は、Python辞書で簡単です。以下は[python docsの例](http://www.python.org/doc/essays/graphs/)です。 NetworkXは私がそれを使ったことはありませんが、残酷なようです。画像をグラフに変換することについては、興味深い問題のように見えますが、簡単な方法はわかりません。私は画像を操作するための多くの機能を提供する[opencv](http://opencv.org/)を使用しています。あなたはそこにいくつかの役に立つ部分を見つけるかもしれません。 – KobeJohn

答えて

3

スケルトンのトポロジを利用できます。サイクルには穴がないので、scipy.ndimageを使用して穴を見つけて比較することができます。これは最速の方法ではありませんが、コード作成は非常に簡単です。

import scipy.misc, scipy.ndimage 

# Read the image 
img = scipy.misc.imread("Skel.png") 

# Retain only the skeleton 
img[img!=255] = 0 
img = img.astype(bool) 

# Fill the holes 
img2 = scipy.ndimage.binary_fill_holes(img) 

# Compare the two, an image without cycles will have no holes 
print "Cycles in image: ", ~(img == img2).all() 

# As a test break the cycles 
img3 = img.copy() 
img3[0:200, 0:200] = 0 
img4 = scipy.ndimage.binary_fill_holes(img3) 

# Compare the two, an image without cycles will have no holes 
print "Cycles in image: ", ~(img3 == img4).all() 

「B」画像を例として使用しました。最初の2つのイメージは元のものとサイクルを検出したものです。 2番目のバージョンでは、私はサイクルを壊して何も塗りつぶされていないので、2つの画像は同じです。

enter image description here

3

スケルトン画像をグラフ表示に変換することは自明ではありません。私はそれを行うためのツールについては知らないのです。

ビットマップで行う方法の1つは、Photoshopのペイントバケットのようにflood fillを使用することです。画像のフラッドフィルを開始すると、サイクルがない場合、背景全体が塗りつぶされます。塗りつぶしが画像全体を取得しない場合は、サイクルが見つかりました。すべてのサイクルを頑強に見つけるには、複数回の充填が必要でした。

これは実行が非常に遅くなる可能性がありますが、スケルトンをグラフのデータ構造にトレースするテクニックよりもはるかに高速です。

+1

私はそれが良い解決策だと思います。 floodfillが同じピクセル数を返す場合は、サイクルがなく、返される場合はサイクルが少ない場合、ピクセルのスケルトン数とイメージのピクセル数を計算して差を計算します。 – improc

+0

はい、基本的に、スケルトンの補数にラベルを付ける必要があります。これにより、スケルトンループによって切り取られた連結成分が返されます。コンポーネントの数が1より大きい場合、N-1回のループがあります。これは、スケルトンを間引くためのフォームとも見なすことができます。 – beedot

4

まずは、PILと文字Bの画像を作成してみましょう:

import Image, ImageDraw, ImageFont 
image = Image.new("RGBA", (600,150), (255,255,255)) 
draw = ImageDraw.Draw(image) 
fontsize = 150 
font = ImageFont.truetype("/usr/share/fonts/truetype/liberation/LiberationMono-Regular.ttf", fontsize) 
txt = 'B' 
draw.text((30, 5), txt, (0,0,0), font=font) 
img = image.resize((188,45), Image.ANTIALIAS) 
print type(img) 
plt.imshow(img) 

あなたが特にフォントへのパスで、それを行うには良い方法を見つけることができます。イメージを生成するのではなく読み込む方がよいでしょう。今 Upper B

、実部:とにかく、私たちは今、上で動作するように何かを持っている

import mahotas as mh 
img = np.array(img) 
im = img[:,0:50,0] 
im = im < 128 
skel = mh.thin(im) 
noholes = mh.morph.close_holes(skel) 
plt.subplot(311) 
plt.imshow(im) 
plt.subplot(312) 
plt.imshow(skel) 
plt.subplot(313) 
cskel = np.logical_not(skel) 
choles = np.logical_not(noholes) 
holes = np.logical_and(cskel,noholes) 
lab, n = mh.label(holes) 
print 'B has %s holes'% str(n) 
plt.imshow(lab) 

Holes labelling そして、我々は、コンソール(ipython)を持っている: Bは2つの穴を持っています

関連する問題

 関連する問題