web-dev-qa-db-fra.com

Comment supprimer l'ombre des images numérisées à l'aide d'OpenCV?

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.

[Sample image] 1

[Sample image] 2

9
Liu Zhiyuan

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:

enter image description here

Et le résultat normalisé:

enter image description here

19
Dan Mašek