我希望有效且快速地计算出图像中最主要的颜色。占优势是指大多数像素中存在的颜色。在尝试实现这一点时,我很快发现最大的瓶颈在于循环显示图像中的大量像素。为了优化这一点,我尝试重新缩放图像,我注意到当我重新调整图像时,主色变得越来越突出。它还大大提高了我的算法性能,因为我分析的像素数量大大减少了。重新缩放有点贵,但如果完成一次并缓存,我就可以忍受它。
我对堆栈溢出社区的问题是这样重新缩放的安全性如何?我担心我的交易准确性非常高。它似乎工作正常,但我希望得到专家的反馈。不打算写论文或创建下一个照明快速图像处理算法,只需要它工作并且合理有效。
答案 0 :(得分:1)
就性能成本而言,降尺度算法将是最昂贵的操作。假设您的输入图像是方形图像,为简单起见,尺寸为AxA
,输出图像的尺寸为BxB
,您通常会这样做:
B
A
假设您正在使用一个简单的下采样机制(即:抽取或丢弃每个n
第一行/列等),这个成本会大大降低。通过使用更简单的下采样方法,您可以权衡性能(更少的内存,更少的CPU周期等)。
对于您的问题:下采样正在影响主色:
从下采样图像生成的指标不太准确,但不一定精确。这就是它。
与使用除简单抽取之外的任何方法重新取样相比,计算图像中的主色相比相当便宜。假设甚至像具有24位颜色深度的图像,现代64位PC最多将使用2^24 * (64bits / 8bits-per-byte) = 134217728 bytes
内存。你可以只分配一大块内存并实现一个简单的直方图。您只需执行A*B
个加法运算和另一个A*B
比较,因此它具有线性执行复杂性和恒定的内存复杂性。
答案 1 :(得分:-1)
我不知道你在做什么缩放,但通常在抽取或移除像素以调整大小之前,会在图像上传递低通滤镜。不需要首先过滤,并且可以通过直接从未处理的图像中选择性地和均匀地挑选像素来完成有效的重新调整大小。过滤器可以防止信息丢失,因此调整大小越小,只会导致整个图像的平均值达到一个像素。
一般来说,要获得主导颜色,我会在图像中取出灰色(留下三个维度中的两个),然后仅使用在某个百分比或阈值以上饱和的像素(如max(R,G,B)) - min(R,G,B)> 256比特彩色图像中的20个像素)创建色调的直方图。假设垃圾箱不是太小,垃圾箱中最大的数量是主要颜色。
也许只是对色调进行直方图而不做其他任何事情,但这假设没有灰色就是色噪声。
可能只是直方图的色调和饱和度维度,但这通常会导致容量太小。
也许只是直方图(max(R,G,B) - min(R,G,B)),虽然得到的直方图峰值可能模糊不清(或展开一些),但这通常有效。 ...但它忽略了色调并需要采样来确定它