如何使用python + OpenCV快速更改图像亮度?
image-processing
numpy
opencv
python
4
0

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

第一个示例 (非常慢):

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(亮度))

参考资料:
Stack Overflow
收藏
评论
共 6 个回答
高赞 时间 活跃

在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)
收藏
评论

我知道这个问题有点老了,但我想我可以发布对我有用的完整解决方案(通过将饱和度设置为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)
收藏
评论
import cv2
import numpy as np

image = cv2.imread('image.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

increase = 100

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()
收藏
评论

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

hsv[:,:,2] += value
收藏
评论

其他答案建议使用各种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)
收藏
评论
def change_brightness(img, alpha, beta):
   return cv2.addWeighted(img, alpha, np.zeros(img.shape, img.dtype),0, beta)

这里的alpha和beta是输入参数。输入图像的每个像素将根据此公式进行更改。

 alpha(pixel_value) + beta.

较低的alpha值(例如2或3)是好的

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号