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
Slice
um nur den dritten Kanal auszuwählen und dann diese Elemente zu ändern -
hsv[:,:,2] += value
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)
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)
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)
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
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()
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.
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
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