为什么我在 python 中得到 "RuntimeWarning: overflow encountered in ubyte_scalars error"?

Why I am getting "RuntimeWarning: overflow encountered in ubyte_scalars error" in python?

我知道如果我使用

我的程序将运行
int(red)+int(blue)+int(green)

但我想知道为什么?

在我的代码中,我将 redbluegreen 添加到 avg(我声明为 avg=1000),这很容易保存三个 8 位整数的总和。

我不明白为什么会抛出溢出错误。

这是我的代码:

import cv2 as cv
import numpy as np
avg=1000
img=cv.imread('C:/Users/#####/Documents/roi.jpg')
print(img.shape)
print(img.dtype)
for i in range(0,279):
    for j in range(0,449):
        blue=img[i,j,0]
        green=img[i,j,1]
        red=img[i,j,2]
        avg=(red+green+blue)/3
        img[i,j,0]=avg
        img[i,j,1]=avg
        img[i,j,2]=avg
while(1):
    cv.imshow("Image",img)
    if cv.waitKey(0):
        break
cv.destroyAllWindows()

尝试打印 redgreenbluetype,您将得到:

<class 'numpy.uint8'>

每个最大值为 255(参见 Numpy Data Types)。

尝试打印 redgreenblue 的值,这三者的总和很容易超过 255(例如 251 + 251 + 251)。是的,avg 变量将被类型化为 Python 的原生 int 可以保存总和,但是三个 numpy.uint8 类型的加法运算会引发警告, before 赋值给 avg。您可以通过

来检查
red + green + blue

没有将它分配给任何东西,它会引发同样的警告。

Numpy 的数据类型文档还提供了一些关于 Overflow Errors 的信息:

The fixed size of NumPy numeric types may cause overflow errors when a value requires more memory than available in the data type.