6

我有很多骷髏相似圖片:我怎樣才能找到與Python庫的骨架圖像中的週期?

enter image description here enter image description here

我如何可以檢測一個週期,在骨架的循環? 有沒有「特殊」的功能,或者我應該把它作爲一個圖來實現?

如果只有圖形選項,那麼Python圖形庫NetworkX可以幫助我嗎?

+0

用python字典實現一個簡單的圖很容易。這裏是[python文檔的例子](http://www.python.org/doc/essays/graphs/)。儘管我從來沒有使用過NetworkX,但看起來似乎過分了。關於將圖像轉換爲圖形,我不知道一個簡單的方法來做到這一點,雖然它似乎是一個有趣的問題。我使用[opencv](http://opencv.org/),它提供了許多用於處理圖像的功能。你可能會發現一些有用的部分。 – KobeJohn 2013-04-10 00:57:49

回答

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」圖片爲例。前兩張圖像是原始圖像和填充版本,用於檢測週期。在第二個版本中,我打破了這個循環,沒有任何東西被填充,因此這兩個圖像是相同的。

enter image description here

3

將您的骨架圖像轉換爲圖形表示並不重要,我也不知道有任何工具可以爲您做。

在位圖中做到這一點的一種方法是使用flood fill,就像photoshop中的油漆桶。如果您開始對圖像進行泛洪填充,則如果沒有循環,整個背景將被填充。如果填充沒有得到整個圖像,那麼你已經找到了一個循環。可靠地查找所有循環可能需要多次填充。

這很可能執行起來非常慢,但可能比將跟蹤框架跟蹤到圖形數據結構的技術快得多。

+1

我認爲這是一個很好的解決方案。我計算像素的骨架數量和圖像的像素總數,並計算差異,如果填充返回相同數量的像素,則不存在循環,如果返回更少,則存在循環。 – improc 2013-04-10 15:38:31

+0

是的,基本上你需要標記骨架的補充。這將返回由骨架循環切出的連接組件。如果組件的數量大於1,則表示N有N-1個循環。這也可以被看作是使骨架變薄的一種形式。 – beedot 2013-11-11 01:56:05

4

首先,讓我們來構建字母B的圖像與PIL:

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) 

你會發現一個更好的方式來做到這一點,特別是與路徑字體。 Ii會更好地加載圖像,而不是生成它。無論如何,我們現在有一些關於工作: 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個孔