2015-09-16 11 views
7

Mam sekwencję obrazów. Potrzebuję średniej jasności tych obrazów.Jak szybko zmienić jasność obrazu za pomocą pythona + OpenCV?

Pierwszy przykład (bardzo wolno):

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) 

Drugi przykład (szybko)

hsv += value 

Ten przykład bardzo szybko, ale to zmienia wszystkie wartości HSV (muszę tylko zmienić V (jasność))

Odpowiedz

10

Slice wybrać tylko z trzecim kanałem, a następnie zmodyfikować te elementy -

hsv[:,:,2] += value 
+1

nie działa. Daje dziwny obraz jako wyjście po zwiększeniu jasności. –

+0

@GauravRaj Może się pojawić przepełnienie. Jeśli tak, być może trzeba użyć wycinania: ['numpy.clip'] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.clip.html). Pamiętaj też, że działa to po stronie HSV. Tak więc musisz wykonać te RGB do HSV i cofnąć konwersje. – Divakar

+0

Tak, zrobiłem to wszystko. BGR do HSV, Następnie hsv [:,:, 2] + = 50, Następnie np.clip, wreszcie HSV do BGR. Wciąż nie ma szczęścia. –

5

Iterowanie nad całym obrazem w celu wprowadzenia zmian nie jest ve Opcja skalowalna w opencv, Opencv oferuje wiele metod i funkcji do wykonywania operacji arytmetycznych na danym obrazie.

można łatwo podzielić przekonwertowany HSV obrazu w poszczególnych kanałach, a następnie przetwarzać kanał V odpowiednio jako:

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

Wiem, że to pytanie jest trochę stare, ale pomyślałem, że mogę opublikować kompletne rozwiązanie, które działało dla mnie (dba o sytuację przepełnienia przez nasycenie w 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 

ten może być stosowany w sposób następujący:

frame = increase_brightness(frame, value=20) 
0
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() 
Powiązane problemy