比较来自世界各地的卖家的域名和 IT 服务价格

如何快速更改图像的亮度 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 /亮度//
已邀请:

卫东

赞同来自:

我知道这个问题有点过时,但我以为我可以发布一个为我工作的完整决定 /关心溢出的情况,饱和 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/

帅驴

赞同来自:

http://docs.scipy.org/doc/nump ... exing
仅选择第三通道,然后更改这些项目 -


hsv[:,:,2] += value

喜特乐

赞同来自:

提供饱和时间的其他答案 "by hand", 使用各种魔法 numpy, 但你也可以使用
https://docs.opencv.org/3.4.1/ ... fdbd6
并允许 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/

三叔

赞同来自:

在整个图像中迭代以进行更改不是一个非常可扩展的选项 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/

石油百科

赞同来自:

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 出色地

奔跑吧少年

赞同来自:

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//

窦买办

赞同来自:

我希望这对某人有用

@Divakar 回答
https://coderoad.ru/37822375/

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 #="" 'brightened="" ,="" 111="" <="" [="" []="" [code]mimage="cv2.imread/'image1.jpg'/" a="" by="" channel="" code]="" cv2.cvtcolor="" decreasing="" div="" factor="" from="" hsvimg="cv2.cvtColor/mImage,cv2.COLOR_BGR2HSV/" hsvimg,cv2.color_hsv2rgb="" hsvimg[...,2]="hsvImg[...,2]*0.6" image'="" original="" plt.imshow="" plt.show="" plt.subplot="" plt.title="" plt.xticks="" plt.yticks="" the="" v="" 减少亮度="">
<div class="answer_text">
这是我的解决方案,可以放大并降低亮度。 我对一对其他答案有一些错误。 该功能采用正值或负值并改变亮度。

代码中的示例


[code]img = cv2.imread/path_to_image/
img = change_brightness/img, value=30/ #increases
img = change_brightness/img, value=-30/ #decreases


称为功能


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 &gt; 255] = 255
v[v &lt; 0] = 0
final_hsv = cv2.merge//h, s, v//
img = cv2.cvtColor/final_hsv, cv2.COLOR_HSV2BGR/
return img


</div>
<div class="answer_text">
您可以使用此功能来更改所需的功能
https://www.life2coding.com/br ... cv-c/
就像你这样做 photoshop 或其他类似的软件编辑软件。


def apply_brightness_contrast/input_img, brightness = 255, contrast = 127/:
brightness = map/brightness, 0, 510, -255, 255/
contrast = map/contrast, 0, 254, -127, 127/

if brightness != 0:
if brightness &gt; 0:
shadow = brightness
highlight = 255
else:
shadow = 0
highlight = 255 + brightness
alpha_b = /highlight - shadow//255
gamma_b = shadow

buf = cv2.addWeighted/input_img, alpha_b, input_img, 0, gamma_b/
else:
buf = input_img.copy//

if contrast != 0:
f = float/131 * /contrast + 127// / /127 * /131 - contrast//
alpha_c = f
gamma_c = 127*/1-f/

buf = cv2.addWeighted/buf, alpha_c, buf, 0, gamma_c/

cv2.putText/buf,'B:{},C:{}'.format/brightness,contrast/,/10, 30/, cv2.FONT_HERSHEY_SIMPLEX, 1, /0, 0, 255/, 2/
return buf

def map/x, in_min, in_max, out_min, out_max/:
return int//x-in_min/ * /out_max-out_min/ / /in_max-in_min/ + out_min/


之后,您需要通过创建轨栏来调用函数
cv2.createTrackbar//

, 并且还导致上述功能与相应的参数。 在范围内显示亮度值 -255 到 +255 与对比 -127 到 +127 您可以使用该功能
map//

. 您可以查看完整信息
https://www.life2coding.com/ch ... thon/
.
</div>
<div class="answer_text">
我知道它不应该是如此困难,在那里配置图像的亮度。 此外,还有很多优秀的答案。 我想改善答案 @BillGrates,, 因此,它在灰色阴影中运行在图像上,亮度降低:
value = -255

创造黑色图像,
value = 255

- 白色的。


def adjust_brightness/img, value/:
num_channels = 1 if len/img.shape/ &lt; 3 else 1 if img.shape[-1] == 1 else 3
img = cv2.cvtColor/img, cv2.COLOR_GRAY2BGR/ if num_channels == 1 else img
hsv = cv2.cvtColor/img, cv2.COLOR_BGR2HSV/
h, s, v = cv2.split/hsv/

if value &gt;= 0:
lim = 255 - value
v[v &gt; lim] = 255
v[v &lt;= lim] += value
else:
value = int/-value/
lim = 0 + value
v[v &lt; lim] = 0
v[v &gt;= lim] -= value

final_hsv = cv2.merge//h, s, v//

img = cv2.cvtColor/final_hsv, cv2.COLOR_HSV2BGR/
img = cv2.cvtColor/img, cv2.COLOR_BGR2GRAY/ if num_channels == 1 else img
return img


</div>
<div class="answer_text">
渠道 HSV 他们有类型 uint8, 范围范围 - [0, 179]. 因此,在添加大量或负数时 Python 返回垃圾结果。 因此,在运河中 hue 我们需要转到类型 int16, 然后返回类型 uint8. 在饱和通道上 /S/ 和含义 /V/ 存在相同的问题,因此我们需要在添加或减法之前检查值。

这是我决定随机变化的阴影,饱和度和值。 它基于示例代码



.


def shift_channel/c, amount/:
if amount &gt; 0:
lim = 255 - amount
c[c &gt;= lim] = 255
c[c &lt; lim] += amount
elif amount &lt; 0:
amount = -amount
lim = amount
c[c &lt;= lim] = 0
c[c &gt; lim] -= amount
return c

