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é))
Slice
pour sélectionner uniquement le troisième canal, puis modifier ces éléments -
hsv[:,:,2] += value
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)
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)
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)
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()
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