gpt4 book ai didi

python - 图像的轮廓图给出 : TypeError Input must be 2D array error

转载 作者:太空宇宙 更新时间:2023-11-03 14:26:19 24 4
gpt4 key购买 nike

我正在使用 Debian Linux 和 python 2.7。
我正在读取图像并尝试处理它,但显示以下错误。有人可以告诉我我做错了什么吗?

import Image
import scipy
from scipy import ndimage
import matplotlib.pyplot as plt
import numpy as np
from scipy import misc
import scipy.misc

img = scipy.misc.imread("/home/subhradeep/Desktop/test.jpg")
array=np.asarray(img)
plt.figure(figsize=(10, 3.6))

plt.subplot(131)
plt.imshow(array, cmap=plt.cm.gray)

plt.subplot(132)
plt.imshow(array, cmap=plt.cm.gray, vmin=10, vmax=100)
plt.axis('off')

plt.subplot(133)
plt.imshow(array, cmap=plt.cm.gray)
plt.contour(array, [160, 211])
plt.axis('off')

plt.subplots_adjust(wspace=0, hspace=0., top=0.99, bottom=0.01, left=0.05,right=0.99)
plt.show()

我收到以下错误消息

Traceback (most recent call last):
File "1saveimg.py", line 22, in <module>
plt.contour(array, [160, 211])
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2632, in contour
ret = ax.contour(*args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 7976, in contour
return mcontour.QuadContourSet(self, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1414, in __init__
ContourSet.__init__(self, ax, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 860, in __init__
self._process_args(*args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1427, in _process_args
x, y, z = self._contour_args(args, kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1488, in _contour_args
x, y = self._initialize_x_y(z)
File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 1573, in _initialize_x_y
raise TypeError("Input must be a 2D array.")
TypeError: Input must be a 2D array.

我也试过 Image.open() 但这也引发了同样的错误。

最佳答案

这里的问题是 plt.contour 只绘制 2d 数组,但大多数 jpg 文件是 3d,因为有三种颜色。您通过使用灰度色图 (cm.gray) 进行绘图隐藏了这一事实,这只是改变了它的外观(imshow 仍然显示彩色图像,只是打印它灰色“墨水”)。您有几个选择,主要是:

1) 以某种方式将其转换为 2d,最简单的方法是将图像设为黑白(灰度)。以下是一些方法:

gray = img.sum(-1)  # sums along the last (color) axis

gray = np.sqrt((img*img).sum(-1)) # to do a magnitude of the color vector

from PIL import Image
img = Image.open("/home/subhradeep/Desktop/test.jpg")
gray = img.convert('L') # 'L' stands for 'luminosity'
gray = np.asarray(gray)

2) 分别绘制每种颜色:

r, g, b = np.rollaxis(img, -1)
plt.contour(r, cmap=plt.cm.Reds)
plt.contour(g, cmap=plt.cm.Greens)
plt.contour(b, cmap=plt.cm.Blues)

此外,

scipy.misc.imread 返回一个数组,所以你可以跳过 arr = np.asarray(img) 行,只使用 img 原样。如果您决定使用返回 PIL.Image 对象的 PIL.Image(因此能够使用 img.convert 方法)。

这样做是多余的,只需选择一个:

from scipy import misc
import scipy.misc

这里如果转换为灰度: gray

并且,如果您分别绘制每种颜色: rgb

关于python - 图像的轮廓图给出 : TypeError Input must be 2D array error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19835956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com