Einführung von "Posterization", der Grundtechnologie der Bildverarbeitung. Die Posterisierung ist eine Konvertierung unter Verwendung einer Tonkurve auf einer Treppe und eine Methode zum Begrenzen des Ausgabepixelwerts auf mehrere Ebenen.
Stellen Sie wie in der folgenden Abbildung gezeigt den Pixelwert des Eingabebilds auf n Ebenen (4 Ebenen in der folgenden Abbildung) ein, um den Pixelwert des Ausgabebilds zu begrenzen. Auf diese Weise werden die Ränder klarer und Sie können Farben wie Kunst ausdrücken.
Posterization ist ein Buch ["Digital Image Processing"](https://www.amazon.co.jp/%E3%83%87%E3%82%A3%E3%82%B8%E3%82%BF%E3% 83% AB% E7% 94% BB% E5% 83% 8F% E5% 87% A6% E7% 90% 86-% E6% 94% B9% E8% A8% 82% E7% AC% AC% E4% BA % 8C% E7% 89% 88-% E3% 83% 87% E3% 82% A3% E3% 82% B8% E3% 82% BF% E3% 83% AB% E7% 94% BB% E5% 83% 8F% E5% 87% A6% E7% 90% 86% E7% B7% A8% E9% 9B% 86% E5% A7% 94% E5% 93% A1% E4% BC% 9A / dp / 490347464X / ref = asc_df_490347464X /? tag = jpgo-22 & linkCode = df0 & hvadid = 342595526565 & hvpos = & hvnetw = g & hvrand = 5492134153117811443 & hvpone = & hvptwo = & hvqmt = & hvdev = hv = hl = Es folgt der verwendeten Verarbeitungsmethode. Da die Tonkurve verwendet wird, die die Pixelwerte 0 und 255 im verarbeiteten Bild belässt, weist das Bild einen klaren Kontrast auf.
Die Umgebung, in der der Posterisierungsprozess versucht wurde, ist wie folgt.
Python 3.6.8 numpy 1.18.1 matplotlib 3.1.2 opencv-python 4.1.2.30
Da OpenCV in der Bibliothek verwendet wird, installieren Sie es bitte im Voraus.
pip install opencv-python
Bei der Betrachtung verschiedener Websites zur Posterisierung verwendeten viele Websites LUTs, die kein Weiß mit einem Pixelwert von 255 im Ausgabebild reflektieren.
Dieser Prozess spiegelt auch den Pixelwert 255 "Weiß" im Ausgabebild wider, daher habe ich eine LUT-Erstellung entwickelt. Die Eingabe und Ausgabe von Bins sind getrennt. Weitere Informationen finden Sie im Kommentarbereich des Codes.
posterization.py
#coding: utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
def main():
img = cv2.imread('image.jpg') #Bilder laden
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) #Graustufen
n = 4 #Anzahl der Teilungen des Pixelwerts
pos = posterization(gray, n)
cv2.imwrite('pos.jpg', pos) #Ausgabe des posterisierten Bildes
def posterization(img, n):
x = np.arange(256) #0,1,2...Ein Array von ganzen Zahlen bis zu 255
ibins = np.linspace(0, 255, n+1) #Die Eingabe von der LUT ist 255/(n+1)Teilen mit
obins = np.linspace(0,255, n) #Die Ausgabe von LUT beträgt 255/Geteilt durch n
num=np.digitize(x, ibins)-1 #Nummerieren Sie die zu posterisierenden Eingabepixelwerte
num[255] = n-1 #Korrigieren Sie die Anzahl der Pixelwerte 255, die deaktiviert sind, indem Sie die Verarbeitung digitalisieren
y = np.array(obins[num], dtype=int) #Erstellen Sie eine Posterisierungs-LUT
pos_LUT(n, y) #Erstellen Sie ein LUT-Diagramm
pos = cv2.LUT(img, y) #Posterisierung durchführen
return pos
#Posterization LUT-Diagrammerstellung
def pos_LUT(n, y):
x = np.arange(0,256,1)
plt.plot(x,y)
plt.savefig("pos_LUT.png ")
if __name__=='__main__':
main()
★ Bücher ・ [Digitale Bildverarbeitung [Überarbeitete 2. Auflage](CG-ARTS (Public Interest Incorporated Foundation) (0) [0]:https://www.amazon.co.jp/%E3%83%87%E3%82%A3%E3%82%B8%E3%82%BF%E3%83%AB%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86-%E6%94%B9%E8%A8%82%E7%AC%AC%E4%BA%8C%E7%89%88-%E3%83%87%E3%82%A3%E3%82%B8%E3%82%BF%E3%83%AB%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86%E7%B7%A8%E9%9B%86%E5%A7%94%E5%93%A1%E4%BC%9A/dp/490347464X/ref=asc_df_490347464X/?tag=jpgo-22&linkCode=df0&hvadid=342595526565&hvpos=&hvnetw=g&hvrand=5492134153117811443&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009247&hvtargid=pla-889374643658&psc=1&th=1&psc=1
★ Website ・ [OpenCV - Verwendung von cv2.LUT, Gammakorrektur, negative / positive Inversion, Posterisierung] [1] [1]:https://pystyle.info/opencv-tone-transform/#outline__6 ・ [Verwendung der Digitalisierung (numpy)] [2] [2]:http://arduinopid.web.fc2.com/Q3-36.html
Recommended Posts