繁体   English   中英

如何使用 opencv python 调整亮度、对比度和振动度?

[英]How do I adjust brightness, contrast and vibrance with opencv python?

我是图像处理的新手。 我在Python3中编程并使用OpenCV图像处理库。我想调整以下属性。

  1. 亮度
  2. 对比
  3. 活力
  4. 色调
  5. 饱和
  6. 亮度

对于 4、5、6。我正在使用以下代码转换为 HSV 空间。

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
h += value # 4
s += value # 5
v += value # 6
final_hsv = cv2.merge((h, s, v))
img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)

我为 1 和 2 找到的唯一教程就在这里 教程用的是C++,我编程的是Python。另外,不知道怎么调3.vibrance。 我非常感谢您的帮助,谢谢..

感谢@MarkSetchell 提供链接。 简而言之,答案仅使用 numpy,公式可以如下所示。

new_image = (old_image) × (contrast/127 + 1) - 对比度 + 亮度

这里的对比度亮度是 [-127,127] 范围内的整数。 标量 127 用于此范围。 另外,下面是我使用的代码。

brightness = 50
contrast = 30
img = np.int16(img)
img = img * (contrast/127+1) - contrast + brightness
img = np.clip(img, 0, 255)
img = np.uint8(img)

一种适用于彩色单色图像的简单亮度调整方法是

img = cv2.imread('your path',0)
brt = 40  

img[img < 255-brt] += brt  

cv2.imshow('img'+ img)

其中brt可能是增加亮度的正数或黑暗的负数。

brt = 40时,此代码中处理的图像前后的以下链接:

输入图像

输出图像

这是在 Python/OpenCV 中实现活力的一种方法。

转换为 HSV。 然后创建一个 sigmoid function LUT。

(S 形 function 从原点线性增加,但随后逐渐变平。)

在此处输入图像描述

参见https://en.wikipedia.org/wiki/Sigmoid_function

将 LUT 应用于 S 通道。

转换回 BGR。

输入:

在此处输入图像描述

import cv2
import numpy as np

# read image
img = cv2.imread('yellow_building.jpg')

# convert image to hsv colorspace as floats
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
print(np.amax(s), np.amin(s), s.dtype)

# set vibrance
vibrance=1.4

# create 256 element non-linear LUT for sigmoidal function
# see https://en.wikipedia.org/wiki/Sigmoid_function
xval = np.arange(0, 256)
lut = (255*np.tanh(vibrance*xval/255)/np.tanh(1)+0.5).astype(np.uint8)

# apply lut to saturation channel
new_s = cv2.LUT(s,lut)

# combine new_s with original h and v channels
new_hsv = cv2.merge([h,new_s,v])

# convert back to BGR
result =  cv2.cvtColor(new_hsv,  cv2.COLOR_HSV2BGR)

# save output image
cv2.imwrite('yellow_building_vibrance.jpg', result)

# display images
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

在此处输入图像描述

我不确定这是否会有所帮助,但是为了改变亮度,对比度,我个人将图像切换到 PIL.Image 并使用 PIL.ImageEnhance,这在使用比率或百分比时会派上用场。

image = PIL.Image.open("path_to_image")

#increasing the brightness 20%
new_image = PIL.ImageEnhance.Brightness(image).enhance(1.2)

#increasing the contrast 20%
new_image = PIL.ImageEnhance.Contrast(image).enhance(1.2)

我仍然没有为 Vibrance 找到一个干净的方法。 有关 ImageEnahance 的更多信息,我建议阅读官方文档 - https://pillow.readthedocs.io/en/stable/reference/ImageEnhance.html

对于转换,我使用这个 ..

注意 - OpenCV 使用 BGR,PIL 使用 RGB 通道。 因此,如果转换不当,可能会变得混乱。

#convert pil.image to opencv (numpy.ndarray)
#need numpy library for this
cv_image = numpy.array(pil_image)

#convert opencv to pil.image

image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB)
pil_image = Image.fromarray(image)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM