[PYTHON] Bildhelligkeit normalisieren

Ausführungsumgebung

Ubuntu 18.04 Python 3.6.9 OpenCV 3.3.0

Überblick

Bei der Verarbeitung einer großen Anzahl von Bildern werden helle und dunkle Fotos gemischt. Es wird das Verarbeitungsergebnis beeinflussen, also möchte ich die Helligkeit vereinheitlichen!

Aus diesem Gedanken Da ich die Möglichkeit hatte, die Helligkeit des Bildes in der Vorverarbeitung des Lernens anzupassen, werde ich die Methode zusammenfassen. Der Zweck besteht darin, das eingegebene Farbbild auf eine gleichmäßige Helligkeit zu normalisieren. Es gibt drei Arten von Methoden, die ich ausprobiert habe.

** ① Graphitabflachung ② Adaptive Histogrammabflachung ③ Geben Sie den Durchschnitt und die Standardabweichung des Helligkeitswerts an **

Klicken Sie hier für Bestätigungsfotos. Taj Mahal mit einem Dunst taj-mahal-1209004_1280.jpg Das Helligkeitshistogramm dieses Bildes ist wie folgt verteilt. Es ist ersichtlich, dass die Pixelwerte um 100 bis 230 konzentriert sind. original.png

Bibliothek zu verwenden

import cv2
import numpy as np
from matplotlib import pyplot as plt

Vorverarbeitung

Um den Helligkeitswert zu verarbeiten, erfassen Sie zunächst ein Graustufenbild. Wenn Sie ein Argument mit imread von OpenCV angeben, können Sie ein Graustufenbild auf einmal erhalten. Dieses Mal wird nur die Helligkeit des Farbbilds geändert, sodass auch Farbinformationen erfasst werden. Daher wird das Bild gelesen und von RGB (BGR in OpenCV) in HSV konvertiert.

HSV-Bild ・ Farbton (Farbton) ・ Sättigung ・ Wert (Helligkeit) Es wird dargestellt durch, und der Wert der Helligkeit wird dabei verwendet.

Der Code zum Abrufen des Werts lautet wie folgt.

img=cv2.imread(str(file)) #Bild wird geladen
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #In hsv-Farbsystem konvertieren
h,s,v = cv2.split(hsv) #In jede Komponente unterteilt

Unter h, s, v, v ist Wert, der als Graustufenbild behandelt wird.

Das Bildhistogramm kann einfach mit der Matplotlib-Funktion angezeigt werden.

plt.hist(v.ravel(),256,[0,256]);plt.show()

Nachbearbeitung

Wenn Sie zuerst die Nachbearbeitung erwähnen, Da das variable Ergebnis, in dem die Ergebnisse von ① bis ③ gespeichert sind, ein Graustufenbild ist, das den Helligkeitswert darstellt, Schließlich wird die umgekehrte Verarbeitung der Vorverarbeitung durchgeführt, um zum Farbbild zurückzukehren.

hsv = cv2.merge((h,s,result))
rgb = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite("result.jpg ", rgb) #Bei der Ausgabe

** ① Graphitabflachung **

Die erste Methode besteht darin, das Histogramm (Helligkeitsverteilung) des Bildes zu glätten. Das Bild der Abflachung des Histogramms ist wie folgt.

Histogrammeinebnung.png Das Wort "Abflachen" erweckt den Eindruck, dass das Bild glatt ist, Um den Pixelwert so anzupassen, dass er gleichmäßig von rein schwarzen Pixeln zu rein weißen Pixeln erscheint, Der Kontrast wird betont und das Bild wird klar.

Diese Technik kann durch die Funktion von OpenCV bestätigt werden. Der Code lautet wie folgt.

result = cv2.equalizeHist(v)

Klicken Sie hier für das resultierende Bild und Histogramm. result.jpg

equal.png

