Eine Geschichte über Bildverarbeitung und Graustufenkonvertierung nur durch Matrixberechnung, ohne sich auf die Bildverarbeitungsbibliothek zu verlassen. Auch mit Pythonista möglich
** Klicken Sie hier für Grundlagen **
Anstatt mich auf Open CV oder Pillow zu verlassen, werde ich tatsächlich verschiedene Bildverarbeitungen mit numpy und matplotlib schreiben. Diese Kombination kann auch mit der iOS-App Pythonista verwendet werden.
import numpy as np
import matplotlib.pyplot as plt
Darüber hinaus sind die folgenden Funktionen zum Anzeigen von Bildern praktisch. (Einzelheiten finden Sie unter Grundlagen)
def img_show(img : np.ndarray, cmap = 'gray', vmin = 0, vmax = 255, interpolation = 'none') -> None:
'''np.Zeigen Sie ein Bild mit Array als Argument an.'''
#Setzen Sie dtype auf uint8
img = np.clip(img,,vmin,vmax).astype(np.uint8)
#Bild anzeigen
plt.imshow(img, cmap = cmap, vmin = vmin, vmax = vmax, interpolation = interpolation)
plt.show()
plt.close()
Die Grauskalierung ist eine Methode zur Berechnung des Schwarz-Weiß-Werts Y aus den jedem Pixel zugewiesenen RGB-Werten. Hier Verschiedene Graustufenmethoden, die in [Basic] nicht behandelt wurden (http://qiita.com/secang0/items/1229212a37d8c9922901) ) Probiere auch. Eine ausführliche Erklärung finden Sie unter dem Link. Sie werden in derselben Reihenfolge behandelt.
Das verwendete Bild ist 'tiger.jpeg'
img = plt.imread('tiger.jpeg')
R, G, B = img[...,0], img[...,1], img[...,2]
Hier wird eine Funktion zum Vergleichen und Anordnen von Farbe und Schwarzweiß definiert.
def align_show(img_gray):
#img_grau bis N.*M*In 3 konvertieren
img_pseudogray = np.einsum('ij,k->ijk',img_gray,[1,1,1])
#Seite an Seite anzeigen
img_show(np.concatenate((img,img_pseudogray), axis = 1))
$ \ rm Y = \ frac {\ max (R, G, B) + \ min (R, G, B)} {2} $. Es ist eine Methode. Kurz gesagt, der Durchschnitt der Maximal- und Minimalwerte. In der tatsächlichen Berechnung wird die Reihenfolge der Berechnung teilweise von der obigen Formel geändert, um einen Überlauf zu vermeiden.
img_mid_v = np.max(img, axis = 2)/2 +np.min(img, axis = 2)/2
img_show(img,img_mid_v)
Auf den ersten Blick gibt es kein Problem, aber der Knopf (?) In der Mitte des Labyrinths ist schwer zu erkennen.
Dies ist eine Methode zum Setzen von $ \ rm Y = (0,298912 R + 0,586611 G + 0,114478 B) $. Diese Koeffizienten sind das Ergebnis der Berücksichtigung der Auswirkung (psychologische Gewichtung) jedes RGB auf das menschliche Auge.
img_ntsc = (0.298912 * R + 0.586611 * G + 0.114478 * B)
align_show(img_ntsc)
Güte
$ \ rm Y = ((0,222015 R) ^ X + (0,706655 G) ^ X + (0,071330 B) ^ X) ^ {1 / X} $. Dies beinhaltet auch eine psychologische Gewichtung.
X = 2.2
img_hdtv = ((0.222015*R)**X + (0.706655*G)**X + (0.071330*B)**X)**(1/X)
align_show(img_hdtv)
Es ist so anders, dass ich den Unterschied zur NTSC-Methode nicht erkennen kann.
Dies ist eine Methode, um den Durchschnitt von $ \ rm Y = \ frac {R + G + B} {3} $ zu ermitteln. Wahrscheinlich der intuitivste Weg. Es kann gesagt werden, dass es die NTSC-Methode ist, bevor der gewichtete Durchschnitt genommen wird.
img_mean = np.mean(img)
align_show(img_mean)
So rufen Sie nur den G-Kanal $ \ rm Y = G $ ab. Es scheint das schnellste zu sein.
img_g_channel = G
align_show(img_g_channel)
Ich frage mich, ob der rote Teil etwas zu dunkel ist ...
So ermitteln Sie den Medianwert von $ \ rm Y = Median (R, G, B) $. Ich bin der Meinung, dass die Idee der Zwischenwertmethode ähnlich ist.
img_median = np.median(img, axis = 2)
align_show(img_median)
Wie bei der Mittelwertmethode ist das Grün zu dunkel.
Zwischenwert | NTSC | HDTV |
---|---|---|
Das Originalbild | ||
Einfacher Durchschnitt | G-Kanal | Median |
Recommended Posts