从图像中提取主要/最常用的颜色
Posted
技术标签:
【中文标题】从图像中提取主要/最常用的颜色【英文标题】:Extracting Dominant / Most Used Colors from an Image 【发布时间】:2010-12-19 18:02:14 【问题描述】:我想提取图像中最常用的颜色,或者至少是主色调 你能推荐我如何开始这项任务吗?或指向我类似的代码?我一直在寻找它,但没有成功。
【问题讨论】:
您使用什么语言或框架? 答案在很大程度上取决于您的环境。 嗯,我考虑处理只是为了概念验证,然后将其转换为 python 进行批处理 如果您喜欢某个答案,您可以考虑单击向上箭头表示它很有用。如果您认为答案是您问题的解决方案,则应单击复选标记将其选为已接受的答案。 谢谢你,我不知道,我刚刚在这个很棒的社区注册!但我无法点击向上箭头,因为我的业力为零:( 【参考方案1】:使用Octree Color Quantization algorithm 可以获得非常好的结果。其他量化算法见Wikipedia。
【讨论】:
这正是我想要的!非常感谢! @dineshprasanna,不,我不能。如果 Google 无法帮助您,那么您可能需要使用链接中提供的信息自己编写。【参考方案2】:好吧,我假设您可以访问每个像素的 RGB 颜色。根据您的需要,有两种方法可以实现。
首先,您可以简单地创建所有像素的 R、G 和 B。像这样。
一个伪代码。
int Red = 0;
int Green = 0;
int Blue = 0;
foreach (Pixels as aPixel)
Red += aPixel.getRed();
Green += aPixel.getGreen();
Blue += aPixel.getBlue();
然后看看哪个更多。
这给你的只是图片更红、更绿或更蓝。
通过简单地创建每个 RGB 组合的直方图,另一种方法也可以为您提供组合颜色的静态(如橙色)。
一个伪代码。
Map ColorCounts = new();
foreach (Pixels as aPixel)
const aRGB = aPixel.getRGB();
var aCount = ColorCounts.get(aRGB);
aCount++;
ColorCounts.put(aRGB, aCount);
然后看看哪个计数更多。 您还可以降低颜色分辨率,因为常规 RGB 着色最多可以提供 670 万种颜色。
这可以通过将 RGB 设置为颜色范围来轻松完成。例如,假设 RGB 是 8 步而不是 256。
一个伪代码。
function Reduce(Color)
return (Color/32)*32; // 32 is 256/8 as for 8 ranges.
function ReduceRGB(RGB)
return new RGB(Reduce(RGB.getRed()),Reduce(RGB.getGreen() Reduce(RGB.getBlue()));
Map ColorCounts = new();
foreach (Pixels as aPixel)
const aRGB = ReduceRGB(aPixel.getRGB());
var aCount = ColorCounts.get(aRGB);
aCount++;
ColorCounts.put(aRGB, aCount);
然后你可以看到哪个范围的计数最多。
我希望这些技巧对你有意义。
【讨论】:
【参考方案3】:我同意 cmets - 编程解决方案肯定需要更多信息。但在那之前,假设您将获得图像中每个像素的 RGB 值,您应该考虑HSV colorspace,其中色调可以说是代表每个像素的“色调”。然后,您可以使用histogram 来识别图像中最常用的色调。
【讨论】:
注: “HSV 颜色空间”很可能是指“HSV 模式 RGB 模型”——HSV(及其兄弟双胞胎 HSL)是 RGB 颜色模型的失真;几乎所有提到 RGB 模型(或者错误地称为“RGB 颜色空间”)的人都在处理 CIE-XYZ'39 颜色 空间 中的值表示。没有试图专门挑剔你的答案,但你去吧。以上是关于从图像中提取主要/最常用的颜色的主要内容,如果未能解决你的问题,请参考以下文章