J'ai essayé de "binariser" l'image avec Python + OpenCV

introduction

Dans le traitement d'image, les images couleur sont souvent trop d'informations pour obtenir les informations dont vous avez besoin. Par conséquent, je pense que le flux général consiste à mettre en échelle de gris ou à binariser les informations nécessaires telles que les caractères et les bords pour faciliter leur obtention. Cette fois, nous utiliserons Python pour binariser l'image avec OpenCV.

Qu'est-ce que la binarisation?

La binarisation est le processus de conversion d'une image en deux gradations, blanc et noir. En binarisation, un seuil (seuil) est déterminé à l'avance, et si la valeur du pixel est supérieure au seuil, elle est convertie en blanc, et si elle est plus petite, elle est convertie en noir. Référence: Qu'est-ce que la binarisation? Dictionnaire Weblio

Préparation

L'environnement utilise Google Colaboratory. La version Python est ci-dessous.

import platform
print("python " + platform.python_version())
# python 3.6.9

Montrons l'image

Maintenant écrivons le code. Tout d'abord, importez OpenCV.

import cv2

De plus, importez les éléments suivants pour afficher l'image dans Colaboratory.

from google.colab.patches import cv2_imshow

Préparez également un exemple d'image. Cette fois, j'utiliserai l'image gratuite de Pixabay.

Maintenant, affichons l'exemple d'image préparé.

img = cv2.imread(path) #chemin spécifie où l'image est placée
cv2_imshow(img)

image.png

niveaux de gris

L'échelle de gris (échelle de gris ou échelle de gris) est un type de représentation des couleurs. L'échelle de gris représente l'image, y compris la nuance de gris entre le blanc le plus fort et le noir le plus faible. Référence: [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B9%E3%82%B1%E3 % 83% BC% E3% 83% AB)

Les images en échelle de gris peuvent être visualisées ci-dessous.

img_gray = cv2.imread(path, 0)
cv2_imshow(img_gray)

image.png

Binarisation générale

La binarisation est le processus de conversion d'une image en deux valeurs (binaires), blanc et noir. Il est différent de l'échelle de gris qui s'affiche entre le blanc et le noir par étapes. Une valeur appelée seuil (seuil) est déterminée, et si la valeur du pixel est plus grande que cela, elle est convertie en blanc, et si elle est plus petite, elle est convertie en noir.

Maintenant, affichons l'image binarisée. Afin de binariser, vous devez utiliser une image ** en niveaux de gris. ** ** À titre d'essai, définissons le seuil sur 100.

threshold = 100
ret, img_th = cv2.threshold(img_gray, threshold, 255, cv2.THRESH_BINARY)
print(ret)
# 100.0
cv2_imshow(img_th)

image.png

Il existe deux valeurs de retour pour cv2.threshold. Le premier est la valeur seuil et le second est l'image binarisée. Puisque 100 est spécifié comme valeur de seuil cette fois, 100 est naturellement renvoyé comme première valeur de retour.

Maintenant, affichons l'image avec quelques seuils.

_, img1 = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY)
_, img2 = cv2.threshold(img_gray, 50, 255, cv2.THRESH_BINARY)
_, img3 = cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY)
_, img4 = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY)
_, img5 = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY)
_, img6 = cv2.threshold(img_gray, 250, 255, cv2.THRESH_BINARY)
imgs_1 = cv2.hconcat([img1, img2, img3])
imgs_2 = cv2.hconcat([img4, img5, img6])
imgs = cv2.vconcat([imgs_1, imgs_2])
cv2_imshow(imgs)

image.png

Les images sont binarisées avec des seuils de 0, 50, 100 (supérieur), 150, 200, 250 (inférieur) dans l'ordre en haut à gauche.

Binarisation d'Otsu

Dans la binarisation ci-dessus, divers seuils ont été définis et l'image a été produite. Il semble que nous devions répéter essais et erreurs pour savoir quelle valeur est appropriée comme seuil. La binarisation d'Otsu est la solution à de tels problèmes. La binarisation d'Otsu (ou «méthode d'Otsu») est une méthode de définition d'un seuil basé sur l'histogramme de l'image (distribution de la luminosité). En gros, c'est "** il fixera un joli seuil sans permission **".

