我使用 BufferedImage
来保存 10 x 10 的图像样本。对于这个图像,我想找到代表该图像的近似平均颜色(作为 Color
对象)。目前我对于如何实现这个功能有两个想法:
- 将图像的缩放实例制作为 1 x 1 大小的图像,并查找新创建的图像的颜色作为平均颜色
- 使用两个 for 循环。最里面的用于对每行进行平均,辅助 for 循环用于对每行逐像素进行平均。
我真的很喜欢第一个解决方案的想法,但我不确定它有多准确。第二种解决方案将尽可能准确,但它看起来非常乏味。我还相信 getColor
命令在大规模上是处理器密集型的(例如,我平均每秒执行此操作大约 640 到 1920 次),如果我错了,请纠正我。由于此方法将非常占用 CPU 资源,因此我想使用相当有效的算法。
最佳答案
这取决于你所说的平均值是什么意思。如果一半像素为红色,一半像素为蓝色,那么平均值会是紫色吗?在这种情况下,我认为您可以尝试将所有值相加,然后除以您拥有的像素数。
但是,我怀疑您想要的不是平均色,而是主色?
在这种情况下,一种替代方案可能是将颜色离散为“桶”(例如以 100 为间隔,或者在极端情况下更稀疏,只有 3 个,一个用于红色,一个用于绿色,一个用于蓝色),并且创建直方图(带有计数的简单数组)。然后,您将取出计数最多的桶。
要小心想法 1。请记住,缩放通常是通过采样进行的。由于您的图像非常小,因此您已经丢失了很多信息。进一步缩小可能只会采样几个像素,而不是真正平均所有像素。最好检查一下您的缩放过程正在使用什么算法。
关于java - 查找图像的平均颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13328619/