使用OpenCV和Python列出图像中的所有颜色列表

6

我是一名Python初学者,正在使用Python 3.6和OpenCV。我试图创建一个包含图像中所有颜色的RGB值列表。我可以使用cv2.imread读取一个像素的RGB值,然后使用image[px,px]来获取结果,它是一个NumPy数组。我想要的是图像中唯一颜色的RGB元组列表,但我不确定如何实现。希望得到任何帮助。

TIA


2
你尝试过朴素的方法吗?即循环整个图像并收集每个唯一的颜色(例如,保持一个列表/字典/任何已经看到的颜色)? - FlyingTeller
我不确定如何从数组转换为元组,所以我进行了搜索,显然tuple(a)(其中a是数组)会给出元组,哈哈(请原谅我,我刚开始学习Python)。因此,我现在正在尝试循环方法。同时,如果有人能分享更好的方法,那就太好了,因为我需要循环处理3000张图片,这可能需要很长时间。 - Kalyan M
1个回答

11

查看numpy的numpy.unique()函数:

import numpy as np

test = np.array([[255,233,200], [23,66,122], [0,0,123], [233,200,255], [23,66,122]])
print(np.unique(test, axis=0, return_counts = True))

>>> (array([[  0,   0, 123],
       [ 23,  66, 122],
       [233, 200, 255],
       [255, 233, 200]]), array([1, 2, 1, 1]))
你可以将RGB numpy数组收集到一个2D的numpy数组中,然后使用numpy.unique()函数和参数axis=0来遍历其中的数组。可选参数return_counts=True也会给出出现次数的数量。

谢谢!这个方法可行。我仍然需要循环整个图像和许多图像来获取数组,然后使用np.unique。 - Kalyan M
5
@KalyanM 这不是必要的。我没有验证过,但以下内容应该可以工作,因为cv2.imread()函数已经返回一个numpy ndarray: img = cv2.imread(path_to_img) 获取每个像素rgb的三维ndarray。 all_rgb_codes = img.reshape(-1, img.shape[-1]) 将3D数组按一维展平成我们需要的2D数组。 unique_rgbs = np.unique(all_rgb_codes, axis=0) 根据我的答案获取唯一颜色。 在使用前请测试和评估该方法是否有效。 祝您编程愉快 :) - iR0Nic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接