Betrachtet man das Histogramm, so sind die Pixel um 250 diskret. Dies erscheint im Lichtabstufungsteil oben rechts im Ergebnisbild, und der Tonsprung tritt aufgrund des Effekts der Kontrastbetonung auf. jagi.jpg Es scheint aufzutreten, weil die Histogrammverteilung des Helligkeitswerts des Originalbildes nicht gleichmäßig ist. Die nächste Methode zum Abflachen des Histogramms ist das adaptive Abflachen des Histogramms.

** ② Adaptive Histogrammabflachung **

Die zweite Methode besteht darin, das Histogramm in (1) für jeden kleinen Bereich zu glätten. Detaillierte Mechanismen und Parameter finden Sie unter Referenz. Dies ermöglicht das Abflachen mit einer höheren Genauigkeit als ①. Seien Sie jedoch vorsichtig, da es bei einem Fehler in den Parametern überbetont wird.

Die Implementierung der adaptiven Histogrammabflachung ist wie folgt.

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(3, 3))
result = clahe.apply(v)

clipLimit ist ein Parameter zur Begrenzung des Kontrasts. tileGridSize hat die Größe eines kleinen Bereichs und diesmal in einem 3x3-Bereich.

Hier sind die Ergebnisse. adaptive.jpg adaptive.png Aus dem Histogramm ist ersichtlich, dass die Pixelwerte kontinuierlich von (1) verteilt sind. Der in (1) aufgetretene Tonsprung wurde gemildert, was zu einem ausgewogenen Histogramm führte.

** ③ Geben Sie den Durchschnitt und die Standardabweichung der Helligkeit an **

Die dritte basierte auf der Website hier. Eine Methode zum Erfassen des Durchschnittswerts und der Standardabweichung der Helligkeit eines Bildes und zum Ändern dieser Werte in beliebige Werte.

v = (v-np.mean(v)) / np.std(v) * s + m
result = np.array(v, dtype=np.uint8) #Geben Sie den Array-Typ an unit8 zurück

--np.mean (v): Durchschnittliche Helligkeit --np.std (v): Standardabweichung der Helligkeit

Zunächst wird ein Bild mit einer durchschnittlichen Helligkeit von 0 und einer Standardabweichung von 1 erzeugt, indem der Durchschnittswert der Helligkeit vom Originalbild subtrahiert und durch die Standardabweichung dividiert wird. Die Standardabweichung wird durch Multiplizieren mit einem beliebigen Wert s eingestellt, und der Helligkeitsmittelwert wird durch Hinzufügen eines beliebigen Wertes m eingestellt. Diesmal sind s = 32 und m = 128 eingestellt.

Klicken Sie hier für die Ergebnisse. mean32.jpg mean32.png

Aus dem Histogramm kann bestätigt werden, dass die Pixel um die durchschnittliche Helligkeit von 128 aggregiert sind. Wenn Sie diesmal zu einem Farbbild zurückkehren, wird es in einen Ganzzahltyp konvertiert Wenn die Helligkeit im Berechnungsergebnis außerhalb des Bereichs von 0 bis 255 liegt, ist das Ergebnis falsch und eine Anpassung ist erforderlich.

abschließend

Schließlich wird jedes Ergebnis zusammen gebucht. Da die Bedingungen nach dem Abflachen des Histogramms unterschiedlich sind, handelt es sich nicht um ein Leistungsvergleichsexperiment, sondern als Referenz. Von links Originalbild-Ergebnis-Ergebnis-Ergebnis-Ergebnis marge1.jpg marge2.jpg Mit jeder Methode können Bilder, die unter verschiedenen Umgebungen aufgenommen wurden, an einen bestimmten Standard angepasst werden.

Dieses Mal wurde nur die Helligkeit normalisiert, aber auch durch Normalisierung des Kontrasts und der Sättigung. Sie können ein einheitlicheres Bild erstellen.

Verweise

・ Http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_histograms/py_histogram_equalization/py_histogram_equalization.html ・ Https://cvtech.cc/std/

Recommended Posts

Bildhelligkeit normalisieren
Entfernung von Bildrauschen
Bilderkennung
Bildcrawler