L'image de la binarisation d'Otsu peut être affichée ci-dessous.

ret, img_otsu = cv2.threshold(img_gray, 0, 255, cv2.THRESH_OTSU)
print(ret)
cv2_imshow(img_otsu)
# 126.0

image.png

La première valeur de retour de cv2.threshold est le seuil. Cette fois, le seuil fixé par la binarisation d'Otsu est de 126.

adaptive threshold La binarisation générale et la binarisation Otsu ont été effectuées avec un certain seuil pour l'image entière. D'autre part, le seuil adaptatif (appelé «traitement de seuil adaptatif» en japonais) consiste à binariser en changeant le seuil en fonction de l'emplacement. Selon l'emplacement, il peut être particulièrement sombre ou lumineux, et il peut ne pas être approprié de binariser avec un certain seuil pour toute l'image. Une méthode efficace dans de tels cas est le seuil adaptatif.

Les images avec un seuil adaptatif peuvent être affichées ci-dessous.

img_adap = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, 1)
cv2_imshow(img_adap)

image.png

Ici, les 3e et 4e arguments de cv2.adaptiveThreshold spécifient la méthode de calcul du seuil. Dans ce cas, cv2.ADAPTIVE_THRESH_MEAN_C et cv2.THRESH_BINARY sont utilisés. Pour plus de détails, veuillez vous référer au document officiel.

Le 5ème argument 3 spécifie la taille du bloc, c'est-à-dire la taille de la zone à cibler. Cela doit spécifier un nombre impair supérieur à ** 1. Le sixième argument, 1, est appelé une constante de soustraction, qui est une constante soustraite du seuil calculé.

Essayons d'afficher des images dans différentes tailles de bloc.

img1 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, 1)
img2 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 1)
img3 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 1)
img4 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 1)
img5 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 1)
img6 = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 13, 1)
imgs_1 = cv2.hconcat([img1, img2, img3])
imgs_2 = cv2.hconcat([img4, img5, img6])
imgs = cv2.vconcat([imgs_1, imgs_2])
cv2_imshow(imgs)

image.png

En haut à gauche, les tailles de bloc sont 3, 5, 7 (supérieur), 9, 11, 13 (inférieur).

Résumé

Cette fois, j'ai utilisé Python pour binariser l'image avec OpenCV.

Si vous souhaitez extraire des caractères, des bords, etc. de l'image, essayez la méthode de binarisation.

Pour plus de détails sur la binarisation, veuillez consulter ce qui suit.

Recommended Posts

J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé de jouer avec l'image avec Pillow
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
Édition d'image avec python OpenCV
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de résoudre le problème avec Python Vol.1
Python Open CV a essayé d'afficher l'image sous forme de texte.
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
J'ai essayé de frapper l'API avec le client python d'echonest
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
J'ai aimé le tweet avec python. ..
Trouver la similitude d'image avec Python + OpenCV
Essayez de brouiller l'image avec opencv2
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai essayé la reconnaissance faciale avec OpenCV
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai essayé de reconnaître le visage de la vidéo (OpenCV: version python)
Traitement d'image avec Python (j'ai essayé de le binariser en art mosaïque 0 et 1)
Traitement d'image avec Python et OpenCV [Tone Curve]
Acquisition d'images depuis une caméra avec Python + OpenCV
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
Python: j'ai essayé le problème du voyageur de commerce
J'ai essayé la reconnaissance d'image simple avec Jupyter
Traitement d'image léger avec Python x OpenCV
J'ai essayé le framework de test Python Tornado
# J'ai essayé quelque chose comme Vlookup avec Python # 2
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
Je viens d'effacer l'objet en utilisant la réparation d'image (inpaint) (OpenCV: Python)
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
J'ai essayé des centaines de millions de SQLite avec python
[Python] J'ai essayé de remplacer le nom de la fonction par le nom de la fonction
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
vprof - J'ai essayé d'utiliser le profileur pour Python
Comment couper la partie inférieure droite de l'image avec Python OpenCV
J'ai essayé la reconnaissance d'image de CIFAR-10 avec la reconnaissance d'image Keras-
J'ai essayé la détection d'objets en utilisant Python et OpenCV
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de détecter rapidement un mouvement avec OpenCV