[PYTHON] Gammakorrektur ohne OpenCV

Einführung

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. gamma.png

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.

Eigentlich versuchen

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)

lena_std.jpg origin.png

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

r05.png

Wenn Sie sich das Histogramm ansehen, sehen Sie, dass es viel dunkler als das Originalbild ist.

05hist.png

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.

r20.png

20.png

Korrigieren Sie nur bestimmte Farben

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.

red.png

rr.png

Verweise

Digitale Bildverarbeitung [Überarbeitete 2. Auflage], Public Interest Incorporated Foundation Vereinigung zur Förderung der Bildinformationsbildung (2020)

Recommended Posts

Gammakorrektur ohne OpenCV
Überschussberechnung ohne Verwendung von%
Schreiben Sie FizzBuzz ohne "="
Schnelle Sortierung ohne Sortierung
Überschussberechnung ohne Verwendung von%
Blasensortierung ohne Sortierung
Schreiben Sie FizzBuzz ohne "="
Schnelle Sortierung ohne Sortierung
Gammakorrektur ohne OpenCV
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Feature-Erkennung mit opencv (Eckenerkennung)
[Python] Verwenden von OpenCV mit Python (Basic)
Versuchen Sie es mit OpenCV unter Windows
Verwenden von OpenCV mit Python @Mac
Erstellen Sie eine gestreifte Illusion mit Gammakorrektur für Python3 und openCV3
Vertikaler Turm von Pisa mit OpenCV ~
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
Beurteilung des hintergrundbeleuchteten Bildes mit OpenCV
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
[Python3] Google übersetzt Google Übersetzung ohne Verwendung von API
[Python] Verwenden von OpenCV mit Python (Kantenerkennung)
Ich habe versucht, GrabCut von OpenCV zu verwenden
Horizontale Linienverarbeitung mit OpenCV-Morphologietransformation