将RGB光谱绘制成2D颜色矩阵?

4
任何关于如何将RGB颜色空间绘制为2D矩阵的建议?我需要一个理论上的描述;代码示例或伪代码会很有帮助,但不是必需的。谢谢!

我在思考这个问题时遇到了困难。我感觉需要三个维度,一个用于每个颜色通道。但如何将其压缩成两个维度呢?这可能是一个愚蠢的问题,但如果有人能指点我一下,我将不胜感激! - Joseph Weissman
4个回答

5
如果你想在2D网格中表示RGB空间中的每种颜色,那么很可能无法避免结果中的不连续性/尖锐边界。但是一些映射技术看起来比其他技术更好。
来自Possiblywrong.wordpress.com帖子allRGB:Hilbert曲线和随机生成树的示例:
  • 通过二维(12阶)Hilbert曲线遍历图像的像素,同时通过三维(8阶)Hilbert曲线遍历RGB颜色立方体,依次为每个像素分配相应的颜色 hilbert RGB 3D->2D

  • “广度优先遍历像素的随机生成树,按照Hilbert曲线顺序分配颜色。” Breadth-first traversal of random spanning tree of pixels, assigning colors in Hilbert curve order.

也请查看allrgb.com,"allRGB的目标很简单:创建具有每个RGB颜色(16777216)一个像素的图像;没有遗漏的颜色,也没有重复的颜色。"


2
还要看看 Stack Exchange 的 Programming Puzzles & Code Golf 上的“Images with All Colors”挑战中的 40 个独特提交(带源代码!)。请访问:http://codegolf.stackexchange.com/questions/22144/images-with-all-colors。 - Mac Cowell

2

如果你不想失去任何信息,那么你需要使用三个维度进行存储。但如果可以丢失一些维度的信息,那就很容易了。只需按照以下方式操作:

// or HSV
int [256*256][256] colorMatrix;
for (int r = 0; r < 256; r++) {
    for (int r = 0; r < 256; r++) {
        for (int r = 0; r < 256; r++) {
            colorMatrix[256*r+g][b] = color(r, g, b);
        }
    }
}

这确实是太多的信息要压缩到二维空间中了。我们选择蓝色代表“更完整”的原因是什么?人类视觉系统是否会以不同的方式处理蓝色?只是好奇,点赞并接受答案。 - Joseph Weissman
1
@Joe:没有任何理由。多维数组实际上只是一维数组的语法糖,可以像这样访问:arr[r*(256*256)+g*256+b]或者arr[(r*256+g)*256+b] - Lie Ryan

1

以下是我基于将色调匹配到角度,亮度和饱和度匹配到图像中心距离的实验。我无法找到一种同时避免不连续性、抖动和波纹的方法(原始图片链接):

enter image description here


1

对于二维来说,其实并没有一个很好的答案,因为你真正需要的是三个维度。当然,你可以将三维空间投影到二维上,但为了保留足够的信息量,你几乎需要提供正常的三维操作,这样你才能从不同的角度看到投影。


1
@Joe:MS Paint的颜色选择器就是一个例子。你一次只能看到一个二维矩阵(在MS Paint中是色调和饱和度),并且有一个滚动条来选择第三个维度(在MS Paint中是亮度/值)。要想同时看到所有颜色,需要一个能够显示16777216像素的屏幕(作为参考:1024*768屏幕一次可以显示786432像素)。或者你可以使用半透明的立方体,但这会导致颜色混杂不清。 - Lie Ryan
1
@Joe:你不需要尝试将3D投影透明化,相反,你只需要显示体积的2D“切片”。 - Jerry Coffin
1
HSV和HSL都基本上定义了锥形体积。最常见的显示是沿着锥体轴线的圆形。这种方式对于选择单个颜色来说还算可以,但不太适合整体可视化颜色空间。一个值得查看的页面是:http://www.gamutvision.com/docs/gamutvision_equations.html - Jerry Coffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接