2013-10-14 11 views
9

Ich verwende OpenCV, um einige Bilder zu verarbeiten, und einer der ersten Schritte, die ich ausführen muss, ist die Erhöhung des Bildkontrastes auf einem Farbbild. Die schnellste Methode, die ich bisher gefunden habe verwendet diesen Code (wo np der numpy Import) zu multiplizieren und fügen Sie wie im original C-based cv1 docs vorgeschlagen:Was ist der schnellste Weg, um den Farbkontrast mit OpenCV in Python (cv2) zu erhöhen?

if (self.array_alpha is None): 
     self.array_alpha = np.array([1.25]) 
     self.array_beta = np.array([-100.0]) 

    # add a beta value to every pixel 
    cv2.add(new_img, self.array_beta, new_img)      

    # multiply every pixel value by alpha 
    cv2.multiply(new_img, self.array_alpha, new_img) 

Gibt es einen schnelleren Weg, dies in Python zu tun? Ich habe versucht, stattdessen numpy skalar zu verwenden, aber die Leistung ist eigentlich schlechter. Ich habe auch versucht, cv2.convertScaleAbs (die OpenCV-Dokumente vorgeschlagen mit convertTo, aber CV2 scheint eine Schnittstelle zu dieser Funktion fehlt), aber wieder die Leistung war schlechter im Test.

+0

Es wäre schon schneller. Es ist nur eine Addition und Multiplikation. –

+0

Die Additions- und Multiplikationsoperationen können gleichzeitig ausgeführt werden, um interessante Effekte zu erhalten. Grundsätzlich kann jedes Pixel als 'X = aY + b' transformiert werden, wobei' a' und 'b' Skalare sind. Dies ist eine lineare Transformation.Ich habe eine quadratische Transformation in den Antworten gezeigt, die viel interessantere Ergebnisse hervorbringt;) – samkhan13

Antwort

15

Einfache Arithmetik in numpy Arrays ist die schnellste, wie Abid Rahaman K kommentierte.

Verwenden Sie dieses Bild zum Beispiel: http://i.imgur.com/Yjo276D.png

Hier ist ein Bit der Bildverarbeitung, die Helligkeit/Kontrast Manipulation ähnelt:

''' 
Simple and fast image transforms to mimic: 
- brightness 
- contrast 
- erosion 
- dilation 
''' 

import cv2 
from pylab import array, plot, show, axis, arange, figure, uint8 

# Image data 
image = cv2.imread('imgur.png',0) # load as 1-channel 8bit grayscale 
cv2.imshow('image',image) 
maxIntensity = 255.0 # depends on dtype of image data 
x = arange(maxIntensity) 

# Parameters for manipulating image data 
phi = 1 
theta = 1 

# Increase intensity such that 
# dark pixels become much brighter, 
# bright pixels become slightly bright 
newImage0 = (maxIntensity/phi)*(image/(maxIntensity/theta))**0.5 
newImage0 = array(newImage0,dtype=uint8) 

cv2.imshow('newImage0',newImage0) 
cv2.imwrite('newImage0.jpg',newImage0) 

y = (maxIntensity/phi)*(x/(maxIntensity/theta))**0.5 

# Decrease intensity such that 
# dark pixels become much darker, 
# bright pixels become slightly dark 
newImage1 = (maxIntensity/phi)*(image/(maxIntensity/theta))**2 
newImage1 = array(newImage1,dtype=uint8) 

cv2.imshow('newImage1',newImage1) 

z = (maxIntensity/phi)*(x/(maxIntensity/theta))**2 

# Plot the figures 
figure() 
plot(x,y,'r-') # Increased brightness 
plot(x,x,'k:') # Original image 
plot(x,z, 'b-') # Decreased brightness 
#axis('off') 
axis('tight') 
show() 

# Close figure window and click on other window 
# Then press any keyboard key to close all windows 
closeWindow = -1 
while closeWindow<0: 
    closeWindow = cv2.waitKey(1) 
cv2.destroyAllWindows() 

Originalbild in Graustufen:

enter image description here

Erhelltes Bild, das erweitert zu sein scheint:

enter image description here

abgedunkelte Bild, das erodiert zu sein scheint, geschärft, mit besserem Kontrast:

