J'essaie de comparer des images avec OpenCV et Python.
Considérez ces images:
Les deux comportent une paire de chaussures identique, sur fond blanc. La seule différence est que le premier a un fond plus grand que le second.
Je veux savoir comment rogner par programme les fonds blancs des deux pour qu'il ne me reste que la paire de chaussures.
Je dois ajouter qu'il ne me sera pas possible de rogner manuellement les arrière-plans.
Votre exigence dans le commentaire: The shoes are on a white background. I would like to completely get rid of the border; as in be left with a rectangular box with either a white or a transparent background, having the length and width of the shoes in the picture.
Ensuite, mes étapes pour recadrer les régions cibles:
- Convertir en gris et seuil
- Morph-op pour supprimer le bruit
- Trouver le contour de la zone maximale
- Recadrer et sauvegarder
#!/usr/bin/python3
# Created by Silencer @ Stackoverflow
# 2018.01.23 14:41:42 CST
# 2018.01.23 18:17:42 CST
import cv2
import numpy as np
## (1) Convert to gray, and threshold
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
th, threshed = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)
## (2) Morph-op to remove noise
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11,11))
morphed = cv2.morphologyEx(threshed, cv2.MORPH_CLOSE, kernel)
## (3) Find the max-area contour
cnts = cv2.findContours(morphed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
cnt = sorted(cnts, key=cv2.contourArea)[-1]
## (4) Crop and save it
x,y,w,h = cv2.boundingRect(cnt)
dst = img[y:y+h, x:x+w]
cv2.imwrite("001.png", dst)
Résultat:
This link a parfaitement fonctionné pour moi pour un problème similaire, bien qu'il utilise PIL. Notez que cela donnera une image rectangulaire, délimitée par les pixels les plus haut/droit/bas/gauche qui ne sont pas blancs. Dans votre cas, cela devrait donner des images identiques avec la même taille.
Je suppose que le code pourrait être facilement adapté pour fonctionner uniquement avec les fonctions OpenCV.