6

나는이 같은 많은 골격 화 이미지가? 이 작업을 수행하거나 그래프로 구현해야하는 "특수"기능이 있습니까?어떻게 파이썬 라이브러리가있는 골격 이미지에서 사이클을 찾을 수 있습니까? 내가주기, 골격에서 루프를 감지 할 수있는 방법</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>:

그래프 옵션 만있는 경우 파이썬 그래프 라이브러리 NetworkX를 사용하면 도움이됩니까?

+0

파이썬 사전을 사용하면 간단한 그래프를 구현하는 것이 쉽습니다. 다음은 [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"그림을 예로 사용했습니다. 처음 두 이미지는 원본과주기를 감지하는 채워진 버전입니다. 두 번째 버전에서는주기가 깨졌으며 아무것도 채워지지 않으므로 두 이미지가 동일합니다.

enter image description here

3

스켈레톤 이미지를 그래프로 변환하는 것은 그리 쉬운 일이 아니며,이를 위해 어떤 도구가 필요한지 잘 모릅니다.

비트 맵에서 수행하는 한 가지 방법은 포토샵의 페인트 버킷과 같이 flood fill을 사용하는 것입니다. 이미지를 대량으로 채우기 시작하면주기가 없으면 전체 배경이 채워집니다. 채우기가 전체 이미지를 얻지 못하면주기를 발견했습니다. 모든 사이클을 강하게 발견하면 여러 번 작성해야 할 수 있습니다.

실행 속도가 매우 느릴 수 있지만 그래프 데이터 구조로 스켈레톤을 추적하는 기술보다 코드 작성이 훨씬 빠릅니다.

+1

좋은 해결책이라고 생각합니다. floodfill이 같은 수의 픽셀을 반환하면 아무런 사이클도없고 반환하는 경우 사이클 수가 더 적다면 픽셀의 뼈대 수와 이미지의 총 픽셀 수를 계산하여 차이를 계산합니다. – improc

+0

예 기본적으로 골격의 보완에 라벨을 지정해야합니다.이렇게하면 해골 루프에 의해 연결된 연결 구성 요소가 반환됩니다. 구성 요소의 수가 1보다 큰 경우 N은 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가이 개 구멍