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é
Contour dessiné
ROI extrait
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()