Une histoire sur le traitement d'image et la conversion des niveaux de gris uniquement par calcul matriciel sans s'appuyer sur la bibliothèque de traitement d'image. Également possible avec Pythonista
** Cliquez ici pour les informations de base **
Au lieu de m'appuyer sur Open CV ou Pillow, j'écrirai en fait divers traitements d'images en utilisant numpy et matplotlib. C'est une combinaison qui peut également être utilisée avec l'application iOS Pythonista.
import numpy as np
import matplotlib.pyplot as plt
De plus, les fonctions suivantes sont pratiques pour afficher des images. (Pour plus de détails, Basics)
def img_show(img : np.ndarray, cmap = 'gray', vmin = 0, vmax = 255, interpolation = 'none') -> None:
'''np.Afficher une image avec un tableau comme argument.'''
#Définissez dtype sur uint8
img = np.clip(img,,vmin,vmax).astype(np.uint8)
#Afficher l'image
plt.imshow(img, cmap = cmap, vmin = vmin, vmax = vmax, interpolation = interpolation)
plt.show()
plt.close()
La mise à l'échelle des gris est une méthode de calcul de la valeur Y noir et blanc à partir des valeurs RVB attribuées à chaque pixel. Ici, Diverses méthodes d'échelle de gris qui n'ont pas été traitées dans Basic ) Essayez aussi. Voir le lien pour une explication détaillée. Ils sont traités dans le même ordre.
L'image utilisée est «tiger.jpeg»
img = plt.imread('tiger.jpeg')
R, G, B = img[...,0], img[...,1], img[...,2]
Une fonction de comparaison et d'organisation des couleurs et du noir et blanc est définie ici.
def align_show(img_gray):
#img_gris à N*M*Convertir en 3
img_pseudogray = np.einsum('ij,k->ijk',img_gray,[1,1,1])
#Affichage côte à côte
img_show(np.concatenate((img,img_pseudogray), axis = 1))
$ \ rm Y = \ frac {\ max (R, V, B) + \ min (R, G, B)} {2} $. C'est une méthode. En bref, la moyenne des valeurs maximales et minimales. Dans le calcul réel, l'ordre de calcul est partiellement modifié par rapport à la formule ci-dessus pour éviter tout débordement.
img_mid_v = np.max(img, axis = 2)/2 +np.min(img, axis = 2)/2
img_show(img,img_mid_v)
Il n'y a pas de problème à première vue, mais le bouton (?) Au milieu du labyrinthe est difficile à voir.
C'est une méthode de réglage de $ \ rm Y = (0.298912 R + 0.586611 G + 0.114478 B) $. Ces coefficients résultent de la prise en compte de l'effet (pondération psychologique) de chaque RVB sur l'œil humain.
img_ntsc = (0.298912 * R + 0.586611 * G + 0.114478 * B)
align_show(img_ntsc)
La bonté
$ \ rm Y = ((0.222015 R) ^ X + (0.706655 G) ^ X + (0.071330 B) ^ X) ^ {1 / X} $. Cela intègre également une pondération psychologique.
X = 2.2
img_hdtv = ((0.222015*R)**X + (0.706655*G)**X + (0.071330*B)**X)**(1/X)
align_show(img_hdtv)
C'est tellement différent que je ne peux pas faire la différence avec la méthode NTSC.
C'est une méthode pour prendre la moyenne de $ \ rm Y = \ frac {R + G + B} {3} $. Probablement la manière la plus intuitive. On peut dire que c'est la méthode NTSC avant de prendre la moyenne pondérée.
img_mean = np.mean(img)
align_show(img_mean)
Comment récupérer uniquement le canal G $ \ rm Y = G $. Cela semble être le plus rapide.
img_g_channel = G
align_show(img_g_channel)
Je me demande si la partie rouge est un peu trop sombre ...
Comment récupérer la valeur médiane de $ \ rm Y = median (R, G, B) $. Je pense que l'idée est similaire à la méthode de la valeur intermédiaire.
img_median = np.median(img, axis = 2)
align_show(img_median)
Comme pour la méthode des valeurs moyennes, le vert est trop foncé.
Valeur intermédiaire | NTSC | HDTV |
---|---|---|
L'image originale | ||
Moyenne simple | Canal G | Médian |
Recommended Posts