【问题标题】:Python- How to I turn an array into a set from an image?Python-如何将数组从图像转换为集合?
【发布时间】:2016-05-08 15:30:25
【问题描述】:

好的,这是我的代码

from PIL import Image
import cv2
import numpy

cam = cv2.VideoCapture(0)
s, im = cam.read() # captures image
pixels=tuple(numpy.asarray(im))
pixel=set(pixels)
colour=set([0, 51, 14],[0, 51, 15],[0, 51, 16],etc
pixel.symmetric difference(colour)

我希望能够将所拍摄图像的像素与我存储的像素列表进行对称差异(从两个列表/集合中获取所有相似的数字)。

我也知道我的颜色设置方法很垃圾/可能是错误的,但我一次只做一件事。

无论如何,我一直在尝试将像素/像素转换为列表或集合,但这不断出现

Traceback (most recent call last):
  File "C:\Users\Dave\Desktop\Listo.py", line 9, in <module>
    pixel=set(pixels)
TypeError: unhashable type: 'numpy.ndarray'

就像,是的。我做错了什么?

【问题讨论】:

  • asarray 似乎是多余的,它已经是一个 numpy 数组。您是否尝试先将其转换为Python list using tolist()?它仍然是列表(行)的列表,因此您可能应该首先将其重新调整为只有 1 行。
  • 您是否考虑过坚持使用 numpy 数组而不是集合,并使用 numpy 的矢量化 array set operations

标签: python arrays numpy set tuples


【解决方案1】:

这是来自解释器的示例记录。

>>> import cv2
>>> import numpy as np

首先我们读取图像。我使用静态图像,但VideoCapture 将返回相同的数据结构。已经是numpy.ndarray

>>> img = cv2.imread("test1.png")
>>> type(img)
<type 'numpy.ndarray'>
>>> img.shape
(76, 121, 3)

我们首先重塑图像,使其成为单行 BGR 像素。

>>> img = img.reshape(1,-1,3)
>>> img.shape
(1, 9196, 3)

然后我们使用tolist() 方法将ndarray 转换为Python 列表。我们可以看到它是两个嵌套列表,顶层列表包含行,第二层包含列(即像素)。

>>> img_list = img.tolist()
>>> len(img_list)
1
>>> len(img_list[0])
9196

为了能够散列像素,我们需要将它们转换为元组。 Python map 函数适用于此。我们已经拥有单行中的所有像素,所以我们使用它。

>>> img_tuples = map(tuple, img_list[0])
>>> len(img_tuples)
9196

现在我们可以创建一组像素。

>>> img_set = set(img_tuples)
>>> len(img_set)
5981

最后,您可以创建目标颜色集,再次使用元组来表示 BGR 三元组。

>>> colour=set([(0, 51, 14),(0, 51, 15),(0, 51, 16)])
>>> colour
set([(0, 51, 16), (0, 51, 15), (0, 51, 14)])

并求两者的对称差。

>>> img_diff = img_set.symmetric_difference(colour)
>>> len(img_diff)
5984

【讨论】:

    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2018-09-26
    • 2017-12-17
    相关资源
    最近更新 更多