MATLAB灰度12位到8位

时间:2015-01-25 18:43:34

标签: image matlab image-processing

我正在尝试创建一种算法,将灰度从12位转换为8位。

我得到了像这样的灰度:

enter image description here

比例用矩阵表示。问题是,用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));

销毁意味着,新列现在是黑色

1 个答案:

答案 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,是您在测试输入上运行上述代码时我们所期望的。