Я нашел решение, используя метод numpy.clip()
, а @ fmw42 предоставил решение, используя метод cv2.normalize()
. Мне нравится решение cv2.normalize()
немного лучше, потому что оно нормализует значения пикселей до 0-255, а не обрезает их в 0 или 255. Оба решения представлены здесь.
Решение cv2.normalize()
:
- Яркость - сдвиньте значения альфа и бета на одинаковую величину. Альфа может быть отрицательной, а бета может быть выше 255. (Если альфа> = 255, то изображение белое, а если бета <= 0, то изображение черное. </li>
- Контрастность - Расширение или сокращение разрыва между альфа и бета.
Вот код:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
cv2.normalize(frame, frame, 0, 255, cv2.NORM_MINMAX)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Решение numpy.clip()
:
Это помогло мне решить проблема: Как быстро изменить яркость изображения с помощью python + OpenCV? . Мне нужно:
- Преобразовать красно-зеленый синий (RGB) в значение Hue-Saturation-Value (HSV) сначала («Значение» совпадает с «Яркостью»)
- «Срез» массива Numpy до значения «Значение» массива Numpy и настройку яркости и контраста на этом срезе
- Преобразование обратно из HSV в RGB.
Вот рабочее решение. Измените значения contrast
и brightness
. numpy.clip()
гарантирует, что все значения пикселей остаются между 0 и 255 в каждом на каналах (R, G и B).
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
contrast = 1.25
brightness = 50
frame[:,:,2] = np.clip(contrast * frame[:,:,2] + brightness, 0, 255)
frame = cv2.cvtColor(frame, cv2.COLOR_HSV2BGR)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()