안에있는 것을 제외하고이 휠 뼈대 기호의 둘레 (기호의 가장 바깥 둘레)를 삭제하고 싶습니다. 나는 함수 findcontours (생각) 그리고 난이 입력 이미지어떻게 파이썬에서 스켈레톤 이미지의 가장 큰 윤곽선을 삭제할 수 있습니까?
을 발견 가장 큰 윤곽 삭제 :
골격 화 : 불행하게도이
하지만를 내 출력 이미지 :
,
는이 세그먼트를 건너
from __future__ import division
import mahotas as mh
import pymorph as pm
import numpy as np
import os
import math
import cv2
from skimage import io
import scipy
from skimage import morphology
complete_path = 'DUPLInuova/ruote 7/e (11).jpg'
fork = mh.imread(complete_path)
fork = fork[:,:,0]# extract one component, ex R
#structuring elements
disk7 = pm.sedisk(3)#size 7x7: 7=3+1+3
disk5 = pm.sedisk(2)
#Just a simple thresholding with white background
bfork = fork < 150
bfork = mh.morph.dilate(bfork, disk7)
gray = cv2.imread(complete_path,0)
originale = gray
print("gray")
print(gray.shape)
cv2.imshow('graybin',gray)
cv2.waitKey()
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
imgbnbin = thresh
print("shape imgbnbin")
print(imgbnbin.shape)
cv2.imshow('binaria',imgbnbin)
cv2.waitKey()
shape = list(gray.shape)
w = int((shape[0]/100)*5)
h = int((shape[1]/100)*5)
print(w)
print(h)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(w,h)) #con 4,4 si vede tutta la stella e riconosce piccoli oggetti
from skimage.morphology import square
graydilate = np.array(imgbnbin, dtype=np.float64)
graydilate = morphology.binary_dilation(graydilate, square(w))
graydilate = morphology.binary_dilation(graydilate, square(w))
out = morphology.skeletonize(graydilate>0)
img = out.astype(float)
cv2.imshow('scikitimage',img)
cv2.waitKey()
img = img.astype(np.uint8)
cv2.imshow('scikitconvert',img)
cv2.waitKey()
contours, hierarchy = cv2.findContours(img,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))
# calculating area for deleting little signs
Areacontours = list()
calcarea = 0.0
unicocnt = 0.0
for i in range (0, len(contours)):
area = cv2.contourArea(contours[i])
#print("area")
print(area)
if (area > 90):
if (calcarea<area):
calcarea = area
unicocnt = contours[i]
cnt = unicocnt
ara = cv2.contourArea(cnt)
print("cnt")
print(ara)
#delete largest contour
cv2.drawContours(img,[cnt],0,(0,255,0),1)
cv2.imshow('img del contour',img)
cv2.waitKey()
UPDATE 해결책 (새로운 질문)
세그먼트는 점을 많이 의해 이루어집니다 만 남아 있지 않는 이유 :내가 할 경우 다음 코드 줄 이후의 골격화 된 img의 전체 복사본 : img = img.astype (np.uint8) # 골격화 절차 이후
복사 된 이미지와 함께 find_contour를 사용할 수 있으며 원본 이미지에 draw_contour를 적용하면 그게 전부입니다!
왜 윤곽 편집 내 이미지를 발견하고 난 임시 이미지를 사용하도록 강요하고 있습니다 :
내 질문은? matplotlib가 올바른 결과를 표시하고 cv2가 표시되지 않는 이유는 무엇입니까 (검은 색 이미지를 보여 줍니까?). 코드의
새로운 부분 :
import copy
imgcontour = copy.copy(img)
imgcnt = img
contours, hierarchy = cv2.findContours(imgcontour,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))
cnt = contours[0]
cv2.drawContours(img,[cnt],0,(0,0,0),1)
cv2.imshow('imgcv2black',img)
cv2.waitKey()
plt.gray()
plt.subplot(121)
plt.imshow(img)
plt.show()
UPDATE FLOODFILE + 팽창 :
그것은 플러드 필 - 팽창 절차 맞습니까? 어디에 '잘못 됐니?
a = np.ones((212,205), dtype=np.uint8)
#myMask = zeros(a.shape[0:2], dtype = uint8)
maskr = np.zeros(a.shape,np.uint8)
print(maskr.shape)
print(img[0])
cv2.floodFill(img,mask =maskr, seedPoint = (0,0), newVal = 1)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
img = cv2.dilate(img, element)
cv2.imshow('flood',img)
cv2.waitKey()
plt.gray()
plt.subplot(121)
plt.imshow(img)
plt.show()
그리고 난 불행하게도이를 얻을 : 당신이 원하는 결과를 얻을 수