Traitement d'image par Python 100 knock # 4 Binarisation Otsu (méthode d'analyse de discrimination)

introduction

Salut, je suis Ramu. Nous allons implémenter la binarisation d'Otsu (méthode d'analyse de discrimination), qui est une méthode pour déterminer automatiquement le seuil utilisé pour la binarisation.

4ème: Binarisation d'Otsu

La binarisation est le processus de conversion d'une image en une image monochrome avec seulement deux couleurs, noir et blanc. Après avoir déterminé le seuil, remplacez les valeurs de pixels inférieures au seuil par du blanc et les pixels par des valeurs de pixels supérieures au seuil par du noir. Jusqu'à présent, je l'ai expliqué dans la binarisation précédente. Cette fois, nous traiterons de la méthode de détermination automatique de ce seuil.

Dans la binarisation d'Otsu, la classe est divisée en deux selon le seuil. Le seuil lorsque le degré de séparation est maximum dans ces deux classes est le seuil lors de la binarisation. Les paramètres nécessaires pour calculer le degré de séparation peuvent être calculés par la formule suivante.

Séparation: $ X = \ dfrac {\ sigma _ {b} ^ {2}} {\ sigma _ {w} ^ {2}} $

Distribution en classe: $ \ sigma _ {b} ^ {2} = \ dfrac {\ omega _ {0} \ omega _ {1}} {(\ omega _ {0} + \ omega _ {1}) ^ 2 } (M _ {0} + M _ {1}) ^ 2 $

Distribution interclasse: $ \ sigma _ {b} ^ {2} = \ omega _ {0} \ sigma _ {0} ^ {2} + \ omega _ {1} \ sigma _ {1} ^ {2} $

Nombre de pixels appartenant à la classe 0,1: $ \ omega _0, \ omega _1 $

Distribution des valeurs de pixels appartenant aux classes 0,1: $ \ sigma _0, \ sigma _1 $

Moyenne des valeurs de pixel appartenant à la classe 0,1: $ M_0, M_1 $

Valeur moyenne des pixels de l'image entière: M $

Somme des valeurs de pixel appartenant à la classe 0,1: $ P_0, P_1 $

En résumé, lorsque le seuil est compris entre 0 et 255, le degré de séparation doit être calculé 256 fois pour trouver le seuil qui maximise le degré de séparation.

otsuBinarization.py


import numpy as np
import cv2
import matplotlib.pyplot as plt
# from statistics import variance
import statistics as st
plt.gray()


def otsuBinarization(img):
  #Copie d'image
  dst = img.copy()
  #Échelle de gris
  gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)

  w,h = gray.shape
  Max = 0

  #Valeur de pixel moyenne de l'image entière
  M = np.mean(gray)

  #S'applique aux 256 valeurs de seuil
  for th in range(256):
    #Classification
    g0,g1 = gray[gray<th],gray[gray>=th]

    #Nombre de pixels
    w0,w1 = len(g0),len(g1)
    #Distribution de la valeur des pixels
    s0_2,s1_2 = g0.var(),g1.var()
    #Valeur moyenne des pixels
    m0,m1 = g0.mean(),g1.mean()
    #Valeur totale des pixels
    p0,p1 = g0.sum(),g1.sum()

    #Distribution en classe
    sw_2 = w0*s0_2 + w1*s1_2
    #Distribution interclasse
    sb_2 = ((w0*w1) / ((w0+w1)*(w0+w1))) * ((m0-m1)*(m0-m1))
    #Séparation
    if (sb_2 != 0):
      X = sb_2 / sw_2
    else:
      X = 0

    if (Max < X):
      Max = X
      t = th

  #Binarisation
  idx = np.where(gray < t)
  gray[idx] = 0
  idx = np.where(gray >= t)
  gray[idx] = 255

  return gray


#Lecture d'image
img = cv2.imread('image.jpg')

