[PYTHON] Lesen Sie die digitale Bildverarbeitung

Ich studiere mit einem Buch namens Digital Image Processing. Ich habe implementiert (Kontrastumwandlung), um das Verständnis zu vertiefen.

* Helligkeitskontrastumwandlung *

Der Kontrast ist der Grad der Änderung von Helligkeit und Farbe. (Persönliche Interpretation) Starker Kontrast → Leicht verständliche Helligkeit und Farbübertragung, leicht verständliche Umrisse eines Objekts. Schwacher Kontrast → Es ist schwierig, die Helligkeit und die Farbübertragung zu verstehen, und es ist schwierig, die Umrisse eines Objekts zu verstehen.

* Tonwertkurve *

Durch Ändern der Beziehung zwischen Eingabe und Ausgabe kann der Farbton des Bildes geändert werden. Daher wird es leicht zu sehen oder schwer zu sehen.

* Das erste Stück, das diese Zeit benutzt *

Verwenden Sie ein dunkles Beispiel wie das im Bild unten, um den Effekt besser erkennen zu können.

Eigenschaften: Ziemlich dunkel

python


#Erforderliche Bibliotheken
import cv2
import numpy as np
import matplotlib.pyplot as plt

#Fotopfad
pic_path = 'pet-bottle-pic/test/camera_pic/aquari3.jpg'

#Lesen
pic_image = cv2.imread(pic_path)

#In grau konvertieren
pic_image = cv2.cvtColor(pic_image, cv2.COLOR_BGR2GRAY)

#Beim Lesen mit Lebenslauf, plt.cmap bei Verwendung von imshow='gray'Beachten Sie, dass es nur grau ist, wenn Sie dies angeben
plt.imshow(pic_image, cmap='gray')
plt.title('sample_dark')
plt.savefig("aquari_dark.jpg ")

↓ Es ist dunkel und fast unsichtbar

aquari_dark.jpg

python


#Pixel
pic_image.shape # (2464, 3280)

Verteilung der Pixelwerte

python


#In einer Dimension abflachen, um ein Histogramm zu erstellen
flat_data = np.ravel(pic_image)

#Balkenspanne
bins_range = range(0, 260, 5)

#Histogramm ausgeben
plt.hist(flat_data, bins = bins_range)
plt.title('sample_dark')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_dark.png ")

↓ Auf der schwarzen Seite liegt eine Vorspannung vor.

hist_aquari_dark.png

Implementierung der Kontrastumwandlung

* Typ der unterbrochenen Leitung *

Je nachdem, wie es hergestellt wird, kann der Kontrast in jedem Bereich erhöht werden. (Obwohl es ein wenig unnatürlich ist) Da das Beispielbild im Bereich der Pixelwerte 0 bis 50 dicht ist, wird der Winkel in diesem Bereich eingestellt.

python


def bend_line(X):
    y = X*5
    y = np.where(y>=255, 255, y)
    return y

Wenden Sie eine Funktion an, die wie in der folgenden Grafik dargestellt ausgegeben wird.

python


X = np.arange(0, 255, 1)
y = bend_line(X)

plt.title('sample_dark_bend_line')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("bend_line.png ")

bend_line.png

Foto nach der Bewerbung

python


pic_func1 = bend_line(pic_image)
plt.imshow(pic_func1, cmap='gray')
plt.title('sample_dark_after_bend_line')
plt.savefig("aquari_dark_after_bend_line.jpg ")

↓ Sie können jetzt die PET-Flasche sehen. (Obwohl es etwas schmutzig aussieht)

aquari_dark_after_bend_line.jpg

Schauen wir uns die Verteilung an.

python


flat_data = np.ravel(pic_func1)

bins_range = range(0, 260, 5)
 
#Histogramm ausgeben
plt.hist(flat_data, bins = bins_range)
plt.title('sample_dark_after_bend_line')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_dark_after_bend_line.png ")

↓ Die Verteilung wurde etwas geglättet.

hist_aquari_dark_after_bend_line.png

* Tonkurve multiplizieren (Gammakorrektur) *

Geeignet zum Korrigieren von Bildern, die zu dunkel oder zu hell sind, um sie zu verstehen. Geeignet zur Erhöhung des Kontrastes von Bildern mit einer Verteilung in der Nähe der Ränder.

Implementieren Sie die folgende Formel, die als Gammafunktion bezeichnet wird. $ y = \left( \frac{X}{255} \right)^\frac{1}{\gamma} \times 255\\ $ Übrigens wird auf der offiziellen Opencv-Website 1 / γ als γ eingeführt.

python


def g_function(X, gamma):
    y = 255*(X/255)**(1/gamma)
    return y

Grafik für jeden γ-Wert

python


X = np.arange(0, 255, 1)
gamma = [3, 2, 1.5, 1, 0.5, 0.33]
labels = ["3", "2", "1.5", "1", "0.5", "0.33"]

plt.title('g_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')

