我正在尝试创建一种算法,将灰度从12位转换为8位。
我得到了像这样的灰度:
比例用矩阵表示。问题是,用1/16的简单乘法会破坏第一个灰色列。
这里是Codeexample:
in =[
1 1 1 3 3 3 15 15 15 63 63 63;
1 1 1 3 3 3 15 15 15 63 63 63;
1 1 1 3 3 3 15 15 15 63 63 63;
1 1 1 3 3 3 15 15 15 63 63 63
];
[zeilen spalten] = size(in);
eight = round(in/16);
imshow(uint8(eight));
销毁意味着,新列现在是黑色
答案 0 :(得分:2)
简单地重新缩放图像,以便将每个元素除以对应于12位(或2^12 - 1 = 4095
)无符号整数的最大可能强度,然后乘以对应于8-的最大可能强度位无符号整数(或2^8 - 1 = 255
)。
因此:
out = uint8((255.0/4095.0)*(double(in)));
您需要强制转换为double
以确保在执行此缩放时保持浮点精度,然后转换为uint8
以确保图像类型为8位。您已巧妙地推断出此缩放因子大致为(1/16)(自255.0/4095.0 ~ 1/16
起)。但是,测试图像的输出将有前6列肯定为零,因为12位图像的强度为1和3太小而无法以等效的8位形式表示,这就是它得到的原因向下舍入为0.如果您考虑一下,对于12位图像,每增加16次强度增加,这会对8位图像的等效单次强度增加,或者:
12-bit --> 8-bit
0 --> 0
15 --> 1
31 --> 2
47 --> 3
63 --> 4
... --> ...
4095 --> 255
因为1和3的值不够高,无法达到下一级别,所以这些值会向下舍入为0.但是,15的值会映射到1,而63的值会映射到4,是您在测试输入上运行上述代码时我们所期望的。