我有很多骷髏相似圖片:我怎樣才能找到與Python庫的骨架圖像中的週期?
我如何可以檢測一個週期,在骨架的循環? 有沒有「特殊」的功能,或者我應該把它作爲一個圖來實現?
如果只有圖形選項,那麼Python圖形庫NetworkX可以幫助我嗎?
我有很多骷髏相似圖片:我怎樣才能找到與Python庫的骨架圖像中的週期?
我如何可以檢測一個週期,在骨架的循環? 有沒有「特殊」的功能,或者我應該把它作爲一個圖來實現?
如果只有圖形選項,那麼Python圖形庫NetworkX可以幫助我嗎?
您可以利用骨架的拓撲結構。一個循環將沒有漏洞,所以我們可以使用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」圖片爲例。前兩張圖像是原始圖像和填充版本,用於檢測週期。在第二個版本中,我打破了這個循環,沒有任何東西被填充,因此這兩個圖像是相同的。
將您的骨架圖像轉換爲圖形表示並不重要,我也不知道有任何工具可以爲您做。
在位圖中做到這一點的一種方法是使用flood fill,就像photoshop中的油漆桶。如果您開始對圖像進行泛洪填充,則如果沒有循環,整個背景將被填充。如果填充沒有得到整個圖像,那麼你已經找到了一個循環。可靠地查找所有循環可能需要多次填充。
這很可能執行起來非常慢,但可能比將跟蹤框架跟蹤到圖形數據結構的技術快得多。
首先,讓我們來構建字母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會更好地加載圖像,而不是生成它。無論如何,我們現在有一些關於工作:
現在,真正的部分:
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)
,我們在控制檯(IPython中): B有2個孔
用python字典實現一個簡單的圖很容易。這裏是[python文檔的例子](http://www.python.org/doc/essays/graphs/)。儘管我從來沒有使用過NetworkX,但看起來似乎過分了。關於將圖像轉換爲圖形,我不知道一個簡單的方法來做到這一點,雖然它似乎是一個有趣的問題。我使用[opencv](http://opencv.org/),它提供了許多用於處理圖像的功能。你可能會發現一些有用的部分。 – KobeJohn 2013-04-10 00:57:49