更改某个范围之间的像素颜色

时间:2015-12-09 13:09:59

标签: python

我正在尝试将某个图像的颜色更改为新颜色。但是在运行下面的代码时。出现以下错误:

  

追踪(最近一次通话)   文件“/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)

1 个答案:

答案 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)检查ab中的所有元素是否为真,而不使用函数{{1 }}。如果数组的每个元素都为True,则此函数将返回True。

  1. 请勿使用all使用while
  2. 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)