我将使用行和列检测来裁剪图像。当它检测到黑色像素时,它将知道需要裁剪的列或行,但是python向我展示了;
如果img [y,x] == [0]: ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()
这是图片
有人可以告诉我我在做什么错吗?
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()
答案 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):
...