Je voudrais supprimer l'ombre avant la binarisation d'images à l'aide d'OpenCV. J'ai essayé la méthode Otsu et le seuillage adaptatif, mais pour les images où il y a de grandes zones d'ombre, ces deux méthodes ne donneront pas de bons résultats.
De meilleures solutions? Merci d'avance.
] 1
] 2
Puisque vous n'avez spécifié aucune langue, je suppose que Python pour illustrer.
Un point de départ décent pourrait prendre l'approche que je montre dans cette réponse et l'étendre pour fonctionner avec plusieurs canaux.
Quelque chose dans le sens de
import cv2
import numpy as np
img = cv2.imread('shadows.png', -1)
rgb_planes = cv2.split(img)
result_planes = []
result_norm_planes = []
for plane in rgb_planes:
dilated_img = cv2.dilate(plane, np.ones((7,7), np.uint8))
bg_img = cv2.medianBlur(dilated_img, 21)
diff_img = 255 - cv2.absdiff(plane, bg_img)
norm_img = cv2.normalize(diff_img,None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)
result_planes.append(diff_img)
result_norm_planes.append(norm_img)
result = cv2.merge(result_planes)
result_norm = cv2.merge(result_norm_planes)
cv2.imwrite('shadows_out.png', result)
cv2.imwrite('shadows_out_norm.png', result_norm)
Le résultat non normalisé se présente comme suit:
Et le résultat normalisé: