Échelle de gris par matrice-Reinventor of Python image processing-

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 **

Qu'est-ce qu'un «réinventeur»?

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()

Échelle de gris

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» 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))

Méthode de la valeur intermédiaire

$ \ 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)

mid_v.png

Il n'y a pas de problème à première vue, mais le bouton (?) Au milieu du labyrinthe est difficile à voir.

Méthode de moyenne pondérée avec coefficient NTSC

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)

ntsc.png

La bonté

Moyenne pondérée et correction par coefficient HDTV

$ \ 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)

hdtv.png

C'est tellement différent que je ne peux pas faire la différence avec la méthode NTSC.

Méthode simple de calcul de la moyenne

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)

mean.png

Méthode du canal G

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)

g_channel.png

Je me demande si la partie rouge est un peu trop sombre ...

Méthode médiane

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)

median.png

Comme pour la méthode des valeurs moyennes, le vert est trop foncé.

Résumé

Valeur intermédiaire NTSC HDTV
L'image originale
Moyenne simple Canal G Médian

sumup.png

Recommended Posts

Échelle de gris par matrice-Reinventor of Python image processing-
Dessin avec Matrix-Reinventor of Python Image Processing-
Traitement d'image par python (Pillow)
Traitement d'image par matrice Basics & Contents-Reinventor of Python image processing-
100 traitement d'image par Python Knock # 2 Échelle de gris
traitement d'image python
Bases du traitement d'images binarisées par Python
Traitement d'image par le remplacement du canal Python 100 Knock # 1
Traitement d'image par Python 100 Knock # 6 Traitement de réduction de couleur
Analyse d'image de microtomographie à rayons X par Python
Filtrage par convolution par matrice-Reinventor of Python image processing-
Dessin linéaire avec une matrice - Recherche originale par un réinventeur du traitement d'image Python -
Traitement de la communication par Python
Premier traitement d'image Python
Traitement d'image avec Python
Divers traitements de Python
Traitement d'image? L'histoire du démarrage de Python pour
Traitement d'image par filtre de lissage Python 100 knock # 11 (filtre moyen)
Traitement d'image avec Python (partie 2)
[Traitement du langage 100 coups 2020] Résumé des exemples de réponses par Python
Conversion d'affine par matrice (agrandissement / réduction / rotation / cisaillement / mouvement) -Réinventeur du traitement d'image Python-
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
Post-traitement de python (NG)
Collection de traitement d'image en Python
[Python] Traitement d'image avec scicit-image
Erreur divisée par 0 Traitement de ZeroDivisionError 2
Capture d'image de Firefox en utilisant Python
Extension du dictionnaire python par argument
Notes personnelles pour le traitement d'images python
Traitement d'image avec la binarisation Python 100 knocks # 3
Comportement de python3 par le serveur de Sakura
100 Language Processing Knock Chapitre 1 par Python
Histoire d'approximation de puissance par Python
Traitement d'image par Python 100 knock # 4 Binarisation Otsu (méthode d'analyse de discrimination)
Explication du modèle d'optimisation de la production par Python
Traitement d'image par Python 100 knock # 10 filtre médian
Python: principes de base de la reconnaissance d'image à l'aide de CNN
Communication socket et traitement multi-thread par Python
[Mémo d'apprentissage] Bases de la classe par python
100 traitement d'image avec Python Knock # 8 Max Pooling
Branchement conditionnel de Python appris avec la chimioinfomatique
[Python] Calcul de la similarité d'image (coefficient de dés)
Exemple d'analyse de squelette tridimensionnelle par Python
Traitement d'image avec Python et OpenCV [Tone Curve]
Traitement d'image par Python 100 knock # 12 motion filter
Modifier le traitement par saisie utilisateur de la boîte de dialogue
Pandas du débutant, par le débutant, pour le débutant [Python]
Traitez facilement des images en Python avec Pillow
Traitement d'image avec Python 100 knocks # 7 pooling moyen
L'histoire du traitement A du blackjack (python)
Traitement d'image léger avec Python x OpenCV
Statut de chaque système de traitement Python en 2020
Traitement d'image par Python 100 knock # 9 Filtre Gaussien
[Traitement d'image] Postérisation
Extraire la couleur dominante de l'image par clustering k-means
Traitement d'image à partir de zéro avec python (5) Transformation de Fourier
Afficher le résultat du traitement de la géométrie en Python