【发布时间】:2013-03-17 18:31:21
【问题描述】:
我希望你能帮助我。
我正在 Android 中拍照,生成缩略图,然后使用此缩略图分析像素以获得最常用的色调。
我认为使用 RGB 很难对它们进行分组,所以我将每个像素颜色都变成了 HSV 颜色。如您所见,我使用了 Float3,因此 hsv.x 与 hsv.h 相同,hsv.y 为 hsv.s 并且 hsv.z 等于 hsv.v。
scores 是一个int[] 数组,我在那里存储每个色调的像素数量。这个算法在寻找蓝色调(海蓝宝石、浅蓝色和深蓝色)时效果很好,但很难识别单色(它将它们移到黄色分数)和暖色(它“混淆”了橙色和黄色)。另外,作为最后一个问题,我不知道如何识别棕色(这是我认为我错过的最后一个“大颜色”。算法来了:
for (Float3 hsv: hsvs) {
if(hsv.y < 0.15)
{
if(hsv.z < 0.2)
scores[BLACK]++;
else if(hsv.z < 0.6)
scores[GREY]++;
else
scores[WHITE]++;
}
else if (hsv.x < 15f || hsv.x > 345f)
scores[RED]++;
else if (hsv.x < 40)
scores[ORANGE]++;
else if (hsv.x < 70)
scores[YELLOW]++;
else if (hsv.x < 120)
scores[GREEN]++;
else if (hsv.x < 160)
scores[AQUAMARINE]++;
else if (hsv.x < 200)
scores[LIGHT_BLUE]++;
else if (hsv.x < 240)
scores[DARK_BLUE]++;
else if (hsv.x < 300)
scores[PURPLE]++;
else
scores[PINK]++;
}
您认为我可以通过更改一些数字来改进算法,还是应该从不同的方法开始?
编辑:
让我把你放在上下文中。我的应用程序拍照,抓取一个方形缩略图(出于实际原因)并分析生成的图片。因为它是一个拇指,它会丢失一些细节和尺寸(比如我创建了 200x200 像素的拇指),所以在我的特殊情况下,总会有 40000 像素。我对这张图片所做的是检查最常用的色调。
在大多数情况下,我将它们定义为出现在 3000 像素以上的色调(约占图像的 7.5%)。我没有对它们进行排名,我只是检查了一些以任意颜色命名的复选框(可能是显示给您的颜色加上棕色)。然后,用户选中或取消选中他认为合适的颜色。事实上,正如 Geobits 所指出的,这是一个人类问题,最常用的颜色并不意味着最相关的颜色。这就是为什么这个工具不需要完美,只是为了避免在选择完全不适合包装的颜色时失败。
【问题讨论】:
标签: java android image-processing hsv