ubyte_scalars 中遇到运行时警告溢出
Runtime Warning overflow encountered in 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.5\python-2.7.9\Lib\idlelib\MuditPracticals\Image_Recognition\imagerec.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.5\python-2.7.9\Lib\idlelib\MuditPracticals\Image_Recognition\imagerec.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.5\python-2.7.9\Lib\idlelib\MuditPracticals\Image_Recognition\imagerec.py", line 47, in <module>
threshold(iar3)
File "C:\WinPython-32bit-2.7.9.5\python-2.7.9\Lib\idlelib\MuditPracticals\Image_Recognition\imagerec.py", line 17, in threshold
eachPix[0] = 255
ValueError: assignment destination is read-only
关于溢出运行时警告:
你不应该担心这些,它们本质上告诉你的是 uint_8
(无符号整数)type
defined by numpy
的范围,通常用于图像文件, 简直超出了可接受的范围。
根据提供的 link,uint_8
类型的范围为:
Unsigned integer (0 to 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]
抑制溢出运行时警告:
最后说明:你总是可以suppress/ignore these warnings,尽管这通常不是最好的主意。 (控制台中的一些警告很烦人,但它们可以让您更清楚地了解事物)
为此,只需在导入 numpy 后添加以下内容:
import numpy as np
np.seterr(over='ignore')
i1=Image.open('images/numbers/0.1.png')
iar1=np.array(i1)
而不是数组方法使用数组
尝试用 y:int(x)+int(y)
替换 y:x+y
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.5\python-2.7.9\Lib\idlelib\MuditPracticals\Image_Recognition\imagerec.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.5\python-2.7.9\Lib\idlelib\MuditPracticals\Image_Recognition\imagerec.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.5\python-2.7.9\Lib\idlelib\MuditPracticals\Image_Recognition\imagerec.py", line 47, in <module>
threshold(iar3)
File "C:\WinPython-32bit-2.7.9.5\python-2.7.9\Lib\idlelib\MuditPracticals\Image_Recognition\imagerec.py", line 17, in threshold
eachPix[0] = 255
ValueError: assignment destination is read-only
关于溢出运行时警告:
你不应该担心这些,它们本质上告诉你的是 uint_8
(无符号整数)type
defined by numpy
的范围,通常用于图像文件, 简直超出了可接受的范围。
根据提供的 link,uint_8
类型的范围为:
Unsigned integer (0 to 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]
抑制溢出运行时警告:
最后说明:你总是可以suppress/ignore these warnings,尽管这通常不是最好的主意。 (控制台中的一些警告很烦人,但它们可以让您更清楚地了解事物)
为此,只需在导入 numpy 后添加以下内容:
import numpy as np
np.seterr(over='ignore')
i1=Image.open('images/numbers/0.1.png') iar1=np.array(i1)
而不是数组方法使用数组
尝试用 y:int(x)+int(y)
替换 y:x+y