Ошибка типа: только массивы размера 1 могут быть преобразованы в скаляры Python (self._linewidth = float (w)) - PullRequest
0 голосов
/ 05 декабря 2018

Я новичок в Python и OpenCV.Простите за легкий.Когда я запускаю приведенный ниже код, данная ошибка выглядит примерно так:

TypeError: только массивы размера 1 могут быть преобразованы в скаляры Python

import numpy as np
import cv2
from matplotlib import pyplot as plt
import numpy as np  



image = cv2.imread('C:\\Users\\abim\\Desktop\\im_pro\\images\\strawberries.jpg')
image.shape

# Convert from BGR to RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

 # Resize to a third of the size
image = cv2.resize(image, None, fx=1/3, fy=1/3)
def show(image):
    # Figure size in inches
    plt.figure(figsize=(15, 15))
    # Show image, with nearest neighbour interpolation
    plt.imshow(image, interpolation='nearest')

show(image)

# Show Red/Green/Blue
images = []
for i in [0, 1, 2]:
    colour = image.copy()
    if i != 0: colour[:,:,0] = 0
    if i != 1: colour[:,:,1] = 0
    if i != 2: colour[:,:,2] = 0
    images.append(colour)
show(np.vstack(images))

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()

show_rgb_hist(image)

    # Convert from RGB to HSV
hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
images = []
for i in [0, 1, 2]:
     colour = hsv.copy()
     if i != 0: colour[:,:,0] = 0
     if i != 1: colour[:,:,1] = 255
     if i != 2: colour[:,:,2] = 255
     images.append(colour)

hsv_stack = np.vstack(images)
rgb_stack = cv2.cvtColor(hsv_stack, cv2.COLOR_HSV2RGB)
show(rgb_stack)


matplotlib.rcParams.update({'font.size': 16})
def show_hsv_hist(image):
    # Hue
    plt.figure(figsize=(20, 3))
    histr = cv2.calcHist([image], [0], None, [180], [0, 180])
    plt.xlim([0, 180])
    colours = [colors.hsv_to_rgb((i/180, 1, 0.9)) for i in range(0, 180)]
    plt.bar(range(0, 180), histr, color=colours, edgecolor=colours, width=1)
    plt.title('Hue')

    # Saturation
    plt.figure(figsize=(20, 3))
    histr = cv2.calcHist([image], [1], None, [256], [0, 256])
    plt.xlim([0, 256])
    colours = [colors.hsv_to_rgb((0, i/256, 1)) for i in range(0, 256)]
    plt.bar(range(0, 256), histr, color=colours, edgecolor=colours, width=1)
    plt.title('Saturation')

    # Value
    plt.figure(figsize=(20, 3))
    histr = cv2.calcHist([image], [2], None, [256], [0, 256])
    plt.xlim([0, 256])

    colours = [colors.hsv_to_rgb((0, 1, i/256)) for i in range(0, 256)]
    plt.bar(range(0, 256), histr, color=colours, edgecolor=colours, width=1)
    plt.title('Value')

show_hsv_hist(hsv)

# Blur image slightly
image_blur = cv2.GaussianBlur(image, (7, 7), 0)
show(image_blur)

Ошибка:

Traceback (most recent call last):
  File "C:\Users\abim\Desktop\im_pro\python\5Aralık.py", line 51, in <module>
    show_rgb_hist(image)
  File "C:\Users\abim\Desktop\im_pro\python\5Aralık.py", line 47, in show_rgb_hist
    plt.bar(range(0, 256), histr, color=colours, edgecolor=colours, width=1)
  File "C:\Users\abim\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\pyplot.py", line 2459, in bar
    **({"data": data} if data is not None else {}), **kwargs)
  File "C:\Users\abim\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\__init__.py", line 1810, in inner
    return func(ax, *args, **kwargs)
  File "C:\Users\abim\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\axes\_axes.py", line 2296, in bar
    label='_nolegend_',
  File "C:\Users\abim\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\patches.py", line 658, in __init__
    Patch.__init__(self, **kwargs)
  File "C:\Users\abim\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\patches.py", line 87, in __init__
    self.set_linewidth(linewidth)
  File "C:\Users\abim\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\patches.py", line 348, in set_linewidth
    self._linewidth = float(w)
TypeError: only size-1 arrays can be converted to Python scalars

Может кто-нибудь сказать мне, в чем проблема?Он также работает на ноутбуке Jupyter, но почему бы не использовать Eclipse Ide для Python и Python?Большое спасибо ..

1 Ответ

0 голосов
/ 06 декабря 2018

pyplot bar API нужен массив «высот» в качестве второго аргумента для построения столбцов в направлении y, но ваша гистограмма имеет больше измерений.

Попробуйте код ниже.

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.plot(histr, color=c)

        histList = iter(list(histr)) #Expand to 256 elements
        heights = [x[0] for x in histList] #Compose "height" values
        plt.bar(range(0, 256), heights, color=colours, edgecolor=colours, width=1)

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