【发布时间】:2018-04-21 18:28:25
【问题描述】:
假设我有以下图片:
以下“参考”颜色是静态的,不是从图像中确定的(RGB 格式)
- [90, 160, 155]
- [245, 210, 110]
- [20,20,20]
- [150, 150, 120]
我如何获得一个返回对象,该对象根据参考颜色告诉我图像中与参考颜色“最接近”的颜色百分比,返回值如下:
{
"colour1": 0.25, // These aren't the actual distributions, but the answer
"colour2": 0.1, // this is trying to represent is that 25% of the colour
"colour3": 0.6, // in the image is closest to "colour1", 10% of the
"colour4": 0.05 // image is closest to "colour2", etc.
}
有没有一种高效的方法来做到这一点,以便可以在几秒钟内为一张大图像返回一个结果,并带有十几种参考颜色?
答案不需要是精确的,10% 以内的近似值就可以了,所以如果大幅减小图片的大小是加快速度的方法,那就可以了。
我的第一个(而且很糟糕 - 只是为了快速验证概念)通过解决方案是:
- 循环遍历图片中的所有像素
- 遍历所有参考颜色
- 计算像素颜色和参考颜色之间的欧几里得距离
- 返回欧几里得距离最近的参考颜色
- 计算结果中每种参考颜色的出现次数,然后除以总像素数得到百分比
当然,这很慢
接下来的步骤,我一直在考虑尝试几种不同的选择:
使用 opencv 生成颜色直方图,并以某种方式使用其结果来获取每种参考颜色的百分比
使用 K-means 聚类,将参考颜色设置为质心,并使用其结果
但我想在深入研究之前先在这里询问一下,看看是否有人对去哪里有建议,或者更好的是,如果有一个简单的库可以轻松解决这个问题。
【问题讨论】:
-
你试过了吗?你遇到了什么问题?
-
对于每个颜色范围,使用
inRange函数,计算目标图像中所有非零像素,然后将该数字除以 src 图像中的总像素数。 -
到目前为止,我已经用我的方法/猜测更新了这个问题@mkrieger1
-
@zindarod - 我已经尝试过这个,但效果不佳。也许最好的解决方案就是将图像缩小到较小的尺寸并针对它运行此策略。
-
0) 在 0 处初始化 # 颜色直方图,1) 循环图像,2) 循环颜色,3) 找到最接近的颜色 4) 在最接近颜色索引的直方图中添加 1,5) 标准化 L1直方图,6)完成。我不明白这怎么可能需要超过 2 秒。在 python 中循环更慢......可能一些索引方法更快。但是 2 秒应该绰绰有余
标签: python opencv image-processing cv2