ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()(图像裁剪)

时间:2019-04-29 13:04:05

标签: python arrays opencv valueerror

我将使用行和列检测来裁剪图像。当它检测到黑色像素时,它将知道需要裁剪的列或行,但是python向我展示了;

  

如果img [y,x] == [0]:        ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()

这是图片

enter image description here

有人可以告诉我我在做什么错吗?

import cv2
import numpy as np
img = cv2.imread('C:/Users/user/Desktop/FYP 2019/Sign Language 1/red1.png')
gray = cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
ret,thresh = cv2.threshold(blur,125,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
#get the images dimensions 
h = img.shape[0]
w = img.shape[1]
lower_min_point = -1
upper_min_point = -1
left_point = -1
right_point = -1
for y in range(0, h):
    for x in range(0,w):
        if img[y,x] == [0]:
            lower_min_point = y             
            break
    if lower_min_point != -1:
        break
print (lower_min_point)
for y in range(h,0):
    for x in range(0,w):
        if img[y,x] == [0]:
            upper_min_point = y
            break
    if upper_min_point != -1:
        break
print(upper_min_point)

for x in range(0,w):
    for y in range(0,h):
        if img[y,x] == [0]:
            left_point = x
            break
    if left_point != -1:

            break
    print(left_point)       
    for x in range(w,0):
        for y in range(0,h):
            if img[y,x] == [0]:
                right_point = x
                break
        if right_point != -1:
            break
    print(right_point)
    crop = img[lower_min_point:upper_min_point, left_point:right_point]
    cv2.imshow("img",crop)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2 个答案:

答案 0 :(得分:0)

img是一个3维数组。因此img[x,y]将是一个向量,您的比较实际上将测试向量中每个元素的条件。因此,如果所有图像通道实际上都是array([True, True, True]),它将返回0。 您得到的错误消息已经为您提供了解决方案:在结果向量上调用.all()(这将检查条件是否对数组中的所有元素都成立)。

(img[x,y] == [0]).all()将为您提供所需的行为。

答案 1 :(得分:0)

如果要检查是否有任何Python iterable包含所有True值,则可以使用all

zero_channels = [channel == 0 for channel in img[y, x]]  # python list of bools
if all(zero_channels):
  ...

事实证明,使用numpy数组相等性(cv2图像/切片为此是numpy数组)和np.logical_all可以完成相同的事情:

zero_channels = img[y, x] == 0  # element-wise equality, returns np.array of bools
if np.logical_all(zero_channels):
  ...

一旦您对这些想法感到满意,就可以通过将它们放在同一行中来进行清理,例如

if np.logical_all(img[y, x] == 0):
   ...