【问题标题】:How to interpret geotiff strip data with geotiff如何用 geotiff 解释 geotiff 条带数据
【发布时间】:2017-06-07 20:11:46
【问题描述】:

我正在编写需要读取 4 通道 geotiff 图像的代码,在本例中是 16 位图像(数据实际上是 12 位分辨率,但以 16 位编码)。

我的主要目标是读取像素值以供以后使用。 从这个问题"How 16bits-RGBA image pixels are interlaced?" 我尝试像这样使用 TIFFReadEncodedStrip 而不是 TIFFRGBAImage:

buf = (unsigned char*)(_TIFFmalloc(TIFFStripSize(tif)));
TIFFReadEncodedStrip(tif,strip,buf,(tsize_t)-1);
uint32 *p0 = buf;
printf("strip %d = %d \n", strip, *p0);

对于我打印的 p0 值,它应该是实际的图像数据,我得到了这个:

strip 0 = 20382000

检查我发现的图像中的标签:

Rows per strip: 1  
Samples per pixel: 4  
Bits per sample: 16 
Image orientation: 1 (bottom left)  
Size of buffer: 8 bytes

所以我的假设是我从缓冲区获得的 p0 值是图像第一个通道左上角的前四个像素。 我不明白的是我必须如何解释我得到的 p0 条的值。

在 matlab 中打开图像并检查每个通道中的第一个像素(左上角),我得到了 304、311、314 和 314,这似乎与我得到的 p0 值无关。

我不知道是因为 12 位分辨率,还是我必须将其转换为 uint32 以外的类型,但我就是无法理解这个数字。

谁能帮忙破译这个数字,如果它对应于左下角的前四个像素?

【问题讨论】:

    标签: c geotiff


    【解决方案1】:

    我可以使用以下代码访问图像中的实际像素值:

    TIFFReadEncodedStrip(tif,strip,buf, (tsize_t) -1);  
    uint16_t *p16;
    p16 = (uint16_t *) buf;
    printf("Strip: %d\n", strip);
    int i = 0;
    for (i; i < 64; i++) {      // the strip buffer is *length* elements long
        printf("%d: %u\n", i+1, p16[i]);
    }
    

    关键是将缓冲区转换为uint16_t*。这表明像素值是人类可以理解的。

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 2016-11-17
      • 2011-04-12
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多