Python、OpenCV:在不溢出 UINT8 数组的情况下增加图像亮度 [英] Python, OpenCV: Increasing image brightness without overflowing UINT8 array

查看:47
本文介绍了Python、OpenCV:在不溢出 UINT8 数组的情况下增加图像亮度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试增加灰度图像的亮度.cv2.imread() 返回一个 numpy 数组.我正在向数组的每个元素添加整数值.从理论上讲,这会增加它们中的每一个.之后我就可以将上限阈值设置为255并获得更高亮度的图像.

代码如下:

grey = cv2.imread(path+file,0)打印类型(灰色)打印灰色[0]新 = 灰度 + 值打印新[0]res = np.hstack((灰色,新的))cv2.imshow('图像', res)cv2.waitKey(0)cv2.destroyAllWindows()

然而,numpy加法显然是这样做的:

new_array = old_array % 256

每一个高于 255 的像素强度值都变成除以 256 的余数.

结果,我变黑了,而不是完全变白.

这是输出:

[115 114 121 ..., 170 169 167][215 214 221 ..., 14 13 11]

这是图片:

如何关闭这个余数机制?有没有更好的方法可以在 OpenCV 中增加亮度?

解决方案

一个想法是在添加 value 之前通过检查 255 之间的差异来检查添加是否会导致溢出 和当前像素值并检查它是否在 value 内.如果是,我们不会添加value,我们会直接设置255,否则我们会添加.现在,可以通过创建掩码来简化此决策,并且 -

mask = (255 - 灰色) <价值

然后,将此掩码/布尔数组提供给

I am trying to increase brightness of a grayscale image. cv2.imread() returns a numpy array. I am adding integer value to every element of the array. Theoretically, this would increase each of them. After that I would be able to put upper threshold of 255 and get the image with the higher brightness.

Here is the code:

grey = cv2.imread(path+file,0)

print type(grey)

print grey[0]

new = grey + value

print new[0]

res = np.hstack((grey, new))

cv2.imshow('image', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

However, numpy addition apparently does something like that:

new_array = old_array % 256

Every pixel intensity value higher than 255 becomes a remainder of dividing by 256.

As a result, I am getting dark instead of completely white.

Here is the output:

<type 'numpy.ndarray'>
[115 114 121 ..., 170 169 167]
[215 214 221 ...,  14  13  11]

And here is the image:

How can I switch off this remainder mechanism? Is there any better way to increase brightness in OpenCV?

解决方案

One idea would be to check before adding value whether the addition would result in an overflow by checking the difference between 255 and the current pixel value and checking if it's within value. If it does, we won't add value, we would directly set those at 255, otherwise we would do the addition. Now, this decision making could be eased up with a mask creation and would be -

mask = (255 - grey) < value

Then, feed this mask/boolean array to np.where to let it choose between 255 and grey+value based on the mask.

Thus, finally we would have the implementation as -

grey_new = np.where((255 - grey) < value,255,grey+value)

Sample run

Let's use a small representative example to demonstrate the steps.

In [340]: grey
Out[340]: 
array([[125, 212, 104, 180, 244],
       [105,  26, 132, 145, 157],
       [126, 230, 225, 204,  91],
       [226, 181,  43, 122, 125]], dtype=uint8)

In [341]: value = 100

In [342]: grey + 100 # Bad results (e.g. look at (0,1))
Out[342]: 
array([[225,  56, 204,  24,  88],
       [205, 126, 232, 245,   1],
       [226,  74,  69,  48, 191],
       [ 70,  25, 143, 222, 225]], dtype=uint8)

In [343]: np.where((255 - grey) < 100,255,grey+value) # Expected results
Out[343]: 
array([[225, 255, 204, 255, 255],
       [205, 126, 232, 245, 255],
       [226, 255, 255, 255, 191],
       [255, 255, 143, 222, 225]], dtype=uint8)

Testing on sample image

Using the sample image posted in the question to give us arr and using value as 50, we would have -

这篇关于Python、OpenCV:在不溢出 UINT8 数组的情况下增加图像亮度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