Ram*_*ami 5 colors image-processing hsv computer-vision
我正在阅读一些关于 HSV 直方图的文档,在几个参考文献中,饱和度通道被量化为 256 个值。这是为什么?选择这个号码有什么原因吗?我对 Hue 通道有同样的问题,通常它被量化为 180 个值。
免责声明:即兴回答(即,没有任何文件支持):
“256”是一个流行的bin大小数字,因为程序员喜欢整数——它适合单个字节。而“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 种颜色的色彩空间。要检查颜色的数量,您可以构建一个直方图:一个数组,您可以在其中读出特定颜色或颜色范围内的像素总数。在这里使用颜色范围而不是实际值,可以显着减少内存需求。
对于 RGB 彩色图像,颜色分布相当均匀,您可以将每个通道向下移动一定数量的位。这就是从 24 位“真彩”RGB 到 15 位 RGB“高彩”空间的直接转换的工作原理:每个通道除以 8,将 256 个值减少到 32(每个通道 5 位)。转换为 16 位高色 RGB 空间的工作原理相同;在 15 位转换中剩下的位被分配给green。因此,绿色的颜色范围加倍,这是有用的,因为人眼对绿色的色调比对其他两种原色更敏感。
它得到当输入图像中的颜色更复杂的不是均匀分布的。一个幼稚的解决方案是创建一个[256][256][256]的数组,全部初始化为零,然后用图像的颜色填充数组,最后对它们进行排序。有更好的选择——让我在这里查阅我的旧计算机图形 [1]。坚持,稍等。
13.4 再现颜色提到了 Heckbert(帧缓冲区显示的彩色图像量化,SIGGRAPH 82)的两种不同方法的名称:流行和中值切割算法。(不幸的是,这就是他们对这个主题所说的全部内容。我认为可以在谷歌上搜索两者的有效代码。)
粗略的猜测:
每个 bin (H,S,B) 的大小应反映在您尝试使用它的目的上。例如,这个较旧的 SO 问题对色调使用了一个大bin——颜色被认为是最重要的——并且饱和度和亮度只有 3 个不同的值。因此,带有一些柔和区域的明亮图像(例如漫画书)将在此直方图中提供良好的传播,但真彩色照片不会如此。
主要限制是 bin 大小彼此相乘,应该使用相当少量的内存,但覆盖每个组件的足够多以均匀填充。也许一些试错在这里发挥作用。您可以最初将所有 H、S 和 B 分量均匀分布在直方图中的可用内存上,并处理图像的一小部分;例如,水平和垂直方向的 4 个像素中的 1 个。如果您发现其中一个组件箱填满太快而其他组件保持不变,请调整范围并重新启动。
如果您需要对多张图片进行分析,请确保它们的色域都相同。您不能指望合理的 bin 大小适用于所有类型的图像;你最终会得到一个均匀的分布,所有的匹配都是一般的。
[1]计算机图形学。原则和实践。(1997) JD Foley、A. van Dam、SK Feiner 和 JF Hughes,第二版,马萨诸塞州雷丁:Addison-Wesley。