webentwicklung-frage-antwort-db.com.de

Wie kann man die Bildhelligkeit mit Python + OpenCV schnell ändern?

Ich habe eine Folge von Bildern. Ich muss die Helligkeit dieser Bilder berechnen.

Erstes Beispiel (sehr langsam):

img = cv2.imread('test.jpg') #load rgb image
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #convert it to hsv

for x in range(0, len(hsv)):
    for y in range(0, len(hsv[0])):
        hsv[x, y][2] += value

img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite("image_processed.jpg", img)

Zweites Beispiel (schnell)

hsv += value

Dieses Beispiel sehr schnell, aber es ändert sich alle Werte HSV

10
Pavel

Slice um nur den dritten Kanal auszuwählen und dann diese Elemente zu ändern -

hsv[:,:,2] += value
12
Divakar

Ich weiß, dass diese Frage ein bisschen alt ist, aber ich dachte, ich könnte die vollständige Lösung posten, die für mich funktioniert hat (kümmert sich um die Überlaufsituation, indem sie bei 255 gesättigt wird):

def increase_brightness(img, value=30):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv)

    lim = 255 - value
    v[v > lim] = 255
    v[v <= lim] += value

    final_hsv = cv2.merge((h, s, v))
    img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
    return img

Dies kann wie folgt verwendet werden:

frame = increase_brightness(frame, value=20)
10
Bill Grates

Das Durchlaufen des gesamten Bildes zum Durchführen von Änderungen ist keine sehr skalierbare Option in opencv. Opencv bietet viele Methoden und Funktionen zum Ausführen der Rechenoperationen für das angegebene Bild. 

Sie können das konvertierte HSV-Bild einfach in die einzelnen Kanäle aufteilen und den V-Kanal entsprechend wie folgt verarbeiten:

img = cv2.imread('test.jpg') #load rgb image
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #convert it to hsv

h, s, v = cv2.split(hsv)
v += 255
final_hsv = cv2.merge((h, s, v))

img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite("image_processed.jpg", img)
5
ZdaR

Die anderen Antworten schlagen vor, die Sättigung "von Hand" mit allen Arten von Numpy-Magie durchzuführen. Sie können jedoch auch cv2.add () verwenden und OpenCV das für Sie erledigen lassen:

import cv2
import numpy as np

image = cv2.read('image.png')
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
value = 42 #whatever value you want to add
cv2.add(hsv[:,:,2], value, hsv[:,:,2])
image = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('out.png', image)
2
Gui Meira
def change_brightness(img, alpha, beta):
   return cv2.addWeighted(img, alpha, np.zeros(img.shape, img.dtype),0, beta)

Hier sind alpha & beta Eingabeparameter. Jedes Pixel des Eingabebildes ändert sich gemäß dieser Formel.

 alpha(pixel_value) + beta.

Ein niedrigerer Alpha-Wert wie 2 oder 3 ist gut

1
Vikas
import cv2
import numpy as np

image = cv2.imread('image.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

v = image[:, :, 2]
v = np.where(v <= 255 - increase, v + increase, 255)
image[:, :, 2] = v

image = cv2.cvtColor(image, cv2.COLOR_HSV2BGR)

cv2.imshow('Brightness', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
1
Rendicahya

Hoffe, das ist nützlich für jemanden

@Divakar answer Python, OpenCV: Bildhelligkeit erhöhen, ohne UINT8-Array zu überfluten

mImage = cv2.imread('image1.jpg')

hsvImg = cv2.cvtColor(mImage,cv2.COLOR_BGR2HSV)

value = 0

vValue = hsvImg[...,2]
hsvImg[...,2] = np.where((255-vValue)<value,255,vValue+value)

plt.subplot(111), plt.imshow(cv2.cvtColor(hsvImg,cv2.COLOR_HSV2RGB))
plt.title('brightened image'), plt.xticks([]), plt.yticks([])
plt.show()

Die Helligkeit verringern 

mImage = cv2.imread('image1.jpg')

hsvImg = cv2.cvtColor(mImage,cv2.COLOR_BGR2HSV)

# decreasing the V channel by a factor from the original
hsvImg[...,2] = hsvImg[...,2]*0.6

plt.subplot(111), plt.imshow(cv2.cvtColor(hsvImg,cv2.COLOR_HSV2RGB))
plt.title('brightened image'), plt.xticks([]), plt.yticks([])
plt.show()

Mit dieser Funktion können Sie das gewünschte Helligkeit oder Kontrast mit C++ genau so ändern, wie Sie es in Photoshop oder einer ähnlichen Fotobearbeitungssoftware tun.

def apply_brightness_contrast(input_img, brightness = 255, contrast = 127):
    brightness = map(brightness, 0, 510, -255, 255)
    contrast = map(contrast, 0, 254, -127, 127)

    if brightness != 0:
        if brightness > 0:
            shadow = brightness
            highlight = 255
        else:
            shadow = 0
            highlight = 255 + brightness
        alpha_b = (highlight - shadow)/255
        gamma_b = shadow

        buf = cv2.addWeighted(input_img, alpha_b, input_img, 0, gamma_b)
    else:
        buf = input_img.copy()

    if contrast != 0:
        f = float(131 * (contrast + 127)) / (127 * (131 - contrast))
        alpha_c = f
        gamma_c = 127*(1-f)

        buf = cv2.addWeighted(buf, alpha_c, buf, 0, gamma_c)

    cv2.putText(buf,'B:{},C:{}'.format(brightness,contrast),(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    return buf

def map(x, in_min, in_max, out_min, out_max):
    return int((x-in_min) * (out_max-out_min) / (in_max-in_min) + out_min)

Danach müssen Sie die Funktionen aufrufen, indem Sie die Trackbar mit cv2.createTrackbar() erstellen und die obigen Funktionen mit den richtigen Parametern aufrufen. Um die Helligkeitswerte im Bereich von -255 bis +255 und die Kontrastwerte von -127 bis +127 abzubilden, können Sie die Funktion map() verwenden. Sie können die vollständigen Details zu Python-Implementierung hier überprüfen.

0

Möglicherweise zu alt, aber ich verwende cv.covertTo, was für mich funktioniert

Mat resultBrightImage;    
origImage.convertTo(resultBrightImage, -1, 1, percent); // Where percent = (int)(percent_val/100)*255, e.g., percent = 50 to increase brightness by 50%

convertTo verwendet am Ende saturate_cast, um Überläufe zu vermeiden. Ich benutze Python nicht und das obige ist in C++, aber ich hoffe, dass es in Python leicht konvertierbar ist und hoffe, dass es hilft

0
Bilal

Ich weiß, das sollte nicht so schwer sein und da die Helligkeit eines Bildes anpassen. Auch gibt es schon viele tolle Antworten. Ich möchte die Antwort von @BillGrates verbessern, damit es bei Graustufenbildern funktioniert und die Helligkeit verringert wird: value = -255 erzeugt ein schwarzes Bild, während value = 255 ein weißer.

def adjust_brightness(img, value):
    num_channels = 1 if len(img.shape) < 3 else 1 if img.shape[-1] == 1 else 3
    img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) if num_channels == 1 else img
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv)

    if value >= 0:
        lim = 255 - value
        v[v > lim] = 255
        v[v <= lim] += value
    else:
        value = int(-value)
        lim = 0 + value
        v[v < lim] = 0
        v[v >= lim] -= value

    final_hsv = cv2.merge((h, s, v))

    img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) if num_channels == 1 else img
    return img
0
oezguensi