Python-如何将数组从图像转换为集合?

时间:2016-05-08 15:30:25

标签: python arrays numpy set tuples

好的,所以这是我的代码

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'

所以,是的,是的。我做错了什么?

1 个答案:

答案 0 :(得分: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