【问题标题】:Extract Pixel Information (dl) Using LibTIFF使用 LibTIFF 提取像素信息 (dl)
【发布时间】:2017-12-28 20:34:17
【问题描述】:

我的最终目标是用 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

【问题讨论】:

  • 为什么你认为你的 TIFF 包含双打?你试过tiffdump yourFile.tif,或者ImageMagickidentify -verbose yourFile.tif吗?
  • 我假设 TIFF 包含双精度值只是因为像素的某些值(例如波段值)是双精度值。我很确定我错了。不,我没有使用过 tiffdump 或 ImageMagick。如果我理解正确,他们会帮助我找出像素的内容吗?然后提取需要的东西?
  • 你只需要运行一个或两个,看看你在处理什么。请点击帖子下方的edit 并粘贴到输出中。
  • 有进展的消息吗?
  • 很抱歉@MarkSetchell 回复晚了,但没有取得任何进展。我确实运行了identify -verbose yourFile.tif,但我不知道如何分析它。输出文件很大,所以我不认为将它粘贴在这里是一个好主意。如果你能告诉我哪些信息是相关的,那就太好了。谢谢。

标签: c++ tiff libtiff


【解决方案1】:

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

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

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

我也可以使用 ImageMagick 查看图像,或者将整个图像作为文本:

convert image.tif txt:

或者,只是剪掉第一行:

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

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

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

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

我在这里放大右侧:

看起来一个 (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 ...>

【讨论】:

  • @emcconville 请您花点时间看看这个,好吗?
猜你喜欢
  • 2016-12-07
  • 2016-02-03
  • 1970-01-01
  • 2021-04-15
  • 2015-04-20
  • 2022-01-03
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多