Невозможно показать изображение с помощью plt.imshow

Я хочу построить серию изображений, которые хранятся в массиве numpy x_val, но plt.imshow (val [1]) не работает. С другой стороны, с opencv он отлично работает:

    cv2.imshow('image', x_val[1])
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Из того, что я читал до сих пор, я думаю, что проблема в том, что изображение в настоящее время находится в BGR и должно быть преобразовано в RGB (поправьте меня, если я ошибаюсь). Итак, я попробовал следующее:

img = cv2.imshow('image', x_val[1])
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

Но я получил это сообщение об ошибке:

File "C:\Users\Maximal\Documents\Python\PyCharm\TrafficSignClassification\model\trafficSignsClassification.py", line 156, in evaluateTestData
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

Еще я попробовал такой подход:

        img = np.array(x_val[1], dtype=np.uint8)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        plt.imshow(img)

Это не дало мне ошибки, но изображение было просто черным. Что я делаю неправильно?

РЕДАКТИРОВАТЬ: В первую очередь я сделал с изображениями следующее:

def preprocessData(self, x_train, x_val, y_train, y_val):
    # --- normalize images ---
    def normalize(img):
        img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # Grayscale image
        img = cv2.equalizeHist(img)                  # Optimize Lightning
        img = img / 255.0                            # Normalize px values between 0 and 1
        return img

    for x in range(len(x_train)):
        x_train[x] = normalize(x_train[x])

    for x in range(len(x_val)):
        x_val[x] = normalize(x_val[x])

    # --- transform the data to be accepted by the model ---
    y_train = np.array(y_train)
    y_val = np.array(y_val)
    x_train = np.array(x_train)
    x_val = np.array(x_val)
    x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], x_train.shape[2], 1)
    x_val = x_val.reshape(x_val.shape[0], x_val.shape[1], x_val.shape[2], 1)
    print("preprocessing data done.")
    return x_train, x_val, y_train, y_val

Я использую изображения в CNN в TF2, поэтому мне пришлось преобразовать их соответственно. Я могу без проблем построить изображения с помощью plt.imshow () до преобразования. Но после этой функции работает только cv2.imshow ()


person Daniel    schedule 10.05.2020    source источник
comment
stackoverflow.com/help/minimal-reproducible-example   -  person Paul H    schedule 10.05.2020
comment
Было бы полезно, если бы у вас был минимальный рабочий код, который можно было бы скопировать и вставить и выдать ошибку. Мне любопытно, что такое cv2.cvtColor (img, cv2.COLOR_BGR2RGB)?   -  person Bobby Ocean    schedule 10.05.2020
comment
что вы получаете за x_val[1].shape?   -  person tom10    schedule 11.05.2020
comment
Вы используете img = cv2.imshow('image', x_val[1]), а затем пытаетесь использовать plt.imshow(img)? Обратите внимание, что cv2.imshow() не имеет возвращаемого значения, поэтому img будет None.   -  person JohanC    schedule 11.05.2020
comment
@ tom10 Форма одного изображения (32, 32, 1)   -  person Daniel    schedule 11.05.2020
comment
Изображение с цветами будет иметь размерность 3 или 4 для разных цветов, например (32, 32, 3). Это как минимум часть вашей проблемы. Ваш текущий ответ несовместим с этим и сообщением об ошибке, поэтому в вашем коде, вероятно, изменилось что-то еще.   -  person tom10    schedule 11.05.2020


Ответы (1)


Я сам нашел ответ. Мне пришлось умножить значения на 255, чтобы получить правильное изображение. Раньше все значения были между 0 и 1, и это приводило к черному изображению.

        img = np.array(x_val[i]*255, dtype=np.uint8)
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        plt.imshow(img)
person Daniel    schedule 11.05.2020