我希望你能帮助我。
我正在 Android 中拍照,生成缩略图,然后使用此缩略图分析像素以获得最常用的色调。
我认为使用 RGB 很难对它们进行分组,所以我将每个像素颜色都变成了 HSV 颜色。如您所见,我使用 Float3,因此它hsv.x
与hsv.h
、hsv.y
ishsv.s
和hsv.z
equals相同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 所指出的,这是一个人类问题,最常用的颜色并不意味着最相关的颜色。这就是为什么这个工具不需要完美,只是为了避免在选择完全不适合包装的颜色时失败。