TypeError: только массивы размера -1 могут быть преобразованы в python скаляр - PullRequest
0 голосов
/ 02 августа 2020

Я столкнулся с этой ошибкой и не знаком с python. не уверен, как я не должен вводить матрицу в качестве ввода (изображения), это код:

import cv2
import matplotlib.pyplot as plt
image = cv2.imread('sample.jpg')


def show_rgb_hist(image):
        colours = ('r','g','b')
        for i, c in enumerate(colours):
        plt.figure(figsize=(20, 4))
        histr = cv2.calcHist([image], [i], None, [256], [0, 256])

        if c == 'r': colours = [((i/256, 0, 0)) for i in range(0, 256)]
        if c == 'g': colours = [((0, i/256, 0)) for i in range(0, 256)]
        if c == 'b': colours = [((0, 0, i/256)) for i in range(0, 256)]

        plt.bar(range(0, 256), histr, color=colours, edgecolor=colours, width=1)

        plt.show()

x=show_rgb_hist(image)
cv2.imshow('img', x)

1 Ответ

0 голосов
/ 02 августа 2020

Вся проблема в размерах histr 255x1, использование ravel() решило проблему.

import cv2
import matplotlib.pyplot as plt
image = cv2.imread('Crous.jpg')


def show_rgb_hist(image):
        colours = ('r','g','b')
        for i, c in enumerate(colours):
            plt.figure(figsize=(20, 4))
            histr = cv2.calcHist([image], [i], None, [256], [0, 256])
            print(histr.shape) # shape here 255 x 1
            histr = histr.ravel() # this line will solve the problem
            if c == 'r': colours = [((i/256, 0, 0)) for i in range(0, 256)]
            if c == 'g': colours = [((0, i/256, 0)) for i in range(0, 256)]
            if c == 'b': colours = [((0, 0, i/256)) for i in range(0, 256)]
            plt.bar(range(0, 256), histr, color=colours, edgecolor=colours, width=1)

            plt.show()

x = show_rgb_hist(image)
# cv2.imshow('img', x) # no need for this
...