获取图像的主要色调

5
我正在制作一个太空壁纸分享画廊。我使用JavaScript库color-thief来获取图像的主要颜色,但是遇到了问题。大多数壁纸都很暗。如果用户在搜索壁纸时选择蓝色,例如#07F,他将无法得到许多具有此颜色的暗壁纸,因为这些壁纸的主要颜色接近黑色。
我可以允许使用多个主要颜色进行搜索(例如黑色和蓝色),但这会使搜索变得更加复杂。
是否有任何JavaScript库(必须在客户端完成)能够获取图像的主要色调?如果没有,您有任何关于如何实现算法的想法吗?
谢谢阅读 :)

请参见以下链接:http://stackoverflow.com/questions/13811483/getting-dominant-color-of-an-image?rq=1 - John Dvorak
我只需要找到主色的色相 https://dev59.com/22865IYBdhLWcg3wnPya - bkconrad
@bkconrad,根据OP的说法,你可以找到黑色的色调。实际上,一个好的想法是,在黑色之后找到最主要的颜色(也许还有白色)。 - Oleg V. Volkov
谢谢您的评论。Oleg的解决方案很有趣,我会考虑一下。 - Virus721
1
@OlegV.Volkov: 黑色或白色没有色调这一概念。#000001的色调与#0000FF#FEFEFF完全相同。黑色和白色根本没有色调。 - 6502
我会研究使用颜色进行图像分割。找到并测量图像具有的颜色区域。为此,我想您需要构建某种直方图并对其进行平滑处理,以便将类似的颜色视为相同。我以前做过灰度分割,但没有做过彩色分割,所以在这里无法提供更多帮助。然后,当您找到您的区域时,选择最大的区域,或使用其他算法来选择区域。也许是不接触边界的区域? - akonsu
1个回答

1

这更像是一个设计问题而不是JavaScript。占据最多像素的颜色并不总是占主导地位的颜色,而是吸引眼球的颜色。例如,如果你向某人展示一张黑色背景上的粉色星系图片,主导颜色不是黑色,而是粉色,因为主题颜色是粉色。因此,你需要一个比那个更复杂的算法。

此外,黑色和白色在技术上不是颜色,它们只是完全没有光或极端的高亮度(或光源)而已。因此,我会排除任何暗于或亮于预定义阈值的东西(例如,在计算中排除前5%和后5%)。

编辑:

我自己实际上可能会尝试获取饱和度最高的像素颜色(例如,超过X像素计数以避免由于噪声而产生错误的结果),并带有误差范围。

编辑2:

你可能可以更改 L155 以测试像素的饱和度和黑暗程度。你可能需要获得一个进行RGB->HSB转换的库来完成此任务,但我不知道是否有好的库可用。


谢谢你的回答!看起来和Oleg说的很相似。 - Virus721
在数字图像中,黑色和白色不是技术上的颜色并没有什么意义。我并没有深入研究这个颜色窃贼是如何工作的,但如果它没有执行任何颜色聚类,则从中获得的主导色调大多无用。其次,这里存在一些误解。没有理由只考虑主导色调,相反,您希望得到K个主导色调,因此搜索单个色调X将返回其中X出现在其K个主导色调列表中的图像。 - mmgp
@mmgp:只是想补充一下,我基本上同意使用K种主色调会是一种有效的策略。 :) - user234932
@bvukelic 将用户意图转换为数据甚至是考虑黑白实际上是颜色的更强理由,我不确定你在那个论点中要表达什么。 - mmgp
对于我的错误理解,我深表歉意。关于黑/白问题,您可能指的是一般言语中的黑色,它是一种大多数饱和度较低、亮度较低的颜色。而我所指的黑色和白色严格指的是#000和#fff,以及靠近这些值的非常小的亮度区域,因为真空中没有光源,也没有能够反射光线的粒子,所以大部分图像应该是纯黑色的,在这种情况下不应考虑这一点。 - user234932
显示剩余3条评论

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