Je suis en train d'appliquer un seuillage sur une image à base de texte et de chiffres. En utilisant skimage.filters.try_all_threshold
entraîne l'application de 7 algorithmes de seuillage. Je suis capable d'obtenir le résultat mais je pense à la façon dont je peux choisir seulement 1 résultat pour passer le résultat au processus suivant / choisir dynamiquement 1 meilleur résultat.
Réponse
Trop de publicités?Vous devez définir un mesure de la similarité entre l'image originale et les images binarisées, puis de sélectionner la méthode de seuillage qui maximise cette mesure.
Demo
Le code suivant vise simplement à vous mettre sur la bonne voie. Remarquez que la fonction similarity
renvoie un nombre aléatoire plutôt qu'une mesure de similarité raisonnable. Vous devriez l'implémenter vous-même ou la remplacer par une fonction appropriée.
import numpy as np
from skimage.data import text
import skimage.filters
import matplotlib.pyplot as plt
threshold_methods = [skimage.filters.threshold_otsu,
skimage.filters.threshold_yen,
skimage.filters.threshold_isodata,
skimage.filters.threshold_li,
skimage.filters.threshold_mean,
skimage.filters.threshold_minimum,
skimage.filters.threshold_mean,
skimage.filters.threshold_triangle,
]
def similarity(img, threshold_method):
"""Similarity measure between the original image img and and the
result of applying threshold_method to it.
"""
return np.random.random()
results = np.asarray([similarity(text(), f) for f in threshold_methods])
best_index = np.nonzero(results == results.min())[0][0]
best_method = thresholding_methods[best_index]
threshold = best_method(text())
binary = text() >= threshold
fig, ax = plt.subplots(1, 1)
ax.imshow(binary, cmap=plt.cm.gray)
ax.axis('off')
ax.set_title(best_method.__name__)
plt.show(fig)
Modifier
Il est évidemment absurde de choisir la méthode de seuillage au hasard (comme je l'ai fait dans l'exemple du jouet ci-dessus). Au lieu de cela, vous devriez implémenter une mesure de similarité qui vous permette de sélectionner automatiquement l'algorithme le plus efficace. Une façon possible de le faire consisterait à calculer la valeur de erreur de classification c'est-à-dire le pourcentage de pixels d'arrière-plan affectés à tort au premier plan et, inversement, de pixels de premier plan affectés à tort à l'arrière-plan. Comme l'erreur de classification est une mesure de dissemblance plutôt qu'une mesure de similarité, vous devez choisir la méthode qui minimise cette mesure comme ceci :
best_index = np.nonzero(results == results.min())[0][0]
Jetez un coup d'œil à cet article pour plus de détails sur cette approche et d'autres approches de l'évaluation des performances du seuillage.