首页 > 解决方案 > 为什么我的代码没有添加它给出的列表,即使它被告知这样做?

问题描述

我一直在尝试添加图像中每个像素的 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:

在此处输入图像描述

标签: pythonpython-3.xopencvcomputer-vision

解决方案


默认情况下,该方法返回一个类型为无符号整数0 到 255cv2.imread()的数组。uint8

警告

RuntimeWarning: overflow encountered in ubyte_scalars

是由您的这行代码引起的:

rgb = blue + green + red

你看,如果变量blue和都包含一个从到的整数green,那么将它们加在一起很可能会产生一个大于不时的数字。red0255255

记住变量的数据类型bluegreenreduint8,和不是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]

推荐阅读