从图像中获取主要颜色,丢弃背景。

9

什么是提取图像主要颜色的最佳算法(结果而非性能)。该算法应丢弃图像的背景。

我知道我可以构建一个颜色数组以及它们在图像中出现的次数,但我需要一种确定什么是背景和什么是前景的方法,并在读取主要颜色时只保留第二个(前景)。

这个问题非常困难,特别是对于渐变背景或具有图案的背景(不是纯色的情况)。

4个回答

8

本回答不涉及将前景与背景分离,但是...

我发现对图像应用像素化滤镜可以提取出一组非常好的“平均”颜色。

之前

before

之后

enter image description here

我有时使用这种方法来推导出具有特定情绪的颜色调色板。我首先找到一张具有我需要的一般色调的照片,像素化,然后从结果图像中取样。
(感谢Pietro De Grandi提供的图片,可在unsplash.com上找到)

我知道这个技巧,但这不是我问题的答案。以上方法最简单的方式是: @product = Product.find(params[:id]) @image = Magick::ImageList.new(@product.photo.path) @image = @image.quantize(quantisation_level) - astropanic
1
@Drew:像这样的像素化基本上只是将像素平均分成块,因此它并不能真正回答这个问题。 - MusiGenesis
@MusiGenesis -- 我确实指出它无法从背景中找到前景(我的回答的第一句话),但它是从图像中找到主要颜色的简单而有用的方法(问题的第一句话)。 - Drew Noakes
所有链接,包括此答案中的图片都消失了!!!而且没有任何解释这个“方法”到底是做什么的。显然,作者是故意这样做的,因为通过stackoverflow上传图片的默认方法不会消失... - gregoiregentil
@gregoiregentil,回到2009年,没有办法将图片附加到帖子上。我不欣赏你的攻击。 - Drew Noakes
答案已更新以修复损坏的链接。 - Drew Noakes

6
颜色摘要生成器是一个关于此主题的非常好的信息来源,更不用说他们似乎免费提供XML Web API,可以为您选择的图像生成描述性颜色统计数据,以HTML格式或XML格式呈现以下格式的色块...

  • 我的图像的平均颜色色调、饱和度和明度是什么?
  • 最能代表图像的RGB颜色是什么?
  • RGB和HSV直方图是什么样子的?
  • 图像的可读颜色描述是什么(例如深纯蓝色)?

此实用程序的目的是生成元数据,概括图像的颜色特征,以便将其包含在图像数据库中,例如Flickr。特别地,此工具正在用于为Flickr的Color Fields组生成元数据。

enter image description here

但根据我的经验,这个工具还是经常错过“人类可读”/明显的“主要”颜色。傻瓜机器!


5
我觉得这个问题更接近“不可能”而不是“非常困难”。我能想到的唯一方法是假设图像的背景很可能由相似颜色的实心块组成,而前景很可能由较小的不同颜色块组成。
如果这个假设普遍成立,那么你可以扫描整张图片,并根据像素与相邻像素的相似程度对其进行加权。换句话说,如果一个像素的邻居(在某个任意半径内)都是相似的颜色,你就不会将该像素纳入整体估计中。如果邻居往往是非常不同的颜色,你就会加重该像素的权重,比例可能与差异程度成正比。
这种方法可能不完美,但肯定会排除大量相似颜色的区域。

1
就我所知的图像处理算法而言,没有一种确定的方法来获取“前景”,只能获取对象之间的边界。您可能需要使用平均值或提出的数组计数方法。在这种情况下,您将希望给具有更高饱和度的颜色赋予更高的“分数”,因为它们更加突出。

如果前景清晰,背景稍微模糊,那么原始图像中有足够的信息来确定前景和背景。话虽如此,我不确定具体该如何实现 :) - Drew Noakes
可以实现,但需要两张或两张以上的立体图像或深度图。 - aviraldg

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