如何使用python + OpenCV快速更改图像亮度?

Pav*_*vel 14 python opencv numpy image-processing

我有一系列的图像.我需要平均这些图像的亮度.

第一个例子(非常慢):

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)
Run Code Online (Sandbox Code Playgroud)

第二个例子(快速)

hsv += value
Run Code Online (Sandbox Code Playgroud)

这个例子非常快但它改变了所有值HSV(我只需改变V(亮度))

小智 22

我知道这个问题有点旧,但我想我可能会发布适用于我的完整解决方案(通过在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
Run Code Online (Sandbox Code Playgroud)

这可以使用如下:

frame = increase_brightness(frame, value=20)
Run Code Online (Sandbox Code Playgroud)

  • 清晰,易读,有效.这应该是公认的答案 (3认同)

Div*_*kar 18

Slice 选择第三个通道,然后修改这些元素 -

hsv[:,:,2] += value
Run Code Online (Sandbox Code Playgroud)

  • 嗨,我只是将opencv方法应用于bgr图像 - cv2.add(inputImage,np.array([50.0]))将亮度增加50.0 (4认同)
  • 不起作用。增加亮度后输出一些奇怪的图像。 (2认同)

Gui*_*ira 9

其他答案建议使用各种numpy魔术“手动”完成饱和,但是您也可以使用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)
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了这段代码,但显示 TypeError: Expected Ptr&lt;cv::UMat&gt; for argument 'dst' at cv2.add()。 (6认同)
  • 最好的答案。我正在阅读其他答案,想知道为什么没人会按照您的建议去做。可悲的是,这个答案是在底部。可接受的答案会受到8位溢出的影响,有关cv2.add的有用注释将不会根据颜色均匀地使图像变亮。这个答案是正确的。 (2认同)

Zda*_*daR 7

迭代整个图像进行更改在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)
Run Code Online (Sandbox Code Playgroud)


小智 5

这是我增加和减少亮度的解决方案。其他几个答案有一些错误问题。函数接收正值或负值并改变亮度。

代码示例

img = cv2.imread(path_to_image)
img = change_brightness(img, value=30) #increases
img = change_brightness(img, value=-30) #decreases
Run Code Online (Sandbox Code Playgroud)

被调用的函数

def change_brightness(img, value=30):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv)
    v = cv2.add(v,value)
    v[v > 255] = 255
    v[v < 0] = 0
    final_hsv = cv2.merge((h, s, v))
    img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
return img
Run Code Online (Sandbox Code Playgroud)