for g, l in zip(gamma, labels):
    y = g_function(X, g)
    plt.plot(X, y, label = l)
plt.legend()


plt.savefig("g_function.png ")

g_function.png

γ ist groß → Verstärkt den Kontrast dunkler Bilder insgesamt. γ ist klein → Erhöht den Kontrast heller Bilder insgesamt.

python


gamma = 3
pic_gfunc = g_function(pic_image, gamma)
plt.imshow(pic_gfunc, cmap='gray')
plt.title('sample_dark_after_gfunc')
plt.savefig("aquari_dark_after_gfunc.jpg ")

↓ Es ist ziemlich sauber.

aquari_dark_after_gfunc.jpg

python


flat_data = np.ravel(pic_gfunc)

bins_range = range(0, 260, 5)
 
#Histogramm ausgeben
plt.hist(flat_data, bins = bins_range)
plt.title('sample_dark_after_gfunc')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_dark_after_gfunc.png ")

↓ Ebenso wird die Verteilung geglättet.

hist_aquari_dark_after_gfunc.png

* Nächstes zu verwendendes Bild

Eigenschaften: Normal

python


#Fotopfad
pic_path = 'pet-bottle-pic/test/camera_pic/aquari.jpg'

#Lesen
pic_image = cv2.imread(pic_path)

#In grau konvertieren
pic_image = cv2.cvtColor(pic_image, cv2.COLOR_BGR2GRAY)

#Beim Lesen mit Lebenslauf, plt.cmap bei Verwendung von imshow='gray'Beachten Sie, dass es nur grau ist, wenn Sie dies angeben
plt.imshow(pic_image, cmap='gray')
plt.title('sample_normal')
plt.savefig("aquari.jpg ")

aquari.jpg

Verteilung der Pixelwerte

python


#In einer Dimension abflachen, um ein Histogramm zu erstellen
flat_data = np.ravel(pic_image)

#Balkenspanne
bins_range = range(0, 260, 5)

#Histogramm ausgeben
plt.hist(flat_data, bins = bins_range)
plt.title('sample_normal')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari.png ")

hist_aquari.png

* S-förmiger Kurventyp *

Es ist geeignet, um den Kontrast von Bildern mit einer Verteilung nahe der Mitte zu erhöhen. Implementieren Sie die folgende Formel $ y = \frac{255}{1 + \exp^{a\left(-X + 127\right)}}\\ $

python


def s_func(X, a):
    y = 255/(1 + np.exp(a*(-1*X + 127)))
    return y

python


X = np.arange(0, 255, 1)
a = 0.05
y = s_func(X, a)

plt.title('s_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')

plt.plot(X, y)
plt.savefig("s_function.png ")

s_function.png

python


a = 0.05
y = s_func(pic_image, a)
plt.imshow(y, cmap='gray')
plt.title('sample_after_sfunc')
plt.savefig("aquari_after_sfunc.jpg ")

↓ Es war ein wenig klar.

aquari_after_sfunc.jpg

python


flat_data = np.ravel(y)

bins_range = range(0, 260, 5)
 
#Histogramm ausgeben
plt.hist(flat_data, bins = bins_range)
plt.title('sample_after_sfunc')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_sfunc.png ")

↓ Das Histogramm wurde flach.

hist_aquari_sfunc.png

* Spezialeffekte *

Die Verwendung ist mysteriös, aber ich habe sie implementiert.

* Invertieren *

Hell → dunkel Dunkel → hell werden.

python


def rev_func(X):
    y = -X + 255
    return y

python


X = np.arange(0, 255, 1)
y = rev_func(X)

