ValueError: Значение истинности массива с более чем одним элементом неоднозначно.Используйте a.any () или a.all () (обрезка изображения) - PullRequest
0 голосов
/ 29 апреля 2019

Я собираюсь обрезать изображение с помощью обнаружения строк и столбцов.Когда он обнаружит черный пиксель, он будет знать, что столбец или строка должны быть обрезаны, но питон покажет мне;

if 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 голосов
/ 29 апреля 2019

Если вы хотите проверить, содержит ли какой-либо питон iterable все значения True, вы можете использовать all.

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

Как оказалось, то же самое можно сделать, используя равенство массива numpy.(изображения / фрагменты cv2 для этой цели являются массивами) и 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):
   ...
0 голосов
/ 29 апреля 2019

img - это трехмерный массив. Поэтому img[x,y] будет вектором, и ваше сравнение фактически проверит условие для каждого элемента в векторе. Таким образом, он вернет array([True, True, True]), если все каналы изображения на самом деле 0. Полученное вами сообщение об ошибке дает вам решение: вызовите .all() для результирующего вектора (это проверит, выполняется ли условие для всех элементов в массиве).

(img[x,y] == [0]).all() даст вам желаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...