web-dev-qa-db-fra.com

Comment changer rapidement la luminosité de l'image avec Python + OpenCV?

J'ai une séquence d'images. J'ai besoin de la luminosité moyenne de ces images.

Premier exemple (très lent):

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)

Deuxième exemple (rapidement)

hsv += value

Cet exemple très rapide mais il change toutes les valeurs HSV (je n'ai besoin que de changer V (luminosité))

10
Pavel

Slice pour sélectionner uniquement le troisième canal, puis modifier ces éléments -

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

Je sais que cette question est un peu ancienne, mais je pensais pouvoir publier la solution complète qui fonctionnait pour moi (prend en charge la situation de débordement en saturant à 255):

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

Ceci peut être utilisé comme suit:

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

Itérer sur l’ensemble de l’image pour y apporter des modifications n’est pas une option très évolutive dans opencv, Opencv fournit de nombreuses méthodes et fonctions permettant d’effectuer les opérations arithmétiques sur l’image donnée. 

Vous pouvez simplement diviser l'image HSV convertie dans les canaux individuels, puis traiter le canal V en conséquence comme suit:

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

Les autres réponses suggèrent de faire la saturation "à la main" en utilisant toutes sortes de magie numpy, mais vous pouvez aussi utiliser cv2.add () et laisser OpenCV le gérer pour vous:

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
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

J'espère que c'est utile pour quelqu'un

@Divakar answer Python, OpenCV: augmenter la luminosité de l'image sans faire déborder le tableau UINT8

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()

Pour diminuer la luminosité 

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()

Peut-être trop vieux mais j'utilise cv.covertTo qui fonctionne pour moi

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 utilise saturate_cast à la fin pour éviter tout débordement. Je n'utilise pas Python et ce qui précède est en C++ mais j'espère qu'il sera facilement convertible en Python et j'espère que cela aidera

0
Bilal