本文介绍数字图像的位深概念。

成像数据本质上就是由数字组成的一个矩阵。我们采集到的成像数据,如果不断放大,就会看到一个一个像素。这些像素的亮暗,或者颜色的深浅,就代表了这个像素位置的数值大小。

如上图,显示了每个像素位的具体数值,并更换了伪彩。可以看到,图像中的像素值,一般都是正整数。像素值的范围就是图像的位深。

一般而言,我们采集到的数据以 8-bit 和 16-bit 两种位深居多。 8-bit位深就意味着在电脑中,使用8个bit的空间来存储这个像素值,所以此时这个像素值的范围是 $0 \sim 2^8-1$ (0~255)。类似的, 16-bit的图像,像素值范围在 $0 \sim 2^{16}-1$ (0~65535)。

显然,更高的位深,能够以更高的精度表示图像的细节。但是同时也会消耗更多的存储空间。同时也需要强调,像素值的范围本质上是由相机(例如sCMOS,EMCCD)决定的。相机是一些小传感器组成的二维阵列。受制作工艺和材料特性影响,这些小传感器能够检测的光信号强度是有一定范围的。而计算机的作用就是将相机收集的真实信号,按照指定的位深线性变换为数字图像。

所以需要对图像数据进行分析时,一定要注意让自己感兴趣的信号不要欠曝或者过曝。因为欠曝光时,一方面信号很弱的区域的像素值直接为0,另外一方面欠曝信号之间的数值精度也变差(例如1.4和1.1都会变成1)。而过曝时,过曝的信号像素值都会变成255(以8-bit位图为例)。

下方为ImageJ的宏脚本,用于提取位图的数值并保存到表格中。要想获得像素的值,就先需要告诉程序这个像素的位置。而像素的位置,就是需要按照维度描述其具体坐标。这里是一个 xy 二维图像,所以这个像素坐标是 (x, y)。以此类推,如果是一个 xyzct 的数据,则需要使用 (x, y, z, c, t) 来描述一个像素了。

// ImageJ Macro for Gray Value Extraction
for (x = 0; x < 200; x++) {
    for (y = 0; y < 200; y++) {
        v = getPixel(x, y);
        setResult(x, y, v);
    }
}
最后修改:2024 年 06 月 23 日
请大力赞赏以支持本站持续运行!