Die Gammakorrektur ist eine Methode zur Umwandlung von Helligkeit und Kontrast in der Bildverarbeitung.
Die Formel ist einfach, wenn die Eingabe x und die Ausgabe y ist $ y = 255 ・ (\ frac {x} {255}) ^ \ frac {1} {\ gamma} $ Kann vertreten werden durch. Durch Ändern des Werts dieses $ \ gamma $ können Sie den Pixelwert des Ausgabebilds ändern. Wenn $ \ gamma $ größer als 1 ist, ist es insgesamt heller, und wenn $ \ gamma $ kleiner als 1 ist, ist es insgesamt dunkler. Die folgende Abbildung zeigt die Beziehung zwischen Eingabe und Ausgabe, wenn der Wert von $ \ gamma $ geändert wird.
In einigen Fällen ist $ \ frac {1} {\ gamma} $ in der Formel nur $ \ gamma $. In diesem Fall werden die Konvexe oben und die Konvexe unten umgeschaltet.
Die Bildverarbeitungsbibliothek OpenCV verfügt auch über eine Gammakorrekturfunktion. Wie Sie der Formel entnehmen können, ist dies sehr einfach, sodass Sie eine Gammakorrekturfunktion nur mit numpy erstellen können.
Lassen Sie uns eine Gammakorrekturfunktion basierend auf der Formel erstellen. Für einen Augenblick.
#python version 3.6.5
import numpy as np #version 1.14.3
import matplotlib.pyplot as plt
from skimage import io #scikit image version 0.13.1
plt.rcParams["font.family"] = "Times New Roman"
plt.rcParams["font.size"] = 12
def gammma(x, r):
"""
Gammakorrektur y=255*(x/255)
x Eingabebild
r Gammakorrekturkoeffizient
"""
x = np.float64(x)
y = x/255.
y = y **(1/r)
return np.uint8(255*y)
Erstellen Sie auch eine Funktion zum Erstellen und Anzeigen eines Histogramms für jedes RGB. (Wiederkehrende Räder ... unten weggelassen)
def hist_rgb(img):
#Funktion zum Erstellen eines Histogramms von rgb
#Variable res, die das Ergebnis speichert[brightness, channel]
res = np.zeros([256, 3])
for channel in range(3):
#Extrahieren Sie einen Kanal
img_tmp = img[:,:,channel]
#Machen Sie das Bild eindimensional
img_tmp =img_tmp.reshape(img_tmp.size)
for i in img_tmp:
res[i, channel] += 1
return res
def mat_hist_rgb(hist, ylim = 0.06):
#hist_Zeigen Sie das mit der Funktion von rgb berechnete Histogramm an
x = np.arange(hist.shape[0])
#Geben Sie die Farbe des Histogramms an
colors = ["red", "green", "blue"]
for i, color in enumerate(colors):
plt.bar(x,hist[:, i], color=color, alpha=0.3, width=1.0)
plt.xlabel("Brightness")
plt.ylabel("Frequency")
plt.xlim(0, 255)
plt.yticks([])
plt.show()
Lesen Sie zuerst lena und zeigen Sie das Histogramm des Originalbildes an.
img_lena = io.imread("lena_std.tif")
hist_lena = hist_rgb(img_lena)
mat_hist_rgb(hist_lena)
Sie können sehen, dass es viele rote Komponenten gibt.
Wenn $ \ gamma = 0,5 $
img_gamma = gammma(img_lena, r=0.5)
io.imsave("r05.png ", img_gamma)
mat_hist_rgb(hist_rgb(img_gamma))
Wenn Sie sich das Histogramm ansehen, sehen Sie, dass es viel dunkler als das Originalbild ist.
Wenn $ \ gamma = 2,0 $
img_gamma = gammma(img_lena, r=2.0)
io.imsave("r05.png ", img_gamma)
mat_hist_rgb(hist_rgb(img_gamma))
Es wird deutlich heller.
Wenn Sie sich das Histogramm ansehen, sehen Sie, dass Lenas Bild insgesamt ein rötliches Bild ist. Daher wird die Gammakorrektur nur auf eine bestimmte Farbe angewendet, in diesem Fall auf den roten Kanal.
#Geben Sie RGB an, die nach Kanal konvertiert werden sollen, R=0, G=1, B=2
channel = 0
#Kopieren Sie das Originalbild
img_gamma = np.copy(img_lena)
#Gamma-Korrektur
img_gamma[:,:,channel] = gammma(img_lena[:,:,channel], r=0.3)
io.imsave("red.png ", img_gamma)
mat_hist_rgb(hist_rgb(img_gamma))
Da $ \ gamma = 0,3 $ ist, wird die rote Komponente geschwächt. Das fühlt sich natürlicher an.
Digitale Bildverarbeitung [Überarbeitete 2. Auflage], Public Interest Incorporated Foundation Vereinigung zur Förderung der Bildinformationsbildung (2020)
Recommended Posts