Dans une conférence universitaire, j'ai eu un problème pour trouver le seuil en utilisant la méthode de tuile P, donc je l'ai implémenté en utilisant python3.
C'est un algorithme qui détermine le point qui divise la zone par X% dans l'histogramme comme seuil.
ptile.ipynb
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
file = "./sample.png "
#Fonction qui renvoie un seuil
def decideTh(area, ret):
#Seuil
th = 0
#Contexte
background = 0
#Rapport de surface
bg_ratio = 1 / 2
count = 0
#Recherche de fond
for i in ret[0]:
background += i
if background == 0:
ratio = 0
else:
ratio = background /area
#Remplacez la valeur de luminosité jusqu'à ce que l'arrière-plan dépasse le rapport de surface
if ratio <= bg_ratio:
th = ret[1][count]
count+=1
return th
#Une fonction qui convertit une image en histogramme et en seuil
def binari(filename):
#Zone de l'histogramme
area = 0
#Convertit l'image en échelle de gris et attribue la valeur de luminosité à la fonction
img = np.array(Image.open(filename).convert("L")).reshape(-1,1)
#Convertir la valeur de luminosité en histogramme et la remplacer
ret = (plt.hist(img, bins=255))
#Trouvez la zone de l'histogramme
for i in ret[0]:
area += i
th = decideTh(area,ret)
return th
print(binari(file))
img = np.array(Image.open(filename).convert("L")).reshape(-1,1)
ret = (plt.hist(img, bins=255))
Pour ce code, je cite [Afficher un histogramme des valeurs de luminosité d'image en python] de @ seigot (https://qiita.com/seigot/items/c60087b3f7812d2d6dc7).
Recommended Posts