2017-03-20 4 views
1

scikit 이미지와 바이너리 이미지의 골격을 구하는 방법나는 다음과 같은 이미지의 골격을 그리려는

import cv2 
from skimage import morphology, color 
import matplotlib.pyplot as plt 

image = cv2.imread(r'C:\Users\Administrator\Desktop\sample.jpg') 
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
image=color.rgb2gray(image) 

skeleton =morphology.medial_axis(image) 

fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4)) 

ax1.imshow(image, cmap=plt.cm.gray) 
ax1.axis('off') 
ax1.set_title('original', fontsize=20) 

ax2.imshow(skeleton, cmap=plt.cm.gray) 
ax2.axis('off') 
ax2.set_title('skeleton', fontsize=20) 

fig.tight_layout() 
plt.show() 
:

original image

나는 다음과 같은 파이썬 코드로 시도했습니다

그리고 나는 다음과 같은 골격을 가지고 :

enter image description here

이것은 올바른 해골 이미지가 아닙니다. 나는 무엇이 잘못 될지 모른다.

아무도 도와 줄 수 있습니까? 어떤 도움을 주시면 감사하겠습니다 !!!

답변

3

당신의 예에서와 같이 중간 축 적용 :

from skimage import img_as_bool, io, color, morphology 
import matplotlib.pyplot as plt 

image = img_as_bool(color.rgb2gray(io.imread('CIBUv.png'))) 
out = morphology.medial_axis(image) 

f, (ax0, ax1) = plt.subplots(1, 2) 
ax0.imshow(image, cmap='gray', interpolation='nearest') 
ax1.imshow(out, cmap='gray', interpolation='nearest') 
plt.show() 

수익률

@Aaron 부울 이미지로 변환, 아래 언급으로하기 때문에 첫째, 여기에 도움이 것을

Medial Axis of binary image

참고하여 원본 이미지가 JPEG에 저장되어 픽셀 값의 작은 변동을 초래할 수 있습니다.

다른 알고리즘의 경우 medial_axisskeletonize으로 바꿀 수도 있습니다.

@ Tonechas의 대답에 설명 된대로 윤곽선을 원한다면 가장자리 감지 방법을 살펴보십시오.

+0

당신이 한 큰 일은 강조하지만 강조하지는 않았지만 바이너리로 변환하는 것이 꽤 정리 될 것입니다. 원본 이미지의 흰색 레벨에서 약간의 차이가 골격 유물을 일으키고 있다고 상상해 봅니다. – Aaron

+0

원래 이미지는 jpeg 였으므로 지각 할 수없는 인공물을 겪게됩니다. – Aaron

+0

어리석은 저, 저는 대각선으로 질문을 읽고 OP가 실제로 윤곽보다 골격을 원한다는 것을 알아 채지 못했습니다. – Tonechas