2 votes

Trouver les contours n'est pas précis

J'ai une question pour trouver les contours de cette image, j'ai utilisé le findcontour qui n'est pas très précis, est-ce que je fais mal ?

Here's my result but its not accurate.

Here's the image I've used

gs = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
blur = cv2.GaussianBlur(gs, (3,3),0)
ret_otsu,im_bw_otsu = cv2.threshold(blur,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

kernel = np.ones((50,50),np.uint8)
closing = cv2.morphologyEx(im_bw_otsu, cv2.MORPH_CLOSE, kernel)
_, contours, hierarchy = cv2.findContours(closing,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

plottedContour = cv2.drawContours(gs,contours,-1,(0,255,0),2)
cv2.imshow('CONTOUR',plottedContour)

1voto

kpie Points 3207

On dirait que vous pourriez vouloir regarder des contours supplémentaires,

cv2.drawContours(gs,contours,-1,(0,255,0),2)
cv2.drawContours(gs,contours,0,(0,255,0),2)
cv2.drawContours(gs,contours,1,(0,255,0),2)
cv2.drawContours(gs,contours,2,(0,255,0),2)
...

1voto

nathancy Points 6407

L'idée est d'obtenir une image binaire le filtre pour le plus grand contour en supposant que la banane est l'objet principal de l'image. A partir de là, nous pouvons dessiner un rectangle en utilisant cv2.rectangle ou dessiner autour du contour avec cv2.drawContours . En option, nous pouvons également recadrer le retour sur investissement en utilisant le découpage Numpy.

Rectangle dessiné

enter image description here

Contour dessiné

enter image description here

ROI extrait

enter image description here

Code

import cv2

# Load image, grayscale, blur, Otsu's threshold
image = cv2.imread('1.jpg')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Find contours and sort for largest contour
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)

for c in cnts:
    # Crop ROI
    x,y,w,h = cv2.boundingRect(c)
    ROI = original[y:y+h, x:x+w]
    cv2.imwrite('ROI.png', ROI)

    # Draw rectangle
    cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)

    # Draw contours
    # cv2.drawContours(image, [c], -1, (36,255,12), 2)
    break

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X