我正在尝试将某个图像的颜色更改为新颜色。但是在运行下面的代码时。出现以下错误:
追踪(最近一次通话) 文件“/home/vagner/PycharmProjects/TestesDeBorda/DesenharRetangulo.py”, 第16行,
if (image[i, j] > minCorAgua - image[i, j] < maxCorAgua).all():
ValueError:具有多个元素的数组的真值是不明确的。使用
a.any()
或a.all()
import cv2
minCorAgua = (108,110,115)
maxCorAgua = (166,163,162)
i = 0
j = 0
#video = cv2.VideoCapture('TesteVideoMelhor.MOV')
#ret, frame = video.read()
imagem = cv2.imread('PegarPixelsDaAgua.png')
while(i < imagem.shape[1]):
while(j < imagem.shape[0]):
if (imagem[i,j] > minCorAgua and imagem[i,j] < maxCorAgua):
imagem[i,j] = (255,255,255)
j = j + 1
i = i + 1
cv2.imshow('teste', imagem)
答案 0 :(得分:1)
跳到3以获得一个numpy解决方案。
<强> 1。使用all
if (all(imagem[i,j] > minCorAgua) and all(imagem[i,j] < maxCorAgua)):
为什么呢? read this answer
执行imagem[i,j] > minCorAgua
时,python会将数组imagem[i,j]
的每个元素与minCorAgua
中的每个元素进行比较,并返回一个数组。
>>>imagem[i,j] > minCorAgua
array([ True, True, True], dtype=bool)
>>>imagem[i,j] < maxCorAgua
array([ True, False, True], dtype=bool)
当a和b是列表,数组或其他可迭代项时,你不能if (a and b)
检查a
和b
中的所有元素是否为真,而不使用函数{{1 }}。如果数组的每个元素都为True,则此函数将返回True。
all
使用while
for i in range(imagem.shape[0]):
函数将返回一个列表,range()
语句将遍历列表。
for
现在,您不需要增加和初始化>>>range(5)
[0, 1, 2, 3, 4]
和i
,从而使您的代码更清晰。
j
3。 要Numpy way执行此操作
for i in range(imagem.shape[1]):
for j in range(imagem.shape[0]):
if (all(imagem[i,j] > minCorAgua) and all(imagem[i,j] < maxCorAgua)):
imagem[i,j] = (255,255,255)