#Binarisation d'Otsu
mono = otsuBinarization(img)

#Enregistrer l'image
cv2.imwrite('result.jpg', mono)
#Affichage de l'image
plt.imshow(mono)
plt.show()

ファイル名 ファイル名 ファイル名

Le côté gauche de l'image est l'image d'entrée, le centre de l'image est l'image de sortie lorsque le seuil est réglé manuellement sur 128, et le côté droit de l'image est l'image de sortie cette fois. Même si le seuil est automatiquement déterminé et binarisé, l'image est sortie sans trop d'inconfort. En passant, ma mise en œuvre n'utilise pas la valeur de pixel moyenne M pour toute l'image.

en conclusion

Si vous avez des questions, n'hésitez pas à nous contacter. [Github] d'imori_imori (https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_01_10/answers_py/answer_2.py) a la réponse officielle, veuillez donc vérifier cela également. .. De plus, puisque python est un débutant, veuillez surveiller et commenter toute erreur.

Recommended Posts

Traitement d'image par Python 100 knock # 4 Binarisation Otsu (méthode d'analyse de discrimination)
Traitement d'image avec la binarisation Python 100 knocks # 3
100 traitement d'image par Python Knock # 2 Échelle de gris
Bases du traitement d'images binarisées par Python
100 traitement d'image avec Python Knock # 8 Max Pooling
Dessin avec Matrix-Reinventor of Python Image Processing-
Traitement d'image avec Python 100 knocks # 7 pooling moyen
Traitement d'image par Python 100 knock # 9 Filtre Gaussien
Traitement d'image avec Python
Traitement d'image avec Python (partie 2)
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
Traitement d'image avec Python (partie 1)
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
Traitement d'image avec Python (3)
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
[Python] Traitement d'image avec scicit-image
Binarisation d'images par analyse discriminante linéaire
Traitement d'image par Python 100 knock # 10 filtre médian
Échelle de gris par matrice-Reinventor of Python image processing-
Traitement d'image avec Python et OpenCV [Tone Curve]
Traitement d'image par Python 100 knock # 12 motion filter
Traitez facilement des images en Python avec Pillow
Analyse d'image de microtomographie à rayons X par Python
Traitement d'image léger avec Python x OpenCV
Filtrage par convolution par matrice-Reinventor of Python image processing-
traitement d'image python
Traitement d'image 100 coups ①
Démarrer avec Python avec 100 coups sur le traitement du langage
Traitement d'image à partir de zéro avec python (5) Transformation de Fourier
[Diverses analyses d'images avec plotly] Visualisation dynamique avec plotly [python, image]
Analyse d'images médicales avec Python 1 (Lire une image IRM avec SimpleITK)
Traitement d'image à partir de zéro avec python (4) Extraction de contour
Traitement d'image? L'histoire du démarrage de Python pour
Traitement d'image avec la configuration de l'environnement Python pour Windows
Analyse statique du code Python avec GitLab CI
Analyse des données de pratique Python Résumé de l'apprentissage que j'ai atteint environ 10 avec 100 coups
[Traitement du langage 100 coups 2020] Résumé des exemples de réponses par Python
Traitement d'image avec MyHDL
Extraire le tableau des fichiers image avec OneDrive et Python
Traitement d'image par matrice Basics & Contents-Reinventor of Python image processing-
Binarisation avec OpenCV / Python
Remarques sur le traitement d'images HDR et RAW avec Python
Méthode Kernel avec Python
Premier traitement d'image Python
Détruire l'expression intermédiaire de la méthode sweep avec Python
Analyse vocale par python
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
Calculer le coefficient de régression d'une analyse de régression simple avec python
Défiez l'analyse des composants principaux des données textuelles avec Python
Analyse du squelette de plan avec Python (4) Gestion du déplacement forcé
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
Analyse vocale par python
Analyse de données avec Python
Divers traitements de Python
Traitement d'image avec PIL