In diesem Artikel wird hauptsächlich die Bildverarbeitung mit ** Tonkurve ** vorgestellt. Das Lehrbuch hat Tonkurve, aber keinen Code ... Es kann für diejenigen sein, die sich fragen, welche Art von Code erreicht werden kann.
Wenn Sie Tone Curve nicht kennen und diesen Artikel lesen
Es wäre schön, wenn Sie dies leicht durch "Einführung" von [
Tonwertkurve, Ausgabebild (Farbe, Graustufen), Konvertierungsfunktion Ich werde sie in der Reihenfolge von vorstellen.
Terminal: Windows 10
Konsole: cmd(Eingabeaufforderung)
python:3.6.8
Virtuelle Umgebung: venv
Es gibt zwei Eingabebilder wie folgt.
Farbe | Graustufen |
---|---|
Ich habe OpenCVs "cv2.cvtColor ()" für die Grauskalierung verwendet.
Wie sich Farbbilder und Graustufenbilder ändern Ich werde es vorstellen.
Auch wenn der Rückgabewert von der Funktion von der Funktion cv2.imwrite ()
usw. gelesen wird.
Sie können es speichern.
Invertieren Sie den Pixelwert wie der Name schon sagt. (* Daraus ergibt sich, dass * x * in der Formel der Pixelwert ist.)
f(x) = 255 - x
input | output |
---|---|
input | output |
---|---|
Konvertierungsfunktion
def negaPosi(frame):
return 255 - frame
Ich werde mit dem zuvor eingeführten Artikel behandelt ... Wenn Sie mehr Details sehen möchten, würde ich mich freuen, wenn Sie den Artikel lesen.
Hier wird die Tonkurve für n = 2 ausgegeben. (* N ist der Wert dafür, wie oft der Pixelwert multipliziert wird.)
Eine Konvertierung, die den Kontrast des Bildes erhöht.
f(x) = \begin{cases} 2 \cdot x & (x < 128) \\ 255 & (otherwise)
\end{cases}
input | output |
---|---|
input | output |
---|---|
Konvertierungsfunktion
def toneCurve1(frame, n = 1):
look_up_table = np.zeros((256,1), dtype = 'uint8')
for i in range(256):
if i < 256 / n:
look_up_table[i][0] = i * n
else:
look_up_table[i][0] = 255
return cv2.LUT(frame, look_up_table)
Dies ist eine Konvertierung, die den Kontrast in Bezug auf die Oberseite verringert.
f(x) = \begin{cases} 0 & (x < 128) \\ 2 \cdot x - 255 & (otherwise)
\end{cases}
input | output |
---|---|
input | output |
---|---|
Konvertierungsfunktion
def toneCurve2(frame, n = 1):
look_up_table = np.zeros((256,1), dtype = 'uint8')
for i in range(256):
if i < 256 - 256 / n :
look_up_table[i][0] = 0
else:
look_up_table[i][0] = i * n - 255 * (n - 1)
return cv2.LUT(frame, look_up_table)
Diese S-Ton-Kurve ist in hellen Bereichen heller Dunkle Bereiche sind Transformationen, die dunkler betonen.
f(x) = \frac {255}{2} \cdot \left\{\sin\left(\frac {x}{255} - \frac {1}{2}\right)\pi + 1\right\}
input | output |
---|---|
input | output |
---|---|
Das Bild ist irgendwo klar.
Konvertierungsfunktion
def sToneCurve(frame):
look_up_table = np.zeros((256,1), dtype = 'uint8')
for i in range(256):
look_up_table[i][0] = 255 * (np.sin(np.pi * (i/255 - 1/2)) + 1) / 2
return cv2.LUT(frame, look_up_table)
In der gestrichelten Linie geben Sie die Tonkurve früher ein Es gibt einen Teil, in dem die Schattierungsinformationen verloren gehen, nachdem sie in einen konstanten Wert (0, 255) konvertiert wurden. Bei der Gammakonvertierung kann die Konvertierung durchgeführt werden, während die Schattierungsinformationen dieses Teils erhalten bleiben.
f(x) = 255 \cdot \left(\frac {x}{255}\right)^\frac{1}{\gamma}
Hier sind einige Muster von γ-Werten.
input | γ = 3 | γ = 2 |
---|---|---|
γ = 1 | γ = 0.5 | γ = 1 / 3 |
input | γ = 3 | γ = 2 |
---|---|---|
γ = 1 | γ = 0.5 | γ = 1 / 3 |
Offensichtlich ist das Bild von γ = 1 und die Eingabe dasselbe.
Konvertierungsfunktion
def gammaCurve(frame, gamma = 1):
look_up_table = np.zeros((256,1), dtype = 'uint8')
for i in range(256):
look_up_table[i][0] = pow(i / 255, 1 / gamma) * 255
return cv2.LUT(frame, look_up_table)
Das Bild sieht aus wie eine Mischung aus negativen und positiven Bildern.
Die in meiner Solarisation verwendete Umrechnungsformel lautet wie folgt.
f(x) = \frac {255}{2} \cdot \sin\left\{3\pi\left(\frac {x}{255} - \frac {1}{2}\right)\right\}
input | output |
---|---|
input | output |
---|---|
Konvertierungsfunktion
def soralization(frame):
look_up_table = np.zeros((256,1), dtype = 'uint8')
for i in range(256):
look_up_table[i][0] = (np.sin(3 * np.pi * (i / 255 + 1 / 2 )) + 1) * 255 / 2
return cv2.LUT(frame, look_up_table)
Der Pixelwert wird allmählich konstant gemacht. Es wird ein malerisches Bild sein.
Als Ausgabe wird ein Muster ausgegeben, in dem der Pixelwert in 2, 3 und 4 Stufen unterteilt ist.
input | step = 2 |
---|---|
step = 3 | step = 4 |
input | step = 2 |
---|---|
step = 3 | step = 4 |
Es sieht aus wie eine Postkarte.
Konvertierungsfunktion
def posterization(frame, step = 4):
if 1 < step and step <= 256:
look_up_table = np.zeros((256, 1), dtype = 'uint8')
split = int(256 / (step - 1))
up = int(256 / step)
for i in range(256):
if np.trunc(i / up) * split >= 255:
look_up_table[i][0] = 255
else:
look_up_table[i][0] = np.trunc(i / up) * split
return cv2.LUT(frame, look_up_table)
else:
return frame
Wahrscheinlich der schwierigste Teil bei der Entwicklung dieses Codes ... Wenn Sie einen besseren Weg haben, unterrichten Sie mich bitte.
Ab der Schwelle n
** Wert wenn klein 0 ist (Mindestwert) **
** Eine Konvertierung, die den Wert ändert, wenn er groß ist, auf 255 (Maximalwert) **.
Ich habe es diesmal nicht verwendet, aber in der cv2-Bibliothek [Validierungsfunktion](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc /py_thresholding/py_thresholding.html). Es gibt "cv2.adaptiveThreshold ()" und "cv2.threshold ()".
f(x) = \begin{cases}
0 & (x < n) \\ 255 &(otherwise)
\end{cases}
Diesmal ist die Ausgabe für den Fall, dass der Schwellenwert n = {50, 128, 200} ist.
input | n = 50 |
---|---|
n = 128 | n = 200 |
input | n = 50 |
---|---|
n = 128 | n = 200 |
Konvertierungsfunktion
def threshold(frame, threshold_v = 50):
frame[frame < threshold_v] = 0
frame[frame >= threshold_v] = 255
return frame
ex.py
import cv2
import numpy as np
#Funktionen(Kürzung)
def main():
img_path = '.\\image\\castle.jpg' #Geben Sie das Bild beliebig an
img = cv2.imread(img_path)
frame = grayScale(img)
#Funktion aufrufen,Bitte üben.
#Beispiel:
# cv2.imwrite('tone_changed.jpg', negaPosi(img))
if __name__ == '__main__':
main()
Dieses Mal habe ich die Gradationskonvertierung durch einige Tonkurven eingeführt. Als nächstes denke ich daran, die Bildverarbeitung mit Filtern durchzuführen.
Sie können eine Benutzeroberfläche hinzufügen, um sie praktischer zu gestalten.
Dann: Welle:
Recommended Posts