enter image description here

Wie die Pixelintensitäten transformiert werden: Wenn Sie

enter image description here

Spielen Sie mit den Werten phi und theta können Sie wirklich interessant ou bekommen wird. Sie können diesen Trick auch für Mehrkanal-Bilddaten implementieren.

--- EDIT ---

haben einen Blick auf die Begriffe 'Ebenen' und 'Kurven' auf this youtube video zeigt die Bildbearbeitung in Photoshop. Die Gleichung für die lineare Transformation erzeugt den gleichen Betrag, d. H. "Pegel" der Änderung für jedes Pixel. Wenn Sie eine Gleichung schreiben, die zwischen Pixeltypen unterscheiden kann (z. B. solchen, die bereits einen bestimmten Wert haben), können Sie die Pixel auf der Grundlage der von dieser Gleichung beschriebenen "Kurve" ändern.

+0

Was ist, wenn ich beide Funktionen zusammenstellen muss, die Helligkeit von dunklen Pixeln erhöhen und die Helligkeit von über hellen Pixeln gleichzeitig verringern soll. Können wir dieses Verhalten erreichen? – ZdaR

+0

Ich habe versucht, aber nicht die gewünschten Ergebnisse erhalten, keine Vorschläge – ZdaR

+0

@Annom_uppal wie ich sagte im --- EDIT --- Teil, müssen Sie diese Gleichung finden, die dies tut. Die einfachste Methode, die ich denken kann, ist cv2.inrange() - Funktion zum Ändern der Pixel innerhalb einer unteren und oberen Grenze. Sie müssen lediglich cv2.inrange() zweimal für zwei verschiedene Begrenzungsbedingungen aufrufen. – samkhan13

5

diesen Code Versuchen:

import cv2 

img = cv2.imread('sunset.jpg', 1) 
cv2.imshow("Original image",img) 

# CLAHE (Contrast Limited Adaptive Histogram Equalization) 
clahe = cv2.createCLAHE(clipLimit=3., tileGridSize=(8,8)) 

lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) # convert from BGR to LAB color space 
l, a, b = cv2.split(lab) # split on 3 different channels 

l2 = clahe.apply(l) # apply CLAHE to the L-channel 

lab = cv2.merge((l2,a,b)) # merge channels 
img2 = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR) # convert from LAB to BGR 
cv2.imshow('Increased contrast', img2) 
#cv2.imwrite('sunset_modified.jpg', img2) 

cv2.waitKey(0) 
cv2.destroyAllWindows() 

Sonnenuntergang vor: enter image description here Sonnenuntergang nach erhöhter Kontrast: enter image description here

+1

Das OP fragt nach der *** schnellsten *** Kontrastverbesserung, für sie ist eine lineare Transformation nicht schnell genug! Wie vergleicht Ihre vorgeschlagene Lösung - speedwise - mit dem nicht schnell genug Verfahren im OP? – gboffi

+0

@gboffi - Ja, "der schnellste Weg" ... Ich war so nachdenklich, ein schärferes Farbbild zu machen, dass mir die Essenz der Frage nicht in den Sinn kam :-). Wie ich weiß NumPy hat eine Geschwindigkeit von C Sprache, weil es in C geschrieben ist. Ist es schneller als C? Ja, es ist Assembler :-). Ich glaube nicht, dass es einen schnelleren Algorithmus als eine lineare Transformation der 2D-Matrix gibt. Wenn OP eine lineare Transformation der 2D-Matrix auf Assembler durchführt, ist es schneller als die C-Sprache (oder NumPy, die in C geschrieben ist). Ich glaube nicht, dass CLAHE schneller ist als NumPy lineare Transformation, weil es komplexer Algorithmus ist. –

+0

Dieser Code hat den Nachteil, dass er den Kontrast des Luminanzkanals erhöht, aber die Farbkanäle unverändert lässt. Das Ergebnisbild hat also einen geringeren Farbkontrast. Deine Bilder sind nicht das beste Beispiel. Wenn Sie dies mit anderen Fotos mit mehr Farben und weniger Kontrast versuchen, werden Sie feststellen, dass dieser Code nicht die optimalen Ergebnisse liefert. – Elmue

Verwandte Themen