在ubyte_scalars中遇到运行时警告溢出


from PIL import Image
import numpy as np 
import matplotlib.pyplot as plt
def threshold(imageArray):
    balanceAr = []
    newAr = imageArray
    for eachRow in imageArray:
        for eachPix in eachRow:
            avgNum = reduce(lambda x, y: x + y, eachPix[:3]) / len(eachPix[:3])
            balanceAr.append(avgNum)
    balance = reduce(lambda x, y: x + y, balanceAr) / len(balanceAr)
    for eachRow in newAr:
        for eachPix in eachRow:
            if reduce(lambda x, y: x + y, eachPix[:3]) / len(eachPix[:3]) > balance:
                eachPix[0] = 255
                eachPix[1] = 255
                eachPix[2] = 255
                eachPix[3] = 255
            else:
                eachPix[0] = 0
                eachPix[1] = 0
                eachPix[2] = 0
                eachPix[3] = 255
    return newAr


i = Image.open('images/numbers/0.1.png')
iar = np.asarray(i)
3iar = threshold(iar)
i2 = Image.open('images/numbers/y0.4.png')
iar2 = np.asarray(i2)
#iar2 = threshold(iar2)
i3 = Image.open('images/numbers/y0.5.png')
iar3 = np.asarray(i3)
#iar3 = threshold(iar3)
i4 = Image.open('images/sentdex.png') 
iar4 = np.asarray(i4)
#iar4 = threshold(iar4)
threshold(iar3)
fig = plt.figure()
ax1 = plt.subplot2grid((8,6), (0,0), rowspan = 4, colspan = 3)
ax2 = plt.subplot2grid((8,6), (4,0), rowspan = 4, colspan = 3)
ax3 = plt.subplot2grid((8,6), (0,3), rowspan = 4, colspan = 3)
ax4 = plt.subplot2grid((8,6), (4,3), rowspan = 4, colspan = 3)
ax1.imshow(iar)
ax2.imshow(iar2)
ax3.imshow(iar3)
ax4.imshow(iar4)
plt.show()

我得到的错误:

Warning (from warnings module):
  File "C:WinPython-32bit-2.7.9.5python-2.7.9LibidlelibMuditPracticalsImage_Recognitionimagerec.py", line 11
    avgNum = reduce(lambda x, y: x + y, eachPix[:3]) / len(eachPix[:3])
RuntimeWarning: overflow encountered in ubyte_scalars
Warning (from warnings module):
  File "C:WinPython-32bit-2.7.9.5python-2.7.9LibidlelibMuditPracticalsImage_Recognitionimagerec.py", line 16
    if reduce(lambda x, y: x + y, eachPix[:3]) / len(eachPix[:3]) > balance:
RuntimeWarning: overflow encountered in ubyte_scalars
Traceback (most recent call last):
  File "C:WinPython-32bit-2.7.9.5python-2.7.9LibidlelibMuditPracticalsImage_Recognitionimagerec.py", line 47, in <module>
    threshold(iar3)
  File "C:WinPython-32bit-2.7.9.5python-2.7.9LibidlelibMuditPracticalsImage_Recognitionimagerec.py", line 17, in threshold
    eachPix[0] = 255
ValueError: assignment destination is read-only

关于溢出运行时间警告:


你不应该担心这些,它们本质上告诉你的是numpy定义的uint_8(无符号整数)type的范围,通常用于图像文件,已经超出了它的可接受范围。

从提供的链接来看,uint_8类型的范围为:

无符号整数(0 ~ 255)

numpy只向发出警告,通知您溢出。值得庆幸的是,它会自动将结果调整为可接受范围内的值。

例如:

from PIL import Image
import numpy as np
img = Image.open("/path/to/image.png")
img_array = np.asarray(img) # array values are of type uint_8 (!)
print img_array[0][0] # prints [ 12,  21,  56, 255] 
uint8_1 = img_array[0][0][3] # = 255
uint8_2 = img_array[0][0][2] # = 56
uint8_3 = uint8_1 + uint8_2 
# When executed raises a RuntimeWarning of overflow ubyte_scalars
# But! The result 'rolls over' to the acceptable range. So,
print uint8_3  # prints 55

关于实际错误:


你的错误 ValueError: assignment destination is read-only实际上是引发当分配值给你的numpy数组newAr。这很有用,它告诉你数组是read only;内容为只读: 可以访问,但是不能修改

所以像这样的动作:

# using img_array from previous snippet.
img_array[0][0][0] = 200 

将引发一个ValueError

值得庆幸的是,这很容易通过为数组设置一个标志参数来绕过:
# using img_array from the previous snippet
# make it writeable 
img_array.setflags(write=True)
# Values of img_array[0][0] are, as before: [ 12,  21,  56, 255]
# changing the values for your array is possible now!
img_array[0][0][0] = 200
print img_array[0][0] # prints [ 200,  21,  56, 255]

suppressed Overflow RuntimeWarnings:


最后注意:您总是可以抑制/忽略这些警告,尽管这通常不是最好的主意。(控制台的几个警告很烦人,但它们能让你更清楚地看到事情)

要做到这一点,只需在导入numpy后添加以下内容:
import numpy as np
np.seterr(over='ignore')

i1=Image.open('images/numbers/0.1.png')iar1 = np.array (i1)

而不是asarray方法使用array

尝试将y:x+y替换为y:int(x)+int(y)

相关内容

最新更新