python - 为什么我的代码没有添加它给出的列表,即使它被告知这样做?
问题描述
我一直在尝试添加图像中每个像素的 RGB 值,但由于某种原因,代码给了我一个警告,并拒绝添加这些值或将它们存储在一个列表中。
错误:
RuntimeWarning: Main.py:46: RuntimeWarning: overflow encountered in ubyte_scalars
rgb2 = red2[counter]+green2[counter]+blue2[counter]
代码:
import cv2
lib = ['Map1.png']
Read = list(cv2.imread(lib[0]))
while True:
for i in range(len(Read)): # y coords
for j in range(len(Read[i])): # x coords
blue = list(Read[i][j])[0]
green = list(Read[i][j])[0]
red = list(Read[i][j])[0]
rgb = blue + green + red
lib3 = []
lib3.append(rgb)
print(lib3)
地图1:
解决方案
默认情况下,该方法返回一个类型为无符号整数(0 到 255)cv2.imread()
的数组。uint8
警告
RuntimeWarning: overflow encountered in ubyte_scalars
是由您的这行代码引起的:
rgb = blue + green + red
你看,如果变量blue
和都包含一个从到的整数green
,那么将它们加在一起很可能会产生一个大于不时的数字。red
0
255
255
记住变量的数据类型blue
,green
和red
是uint8
,和不是int
,我们可以看到为什么会出现警告:
>>> type(red)
<class 'numpy.uint8'>
摆脱警告的方法是将图像类型 from 转换为uint8
支持大于 的数字的类型,255
例如uint16
(0 to 65535):
cv2.imread(lib[0]).astype("uint16")
请注意,您的代码的这些行中有一个小缺陷:
blue = list(Read[i][j])[0]
green = list(Read[i][j])[0]
red = list(Read[i][j])[0]
它应该是
blue = list(Read[i][j])[0]
green = list(Read[i][j])[1]
red = list(Read[i][j])[2]
或更好:
blue, green, red = Read[i][j]
推荐阅读
- python - 当函数在多列上执行时,在熊猫数据帧上使用 groupby -> transform(func),优先考虑速度
- sql - 如何从postgresql中包含单词和数字的列中提取数字
- angular - 角度传递参数 CanActivate
- java - API 将数据保存在错误的 MongoDB 集合中
- reactjs - 不能直接改变状态,但是使用 setState 会导致 null 错误
- sql-server - 将 Oracle PL/SQL 过程声明转换为 T-SQL 过程
- python - 具有类型的单一调度方法
- spring - SimpleDateFormat 将日期字符串解析为错误值
- multithreading - 将 error_chain 与 JoinHandle 一起使用
- fonts - 如何在 LabWindows CVI 中查找系统上是否安装了字体?