1

假设我有一个标量信息分配给2D矩形的每个像素R,例如灰度图像或深度图/凹凸图。

在此处输入图像描述

这样的标量信息被规范地编码在8 bit图像中,这允许2^8=256不同的色调。方便的是,这里的音调具有非常直观的含义,例如white=0, 。black=1gray=somewhere between 0 and 1

一旦图像被保存,例如在 .png 中,色调t, 0 <= t <= 255, 将被编码为RGB颜色[t,t,t](这会浪费16bit每个像素)。


问题: 说,灰度提供的分辨率8 bit不足以满足我的目的。

是否有既定的方法可以将24bit(1D)信息无损编码到RGB颜色空间,保留颜色的一些直观含义

4

3 回答 3

4

您可能需要考虑Hilbert 曲线。这是将一维曲线嵌入到更高维(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
于 2013-04-03T09:51:23.230 回答
0

HSV 或 HSI 颜色空间正是您要寻找的: http: //www.mathworks.com/help/matlab/ref/rgb2hsv.html HSI 表示色调、饱和度和照度或强度。色调给出了颜色频率,表示颜色非常直观

于 2013-04-03T09:24:04.577 回答
0

我认为您可以量化为 8,即将强度 / 8 分配为等于 3 种颜色(您会得到灰色)并将剩余位(强度 % 8)添加到分离的 R、G、B 的 LSB。我们可以做一个本地添加。类似的东西(未经测试但已编译)

int convert(int N) {

    int Q = N / 8,  //  Q + Z == N
        Z = N % 8;

    int R = (Q >>  0) & 0xFF,
        G = (Q >>  8) & 0xFF,
        B = (Q >> 16) & 0xFF,
        S = R + ((Z >> 0) & 1),
        H = G + ((Z >> 1) & 1),
        C = B + ((Z >> 2) & 1);

    return (S << 0) + (H << 8) + (C << 16);
}
于 2013-04-03T11:39:51.910 回答