我正在阅读有关HSV直方图的一些文档,在几个参考文献中,饱和度通道被量化为256个值。这是为什么?选择这个号码有什么理由吗? 我对Hue通道有相同的问题,通常它被量化为180个值。
答案 0 :(得分:4)
免责声明:副手答案(即没有任何文档备份):
“256”是bin大小的常用数字,因为程序员喜欢Round Numbers - 它适合单个字节。和“180”因为HSB圆是“360 [度]”,但“360”不适合单个字节。
对于许多图像格式,RGB值的范围限制为每通道0..255 - 总共3个字节。为了存储相同数量的数据(忽略转换为另一种颜色模型的任何工件),饱和度和亮度通常也以单个字节表示。通过将原始范围0..359(因为Hue通常表示为HSB色轮上的度数值)缩放到0..255的字节范围内,可以对Hue进行相同的操作。但是,可能因为使用接近原始360°整圆的数字进行计算更容易,范围被限制为0..179。这样,值可以存储到单个字节中(因此“HSB”使用与“RGB”一样多的内存)并且可以简单地转换回(接近)其原始值 - 乘以2.显然,坚持存储空间胜过保真度。
给定S和B的256个值,以及H的180个值,最终得到的颜色空间为256 * 256 * 180 = 11,796,480种颜色。要检查颜色数量,可以构建一个histogram:一个数组,您可以在其中读出特定颜色或颜色范围内的总像素数。在这里使用颜色范围而不是实际值,可以显着降低内存需求。
对于RGB彩色图像,颜色分布相当均匀,您可以将每个通道向下移动一定数量的位。这就是从24位“真彩色”RGB到15位RGB“高色”空间的直接转换如何工作:每个通道除以8,将256个值减少到32(每个通道5位)。转换为16位高色RGB空间的工作方式相同;在15位转换中遗留的位被分配给绿色。因此,绿色的颜色范围加倍,这是有用的,因为人眼对于绿色阴影比对其他两个原色更敏感。
当输入图像中的颜色不均匀分布时,它会变得更复杂。一个天真的解决方案是创建一个[256] [256] [256]的数组,将全部初始化为零,然后用图像的颜色填充数组,最后对它们进行排序。有更好的选择 - 让我在这里咨询我的旧计算机图形 [1] 。坚持下去。
13.4再现颜色提到了Heckbert的两种不同方法的名称(帧缓冲显示的彩色图像量化,SIGGRAPH 82):流行度和中值切割算法。 (不幸的是,这就是他们对这个话题所说的全部内容。我认为两者的有效代码都可以用Google搜索。)
粗略猜测:
每个垃圾箱(H,S,B)的大小应该反映在您尝试使用它的位置。例如,This older SO question使用较大的bin来 hue - 颜色被认为是最重要的 - 并且饱和度和亮度只有3个不同的值。因此,带有一些柔和区域(例如漫画书)的明亮图像将在此直方图中得到很好的传播,但真彩色照片不会那么多。
主要限制是,相互之间相乘的纸盒尺寸应使用相当少量的内存,但要覆盖足够的每个组件以均匀填充。也许一些反复试验在这里发挥作用。您最初可以在直方图中的可用内存上均匀分布所有H,S和B分量,并处理图像的一小部分;比如,4个像素中的1个,水平和垂直。如果您注意到其中一个组件箱在其他区域保持不变的情况下填满,请调整范围并重新启动。
如果您需要对多张图片进行分析,请确保它们的色域都相同。你不能指望一个合理的bin大小来处理所有种类的图像;你最终会得到均匀的分布,所有的匹配都是如此。
[1] 计算机图形学。原则与实践。(1997)J.D。Foley,A。van Dam,S.K。 Feiner和J.F. Hughes,第二版,Reading,MA:Addison-Wesley。