rand_h, rand_s, rand_v = 50, 50, 50
img_hsv = cv2.cvtColor/img_bgr, cv2.COLOR_BGR2HSV/
h, s, v = cv2.split/img_hsv/
# Random shift hue
shift_h = random.randint/-rand_h, rand_h/
h = //h.astype/'int16'/ + shift_h/ % 180/.astype/'uint8'/
# Random shift saturation
shift_s = random.randint/-rand_s, rand_s/
s = shift_channel/s, shift_s/
# Random shift value
shift_v = random.randint/-rand_v, rand_v/
v = shift_channel/v, shift_v/
shift_hsv = cv2.merge/[h, s, v]/
print/shift_h, shift_s, shift_v/
img_rgb = cv2.cvtColor/shift_hsv, cv2.COLOR_HSV2RGB/


</div>
<div class="answer_text">
也许我太老了,但我使用了 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 我希望它会有所帮助
</div>
</value,255,vvalue+value>

小明明

赞同来自:

这是我的解决方案,可以放大并降低亮度。 我对一对其他答案有一些错误。 该功能采用正值或负值并改变亮度。

代码中的示例


img = cv2.imread/path_to_image/
img = change_brightness/img, value=30/ #increases
img = change_brightness/img, value=-30/ #decreases


称为功能


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

三叔

赞同来自:

您可以使用此功能来更改所需的功能
https://www.life2coding.com/br ... cv-c/
就像你这样做 photoshop 或其他类似的软件编辑软件。


def apply_brightness_contrast/input_img, brightness = 255, contrast = 127/:
brightness = map/brightness, 0, 510, -255, 255/
contrast = map/contrast, 0, 254, -127, 127/

if brightness != 0:
if brightness > 0:
shadow = brightness
highlight = 255
else:
shadow = 0
highlight = 255 + brightness
alpha_b = /highlight - shadow//255
gamma_b = shadow

buf = cv2.addWeighted/input_img, alpha_b, input_img, 0, gamma_b/
else:
buf = input_img.copy//

if contrast != 0:
f = float/131 * /contrast + 127// / /127 * /131 - contrast//
alpha_c = f
gamma_c = 127*/1-f/

buf = cv2.addWeighted/buf, alpha_c, buf, 0, gamma_c/

cv2.putText/buf,'B:{},C:{}'.format/brightness,contrast/,/10, 30/, cv2.FONT_HERSHEY_SIMPLEX, 1, /0, 0, 255/, 2/
return buf

def map/x, in_min, in_max, out_min, out_max/:
return int//x-in_min/ * /out_max-out_min/ / /in_max-in_min/ + out_min/


之后,您需要通过创建轨栏来调用函数
cv2.createTrackbar//

, 并且还导致上述功能与相应的参数。 在范围内显示亮度值 -255 到 +255 与对比 -127 到 +127 您可以使用该功能
map//

. 您可以查看完整信息
https://www.life2coding.com/ch ... thon/
.

小姐请别说爱

赞同来自:

我知道它不应该是如此困难,在那里配置图像的亮度。 此外,还有很多优秀的答案。 我想改善答案 @BillGrates,, 因此,它在灰色阴影中运行在图像上,亮度降低:
value = -255

创造黑色图像,
value = 255

- 白色的。


def adjust_brightness/img, value/:
num_channels = 1 if len/img.shape/ < 3 else 1 if img.shape[-1] == 1 else 3
img = cv2.cvtColor/img, cv2.COLOR_GRAY2BGR/ if num_channels == 1 else img
hsv = cv2.cvtColor/img, cv2.COLOR_BGR2HSV/
h, s, v = cv2.split/hsv/

if value >= 0:
lim = 255 - value
v[v > lim] = 255
v[v <= lim] += value
else:
value = int/-value/
lim = 0 + value
v[v < lim] = 0
v[v >= lim] -= value

final_hsv = cv2.merge//h, s, v//

img = cv2.cvtColor/final_hsv, cv2.COLOR_HSV2BGR/
img = cv2.cvtColor/img, cv2.COLOR_BGR2GRAY/ if num_channels == 1 else img
return img

郭文康

赞同来自:

渠道 HSV 他们有类型 uint8, 范围范围 - [0, 179]. 因此,在添加大量或负数时 Python 返回垃圾结果。 因此,在运河中 hue 我们需要转到类型 int16, 然后返回类型 uint8. 在饱和通道上 /S/ 和含义 /V/ 存在相同的问题,因此我们需要在添加或减法之前检查值。

这是我决定随机变化的阴影,饱和度和值。 它基于示例代码



.


def shift_channel/c, amount/:
if amount > 0:
lim = 255 - amount
c[c >= lim] = 255
c[c < lim] += amount
elif amount < 0:
amount = -amount
lim = amount
c[c <= lim] = 0
c[c > lim] -= amount
return c

rand_h, rand_s, rand_v = 50, 50, 50
img_hsv = cv2.cvtColor/img_bgr, cv2.COLOR_BGR2HSV/
h, s, v = cv2.split/img_hsv/
# Random shift hue
shift_h = random.randint/-rand_h, rand_h/
h = //h.astype/'int16'/ + shift_h/ % 180/.astype/'uint8'/
# Random shift saturation
shift_s = random.randint/-rand_s, rand_s/
s = shift_channel/s, shift_s/
# Random shift value
shift_v = random.randint/-rand_v, rand_v/
v = shift_channel/v, shift_v/
shift_hsv = cv2.merge/[h, s, v]/
print/shift_h, shift_s, shift_v/
img_rgb = cv2.cvtColor/shift_hsv, cv2.COLOR_HSV2RGB/

裸奔

赞同来自:

也许我太老了,但我使用了 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 我希望它会有所帮助

要回复问题请先登录注册