python数组溢出_Python,OpenCV:增加图像亮度而不会溢出UINT8数组

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, internal OpenCV routine apparently does something like that:

new_array = old_array % 255

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

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

Here is the output:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值