2016-06-14 4 views
2

Ich versuche die Helligkeit eines Graustufenbildes zu erhöhen. cv2.imread() gibt ein numpy Array zurück. Ich füge jedem Element des Arrays einen ganzzahligen Wert hinzu. Theoretisch würde dies jeden von ihnen erhöhen. Danach wäre ich in der Lage, den oberen Schwellenwert von 255 zu setzen und das Bild mit der höheren Helligkeit zu erhalten. HierPython, OpenCV: Erhöhung der Bildhelligkeit ohne überlaufendes UINT8-Array

ist der Code:

grey = cv2.imread(path+file,0) 

print type(grey) 

print grey[0] 

new = grey + value 

print new[0] 

res = np.hstack((grey, new)) 

cv2.imshow('image', res) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

jedoch interne OpenCV Routine tut scheinbar so ähnlich:

new_array = old_array % 255 

Jeder Pixelintensitätswert höher als 255 wird ein Rest des Teilens von 255

Als Ergebnis werde ich dunkel statt komplett weiß. Hier

ist die Ausgabe:

<type 'numpy.ndarray'> 
[115 114 121 ..., 170 169 167] 
[215 214 221 ..., 14 13 11] 

Und hier ist das Bild:

enter image description here

Wie kann ich diesen Rest Mechanismus ausschalten? Gibt es einen besseren Weg, die Helligkeit in OpenCV zu erhöhen?

Antwort

7

Eine Idee wäre vor zu prüfen seine value Zugabe, ob die Zugabe in einem Überlauf führen würde, indem die Differenz zwischen 255 prüfen und den aktuellen Pixelwert und überprüft, ob es innerhalb value ist. Wenn dies der Fall ist, werden wir nicht value hinzufügen, würden wir diese direkt auf 255 setzen, sonst würden wir die Addition tun. Nun könnte diese Entscheidungsfindung mit einer Maske Schöpfung wird gelockert und wäre -

mask = (255 - grey) < value 

Dann füttern diese Maske/boolean-Array np.where, um es zwischen 255 und grey+value basierend auf der Maske wählen zu lassen.

So schließlich würden wir die Umsetzung wie haben -

grey_new = np.where((255 - grey) < value,255,grey+value) 

Probelauf

ist ein kleines repräsentatives Beispiel der Schritte zu demonstrieren, verwenden lassen.

In [340]: grey 
Out[340]: 
array([[125, 212, 104, 180, 244], 
     [105, 26, 132, 145, 157], 
     [126, 230, 225, 204, 91], 
     [226, 181, 43, 122, 125]], dtype=uint8) 

In [341]: value = 100 

In [342]: grey + 100 # Bad results (e.g. look at (0,1)) 
Out[342]: 
array([[225, 56, 204, 24, 88], 
     [205, 126, 232, 245, 1], 
     [226, 74, 69, 48, 191], 
     [ 70, 25, 143, 222, 225]], dtype=uint8) 

In [343]: np.where((255 - grey) < 100,255,grey+value) # Expected results 
Out[343]: 
array([[225, 255, 204, 255, 255], 
     [205, 126, 232, 245, 255], 
     [226, 255, 255, 255, 191], 
     [255, 255, 143, 222, 225]], dtype=uint8) 

Prüfung auf Probe Bild

Mit dem Beispielbild in der Frage gepostet uns arr zu geben und mit value als 50, hätten wir -

enter image description here

2

Kurz gesagt, Sie sollten 50 zu jedem Wert hinzufügen, finden Sie maxBrightness, dann thisPixel = int(255 * thisPixel/maxBrightness)

Sie müssen für jedes Pixel eine Überprüfung auf einen Überlauf durchführen.Die von Divakar vorgeschlagene Methode ist einfach und schnell. Sie möchten vielleicht jeden Wert erhöhen (um 50 in Ihrem Fall) und dann auf 255 normalisieren. Dadurch würden Details in hellen Bereichen Ihres Bildes erhalten.

0

Ein alternativer Ansatz, der für mich effizient funktionierte, ist das Einfügen eines weißen Bildes in das Originalbild mithilfe der Überblendungsfunktion in der PIL> Bildbibliothek.

from PIL import Image 
correctionVal = 0.05 # fraction of white to add to the main image 
img_file = Image.open(location_filename) 
img_file_white = Image.new("RGB", (width, height), "white") 
img_blended = Image.blend(img_file, img_file_white, correctionVal) 

img_blended = img_file * (1 - correctionVal) + img_file_white * correctionVal

Wenn also correctionVal = 0, erhalten wir das Originalbild, und wenn correctionVal = 1, erhalten wir rein weiß.

Diese Funktion selbst korrigiert für Werte RGB 255.

Blending in schwarz überschreitet (RGB 0, 0, 0) reduziert Helligkeit.