为什么我的代码不添加给定的列表,即使它被告知这样做?

Why does my code not add the lists it is given even though it is told to do so?

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

这段代码不就是你想要的吗?

img_with_rgb_sum = list(map(lambda row : list(map(lambda color : sum(color), row)), Read))

输入

Read = [[[171, 127, 30], [19, 213, 66], [19, 187, 2], [2, 104, 247]], 
       [[217, 120, 234], [47, 114, 57], [68, 59, 152], [104, 204, 205]], 
       [[162, 156, 74], [209, 242, 95], [184, 169, 169], [73, 245, 206]], 
       [[86, 233, 254], [137, 122, 221], [215, 221, 101], [195, 171, 52]]]

输出

img_with_rgb_sum = [[328, 298, 208, 353], 
                   [571, 218, 279, 513], 
                   [392, 546, 522, 524], 
                   [573, 480, 537, 418]]

看来你只取了蓝色值。尝试:

blue = list(Read[i][j])[0]
green = list(Read[i][j])[1]
red = list(Read[i][j])[2]

也将 lib3 = [] 移动到循环之前,否则您将覆盖每个像素的列表

cv2.imread()方法默认returns一个uint8类型的数组,代表无符号整数(0到255).

警告

RuntimeWarning: overflow encountered in ubyte_scalars

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

rgb = blue + green + red

你看,如果变量bluegreenred都包含一个整数,范围是0255,那么将它们相加可能 会不时产生大于 255 的数字。

记住变量bluegreenred的数据类型是uint8,而不是int,我们可以看到为什么出现警告:

>>> type(red)
<class 'numpy.uint8'>

消除警告的方法是将图像类型从 uint8 转换为支持大于 255 的数字的类型,例如 uint16 (0 到 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]