当前位置: 首页 > 面试题库 >

Python-查找图像中的主要/最常见颜色

禄烨然
2023-03-14
问题内容

我正在寻找一种使用python查找图像中最主要的颜色/色调的方法。普通的阴影或最普通的RGB都可以。我看过Python
Imaging库,找不到任何与我在他们的手册中所寻找的内容有关的内容,也没有对VTK进行过简短的了解。

但是,我确实找到了可以满足我需要的PHP脚本(在此处需要登录才能下载)。该脚本似乎将图像大小调整为150 * 150,以显示主要颜色。但是,在那之后,我相当失落。我确实考虑过编写一些可以将图像调整为较小尺寸,然后检查其他每个像素的图像的方法,尽管我认为这样做效率不高(尽管将这种想法实现为C
python模块可能是一种想法)。

但是,尽管如此,我还是很困惑。所以,我转向你。是否有一种简单有效的方法来查找图像中的主色。


问题答案:

这是使用Pillow和Scipy的cluster软件包的代码。

为简单起见,我将文件名硬编码为“
image.jpg”。调整图像大小是为了提高速度:如果您不介意等待,请注释一下调整大小调用。当在此蓝胡椒样本图像上运行时,通常会说主要颜色是#d8c865,它大致对应于两个胡椒左下角的浅黄色区域。我说“通常”是因为所使用的聚类算法具有一定程度的随机性。您可以通过多种方式更改此设置,但出于您的目的,它可能非常适合。(如果需要确定的结果,请检查kmeans2()变体上的选项。)

from __future__ import print_function
import binascii
import struct
from PIL import Image
import numpy as np
import scipy
import scipy.misc
import scipy.cluster

NUM_CLUSTERS = 5

print('reading image')
im = Image.open('image.jpg')
im = im.resize((150, 150))      # optional, to reduce time
ar = np.asarray(im)
shape = ar.shape
ar = ar.reshape(scipy.product(shape[:2]), shape[2]).astype(float)

print('finding clusters')
codes, dist = scipy.cluster.vq.kmeans(ar, NUM_CLUSTERS)
print('cluster centres:\n', codes)

vecs, dist = scipy.cluster.vq.vq(ar, codes)         # assign codes
counts, bins = scipy.histogram(vecs, len(codes))    # count occurrences

index_max = scipy.argmax(counts)                    # find most frequent
peak = codes[index_max]
colour = binascii.hexlify(bytearray(int(c) for c in peak)).decode('ascii')
print('most frequent is %s (#%s)' % (peak, colour))

注意:当我将聚类的数量从5扩展到10或15时,结果通常是绿色或蓝色。给定输入图像,这些结果也是合理的……我也无法确定哪种颜色在该图像中真正占主导地位,因此我也不会对算法提出批评!

还有一点好处:仅使用N种最常用的颜色保存缩小尺寸的图像:

# bonus: save image using only the N most common colours
import imageio
c = ar.copy()
for i, code in enumerate(codes):
    c[scipy.r_[scipy.where(vecs==i)],:] = code
imageio.imwrite('clusters.png', c.reshape(*shape).astype(np.uint8))
print('saved clustered image')


 类似资料:
  • 问题内容: 在Python列表中查找最常见元素的有效方法是什么? 我的列表项可能无法散列,因此无法使用字典。同样在绘制的情况下,应返回索引最低的项目。例: 问题答案: 提出了这么多解决方案,令我惊讶的是没有人提出我认为显而易见的解决方案(对于不可哈希但可比较的元素)-。 提供快速,可重用的功能,并允许你将一些棘手的逻辑委托给经过良好测试的标准库组件。考虑例如: 当然,这可以写得更简洁一些,但我的目

  • 本文向大家介绍在Python的2D列表中查找最常见的元素,包括了在Python的2D列表中查找最常见的元素的使用技巧和注意事项,需要的朋友参考一下 2D列表具有列表作为其元素。换句话说,它是一个列表列表。在本文中,我们需要找到列表中所有列表中最常见的元素。 随着最大和计数 我们设计一个条件为in的跟随项,以检查给定子列表中元素的存在。然后,我们将max函数与count函数一起使用以获取具有最大频率

  • 问题内容: 假设我有一个具有属性X的表A,如何找到出现次数最多的X?(可以有多个出现次数最高的事件) 即表A 我想回来 我不能在Sqlite中使用关键字ALL,所以我很茫然。 我想到了获取每个X的计数,然后对其进行排序,然后以某种方式使用ORDER BY DESC,以使最大数位于顶部,然后与LIMIT进行比较,以检查第一个元组以下的值是否相等(这意味着它们只是一样),但我不确定LIMIT语法以及是

  • 问题内容: 我有看起来像这样的数据: 我想要一个函数,该函数根据我选择的movie_id返回注释中最常用的词。因此,如果我查询movie_id = 1,则会得到: 如果我查询movie_id = 2,则会得到: 我看到了一些使用tsql的解决方案,但我以前从未使用过,也不了解代码。寻找一种在sqlite3中做到这一点的方法。 问题答案: 您可以使用一个非常丑陋的查询来执行此操作。 这是未经测试的。

  • 我正在编写一个方法,尝试在缓冲区图像中查找颜色。目前,该方法的工作原理是取一个屏幕盖,然后扫描图像以寻找特定的颜色。现在我想添加一些RGB公差,因此如果用户试图找到公差为1的颜色(1,3,5),任何颜色-1 R,B或G都将返回true。 我可以通过首先生成一个有效的RGB值数组列表来解决这个问题,然后对于每个像素,我可以遍历数组并检查每个值。问题是对于大图像的高公差,这可能会变得非常慢。 有没有更

  • 问题内容: 我正在尝试从图像中提取红色。我有应用阈值的代码,仅保留指定范围内的值: 但是,正如我检查的那样,红色的色相值可以在0到10的范围内,也可以在170到180的范围内。因此,我想保留这两个范围中任何一个的色相值。我尝试将阈值从10设置为170并使用函数,但随后我也获得了所有白色。我认为最好的选择是为每个范围创建一个遮罩并同时使用它们,因此我必须以某种方式将它们合并在一起,然后再继续。 有没