使用LibTIFF提取像素信息(dl)

时间:2017-12-28 20:34:18

标签: c++ tiff libtiff

我的最终目标是用C ++实现云检测算法。但是,我遇到了一个问题。

我从像素中提取信息时遇到问题。对于数据预处理,使用了SNAP,我可以看到给定像素(经度,纬度,波段值等)的大量信息。

Pixel Info in SNAP

将图像导出为TIFF文件时出现问题。为了解决这个问题,我使用了LibTIFF库。但是,我真的不知道如何提取有关给定像素的特定信息。目前,我在LibTIFF文档中给出了一个标准代码,用于循环遍历图像的所有像素并打印出其值。不幸的是,我得到的价值没有意义。

TIFF* tif = TIFFOpen(filename, "r");
if (tif) {
    uint32 imagelength;
    double * buf;
    tsize_t scanline;
    uint32 row;
    uint32 i;
    tsize_t y;

    TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
    scanline = TIFFScanlineSize(tif);
    buf = (double *) _TIFFmalloc(scanline);
    for (row = 0; row < imagelength; row++) {
        int n = TIFFReadScanline(tif, buf, row);

        for (y = 0; y < scanline; y++) {
            cout << "Row: " << row << " y: " << y << " " << (double) buf[y]
                    << endl;
        }
    }
    _TIFFfree(buf);
    TIFFClose(tif);
}

所以,我的问题是,是否有一种直接的方法来提取给定像素的特定信息,理想情况下使用LibTIFF?如果没有,最好的方法是什么?如果问题非常基本,我道歉,我找不到任何有关它的信息。提前谢谢。

编辑:输出identify -verbose file.tif

  Format: TIFF (Tagged Image File Format)
  Mime type: image/tiff
  Class: DirectClass
  Geometry: 1830x1830+0+0
  Resolution: 1x1
  Print size: 1830x1830
  Units: Undefined
  Colorspace: Gray
  Type: Grayscale
  Endianess: MSB
  Depth: 16/8-bit
  Channel depth:
    Gray: 8-bit
  Channel statistics:
    Pixels: 3348900
    Gray:
      min: 0  (0)
      max: 13107 (0.2)
      mean: 1582.66 (0.0241498)
      standard deviation: 1200.55 (0.0183193)
      kurtosis: 2.79689
      skewness: 1.81966
      entropy: 0.63063
  Colors: 34
 Rendering intent: Undefined
  Gamma: 0.454545
  Matte color: grey74
  Background color: white
  Border color: srgb(223,223,223)
  Transparent color: none
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 1830x1830+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: None
  Orientation: TopLeft
  Properties:
    comment: band2
    date:create: 2018-01-09T21:48:10+00:00
    date:modify: 2018-01-09T21:48:14+00:00
    signature: b3783beb7f7d2bdb32c3c64f8878a02c238a10f221f6a05f93991b26a58a4c78
    tiff:alpha: unspecified
    tiff:endian: msb
    tiff:photometric: min-is-black
    tiff:rows-per-strip: 1830
  Artifacts:
    verbose: true
  Tainted: False
  Filesize: 49.3701MiB
  Number pixels: 3348900
  Pixels per second: 3.88504MB
  User time: 0.484u
  Elapsed time: 0:01.861

1 个答案:

答案 0 :(得分:0)

我看过这个并且也很困惑,但也许如果我把我所知道的作为答案的开头,有人比我聪明(@ fmw42也许)可以告诉我们发生了什么。

您的图片是16位灰度。文件中的最大像素值是13,107,其在0-65535的等级上等于0.2或20%意味着所有像素值仅使用可用范围的低20% - 即图像相当暗。这是一个直方图:

enter image description here

如果我用你的程序(即使用libtiff)查看图像的第一行,我看到它在第165列之前是黑色的 - 大概是因为它是卫星图像而地球在扫描时旋转到图像中

我也可以使用ImageMagick查看图像,整个图像可以是文本:

convert image.tif txt:

或者,只是裁掉第一行:

convert image.tif -crop 1830x1+0+0 txt:

当我这样做时,我也看到第一个扫描线中的第一个非黑色像素是165,但它和后续像素与libtiff值不同。 libtiff值位于下图中的左侧,ImageMagick值位于右侧:

enter image description here

我看不出有什么区别 - 这不是一个简单的比例。所以我绘制了由libtiff(绿色)计算的图像的第一条扫描线,并由ImageMagick(紫色)显示:

enter image description here

这里我放大左侧 - 你可以看到它们都从第165栏开始:

enter image description here

在这里我放大了右侧:

enter image description here

它看起来像一个(ImageMagick)具有较低的辐射分辨率(像素亮度的位数较少),因为它更加阶梯状,但有时看起来非常懒惰,并且当它显然可以表示更准确时是完全静态的值。

以下是tiffdump image.tif

的输出
image.tif:
Magic: 0x4d4d <big-endian> Version: 0x2a <ClassicTIFF>
Directory 0: offset 10 (0xa) next 0 (0)
ImageWidth (256) LONG (4) 1<1830>
ImageLength (257) LONG (4) 1<1830>
BitsPerSample (258) SHORT (3) 1<16>
Compression (259) SHORT (3) 1<1>
Photometric (262) SHORT (3) 1<1>
ImageDescription (270) ASCII (2) 6<band2\0>
StripOffsets (273) LONG (4) 1<45070554>
SamplesPerPixel (277) SHORT (3) 1<1>
RowsPerStrip (278) LONG (4) 1<1830>
StripByteCounts (279) LONG (4) 1<6697800>
XResolution (282) RATIONAL (5) 1<1>
YResolution (283) RATIONAL (5) 1<1>
PlanarConfig (284) SHORT (3) 1<2>
ResolutionUnit (296) SHORT (3) 1<1>
SampleFormat (339) SHORT (3) 1<1>
34264 (0x85d8) DOUBLE (12) 16<60 0 0 600000 0 -60 0 5.90004e+06 0 0 0 0 0 0 0 1>
34735 (0x87af) SHORT (3) 24<1 1 2 5 1024 0 1 1 1025 0 1 1 1026 34737 22 0 3072 0 1 32629 3073 34737 22 22>
34737 (0x87b1) ASCII (2) 45<WGS 84 / UTM zone 29N|WG ...>
65000 (0xfde8) ASCII (2) 45070067<<?xml version="1.0" enco ...>