假设我有一个标量信息分配给 2D
的每个像素长方形 R
,例如灰度图像,或深度图/凹凸图。
这样的标量信息在 8 bit
中规范编码图像,它允许 2^8=256
不同的音调。方便的是,这里的音调具有非常直观的含义,例如white=0
, black=1
, gray=somewhere between 0 and 1
.
保存图像后,例如在 .png 中,音调 t
, 0 <= t <= 255
, 在 RGB
中编码颜色 [t,t,t]
(每个像素浪费 16bit
)。
问题:
比如说,8 bit
提供的分辨率灰度不足以满足我的目的。
是否有既定的方法来无损编码 24bit
(1D) 信息到 RGB
颜色空间保留颜色的一些直观含义?
最佳答案
您可能需要考虑 Hilbert curve .这是将一维曲线嵌入到更高维(2、3 或更多)空间中。
这是将一维曲线映射到二维颜色空间时的样子。白色曲线有 2^16 = 65,536 个点,嵌入到 2^8 x 2^8 = 256 x 256 维颜色空间中。曲线上任意两个相邻点都非常相似。
虽然我手头没有代码,但可以将其概括为将曲线嵌入三个维度。如果您愿意,我可以提供生成此图的 Matlab 代码,但我不相信它会有很大帮助...
这是您通过图像中的希尔伯特曲线最终得到的色标。不是很直观,但确实涵盖了所有 65,536 种颜色。
编辑 - 这是代码
function [x,y] = d2xy(n,d)
# D2XY Embeds a point d into an n*n square (assuming n is a power of 2). For
# example, if n = 8 then we can embed the points d = 0:63 into it.
x = uint32(0);
y = uint32(0);
t = uint32(d);
n = uint32(n);
s = uint32(1);
while s < n
rx = bitand(1, idivide(t, 2));
ry = bitand(1, bitxor(t,rx));
[x,y] = rot(s,x,y,rx,ry);
x = x + s * rx;
y = y + s * ry;
t = idivide(t, 4);
s = s * 2;
end
end
function [x,y] = rot(n,x,y,rx,ry)
if ry == 0
if rx == 1
x = n-1-x;
y = n-1-y;
end
# Swap x and y
t = x; x = y; y = t;
end
end
b = zeros(65536, 2);
for d = 0:65535
[x,y] = d2xy(256, d);
b(d+1,1) = x;
b(d+1,2) = y;
end
plot(b(:,1), b(:,2)), xlim([-1,256]), ylim([-1,256]), axis square
关于image - 24位色一维信息的一致内存方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15782586/