为什么我的代码不添加给定的列表,即使它被告知这样做?
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
你看,如果变量blue
、green
和red
都包含一个整数,范围是0
到255
,那么将它们相加可能 会不时产生大于 255
的数字。
记住变量blue
、green
和red
的数据类型是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]
我一直在尝试添加图像中每个像素的 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
你看,如果变量blue
、green
和red
都包含一个整数,范围是0
到255
,那么将它们相加可能 会不时产生大于 255
的数字。
记住变量blue
、green
和red
的数据类型是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]