plt.title('Rev_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("rev_func.png ")

rev_func.png

python


y = rev_func(pic_image)
plt.imshow(y, cmap='gray')
plt.title('sample_after_rev_func')
plt.savefig("aquari_after_rev_func.jpg ")

aquari_after_rev_func.jpg

python


flat_data = np.ravel(y)

bins_range = range(0, 260, 5)
 
#Histogramm ausgeben
plt.hist(flat_data, bins = bins_range)
plt.title('sample_after_rev_func')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_rev_func.png ")

↓ Die Verteilung ist auch links und rechts umgekehrt.

hist_aquari_rev_func.png

* Posterisierung *

Es sieht aus wie ein Poster.

Helligkeit in 4 Stufen unterteilt

Intervall: 64 Erste Stufe: 64 Zweite Stufe: 128 Dritte Stufe: 192 Vierte Stufe: 255

python


def post_func(X):
    y = np.where(X>=192, 255, X)
    y = np.where((y >=128 ) & (y < 192), 170, y)
    y = np.where((y >=64 ) & (y < 128), 85, y)
    y = np.where(y<64, 0, y)
    return y

python


X = np.arange(0, 255, 1)
y = post_func(X)

plt.title('post_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("post_func.png ")

post_func.png

python


y = post_func(pic_image)
plt.imshow(y, cmap='gray')
plt.title('sample_after_after_postfunc')
plt.savefig("aquari_after_postfunc.jpg ")

↓ Plakatartig

aquari_after_postfunc.jpg

python


flat_data = np.ravel(y)

bins_range = range(0, 260, 5)
 
#Histogramm ausgeben
plt.hist(flat_data, bins = bins_range)
plt.title('sample_after_postfunc')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_postfunc.png ")

hist_aquari_postfunc.png

* Binarisierung *

Schwarz und Weiß klar]

python


def to_func(X):
    y = np.where(X>=127, 255, X)
    y = np.where(y<127, 0, y)
    return y

python


X = np.arange(0, 255, 1)
y = to_func(X)

plt.title('2_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("2_func.png ")

2_func.png

python


y = to_func(pic_image)
plt.imshow(y, cmap='gray')
plt.title('sample_after_after_tofunc')
plt.savefig("aquari_after_tofunc.jpg ")

↓ Ist das Gegenteil schwer zu erkennen?

aquari_after_tofunc.jpg

python


flat_data = np.ravel(y)

bins_range = range(0, 260, 5)
 
#Histogramm ausgeben
plt.hist(flat_data, bins = bins_range)
plt.title('sample_after_totfunc')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_tofunc.png ")

↓ Es ist binärisiert.

hist_aquari_tofunc.png

* Solarisation *

Es fühlt sich an wie ein Film, wenn man ein Foto entwickelt.

python


from math import pi

def sora_func(X):
    X = (3*pi/255)*X
    y = -127.5*(np.cos(X))+127.5
    return y

python


X = np.arange(0, 255, 1)
y = sora_func(X)

plt.title('sora_function')
plt.xlabel('INPUT')
plt.ylabel('OUTPUT')
plt.plot(X, y)
plt.savefig("sora_func.png ")

sora_func.png

python


y = sora_func(pic_image)
plt.imshow(y, cmap='gray')
plt.title('sample_after_sorafunc')
plt.savefig("aquari_after_sorafunc.jpg ")

↓ Irgendwie sieht es so aus

aquari_after_sorafunc.jpg

python


flat_data = np.ravel(y)

bins_range = range(0, 260, 5)
 
#Histogramm ausgeben
plt.hist(flat_data, bins = bins_range)
plt.title('sample_after_soratfunc')
plt.xlabel('pixel_value')
plt.ylabel('frequency')
plt.savefig("hist_aquari_sorafunc.png ")

hist_aquari_sorafunc.png

Ende

Recommended Posts

Lesen Sie die digitale Bildverarbeitung
[Bildverarbeitung] Posterisierung
Bildverarbeitung 100 Schläge ①
Bildverarbeitung mit MyHDL
Erste Python-Bildverarbeitung
Bildverarbeitung mit Python
Bildverarbeitung mit PIL
Bildverarbeitung mit Python (Teil 2)
opencv-python Einführung in die Bildverarbeitung
Bildverarbeitung mit PIL (Pillow)
100 Schläge bei der Bildverarbeitung !! (011-020) Frühes Spiel
100 Klopfen bei der Bildverarbeitung !! (001 - 010) Vorsichtig und vorsichtig
Bildverarbeitung mit Python (Teil 1)
Bildverarbeitung mit Python (3)
Bildverarbeitung mit Python (Pillow)
Bildverarbeitungssammlung in Python
Bildausdehnung und Kontraktionsverarbeitung
[Python] Bildverarbeitung mit Scicit-Image
Grundlagen der Echtzeit-Bildverarbeitung mit opencv
Persönliche Notizen für die Python-Bildverarbeitung
Die Bildverarbeitung mit Python 100 klopft an die Binärisierung Nr. 3
Bildverarbeitung 100 Klopfen Q9, Q10 (Filter) Beschleunigung
Umweltfreundliches Scraping mit Bildverarbeitung
100 Bildverarbeitung mit Python Knock # 2 Graustufen
Bildverarbeitung | Vorhersage von Arten aus Bildern
Grundlagen der binärisierten Bildverarbeitung durch Python
Bildverarbeitung durch Python 100 Knock # 1 Kanalersatz
Erstellen Sie mit PySimpleGUI einen Bildverarbeitungs-Viewer
100 Bildverarbeitung mit Python Knock # 8 Max Pooling
Graustufen durch Matrix-Reinventor der Python-Bildverarbeitung-
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Bildverarbeitung mit Python 100 Knock # 12 Bewegungsfilter
Bildverarbeitung mit Python 100 Knock # 6 Farbreduktionsverarbeitung
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
Die Bildverarbeitung mit Python 100 führt zu einem durchschnittlichen Pooling von # 7
Bildverarbeitung 100 Klopfen Q.6. Erklärung der Farbreduktionsverarbeitung
Leichte Bildverarbeitung mit Python x OpenCV
Bildverarbeitung mit Lambda + OpenCV (graue Bilderzeugung)
Faltungsfilterung durch Matrix-Reinventor der Python-Bildverarbeitung-
Bildverarbeitung mit Python 100 Knock # 9 Gauß-Filter