4 votes

Comment sélectionner automatiquement le meilleur résultat à partir de try_all_threshold ?

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.

1voto

Tonechas Points 6220

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)

isodata

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X