it-swarm.com.ru

Как быстро изменить яркость изображения с помощью Python + OpenCV?

У меня есть последовательность изображений. Мне нужно усреднить яркость этих изображений.

Первый пример (очень медленно):

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)

Второй пример (быстро)

hsv += value

Этот пример очень быстрый, но он меняет все значения HSV (мне нужно изменить только V (яркость))

10
Pavel

Slice , чтобы выбрать только третий канал, а затем изменить эти элементы -

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

Я знаю, что этот вопрос немного устарел, но я подумал, что мог бы опубликовать полное решение, которое сработало для меня (заботится о ситуации переполнения путем насыщения на 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

Это можно использовать следующим образом:

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

Итерации по всему изображению для внесения изменений - не очень масштабируемая опция в opencv, Opencv предоставляет множество методов и функций для выполнения арифметических операций с данным изображением. 

Вы можете просто разделить преобразованное изображение HSV на отдельные каналы и затем обработать V-канал соответственно:

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

В других ответах предлагается выполнять насыщение «вручную», используя всевозможную магию, но вы также можете использовать cv2.add () и позволить OpenCV обработать это для вас:

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

Надеюсь, это кому-нибудь пригодится

@Divakar answer Python, OpenCV: увеличение яркости изображения без переполнения массива 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()

Уменьшить яркость 

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

Может быть слишком стар, но я использую cv.covertTo, который работает для меня

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 использует saturate_cast в конце, чтобы избежать любых переполнений. Я не использую Python, а вышеприведенное написано на C++, но я надеюсь, что он легко конвертируется в Python, и надеюсь, что это поможет

0
Bilal