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.
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
L'environnement utilise Google Colaboratory. La version Python est ci-dessous.
import platform
print("python " + platform.python_version())
# python 3.6.9
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)
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)
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)
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)
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.
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
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)
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)
En haut à gauche, les tailles de bloc sont 3, 5, 7 (supérieur), 9, 11, 13 (inférieur).
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