Извлечение информации о пикселях (dl) с помощью LibTIFF

Моя конечная цель — реализовать алгоритм обнаружения облаков с помощью C++. Однако я столкнулся с проблемой.

У меня проблема с извлечением информации из пикселей. Для предварительной обработки данных использовался SNAP, и я могу увидеть там много информации для данного пикселя (долгота, широта, значение полосы и т. д.).

Информация о пикселях в 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

person Mantas    schedule 28.12.2017    source источник
comment
Как вы думаете, почему ваш TIFF содержит дубликаты? Вы пробовали tiffdump yourFile.tif или identify -verbose yourFile.tif от ImageMagick?   -  person Mark Setchell    schedule 28.12.2017
comment
Я предположил, что TIFF содержит двойные числа только потому, что некоторые значения пикселя (например, значение полосы) являются двойными. Хотя я почти уверен, что ошибаюсь. Нет, я не использовал tiffdump или ImageMagick. Если я правильно понимаю, они помогут мне узнать содержимое пикселя? А затем извлечь все, что нужно?   -  person Mantas    schedule 29.12.2017
comment
Вам просто нужно запустить один или оба и посмотреть, с чем вы имеете дело. Пожалуйста, нажмите edit под своим сообщением и вставьте вывод.   -  person Mark Setchell    schedule 29.12.2017
comment
Есть новости о прогрессе?   -  person Mark Setchell    schedule 02.01.2018
comment
Извините за поздний ответ @MarkSetchell, но прогресс не достигнут. Я запустил identify -verbose yourFile.tif, но понятия не имею, как его анализировать. Выходной файл довольно большой, поэтому я не думаю, что это хорошая идея вставлять его сюда. Если бы вы могли сказать мне, какая информация актуальна, это было бы здорово. Спасибо.   -  person Mantas    schedule 24.01.2018
comment
Просто удалите часть гистограммы и опубликуйте остальное. Сообщения могут быть 2 МБ, так что все будет в порядке.   -  person Mark Setchell    schedule 24.01.2018
comment
Может быть, вы могли бы поделиться файлом, чтобы люди могли попытаться помочь дальше... Dropbox, OneDrive, Google Drive, filebin.net?   -  person Mark Setchell    schedule 24.01.2018
comment
@MarkSetchell Я добавил вывод. Конечно, я могу поделиться файлом, если это поможет.   -  person Mantas    schedule 24.01.2018
comment
Да, поделитесь файлом. В этом уже есть что-то странное, потому что у него 14,7 байта на пиксель, что все равно было бы в два раза больше, если бы это был RGB и 16-битные пиксели.   -  person Mark Setchell    schedule 24.01.2018
comment
@MarkSetchell Есть файл TIFF. ссылка   -  person Mantas    schedule 25.01.2018
comment
Я только что быстро просмотрел, и я могу прочитать файл нормально. Здесь, в Великобритании, уже поздно, так что завтра я разберусь с этим как следует. Однако, как быстрое предположение, я не удивлюсь, если ваш код будет работать, если вы замените double на unsigned short везде.   -  person Mark Setchell    schedule 25.01.2018
comment
Что ж, я могу получить значения как с помощью double, так и с помощью unsigned short, но проблема в том, что они на самом деле не имеют смысла.   -  person Mantas    schedule 25.01.2018
comment
Нет проблем с чтением файла и данных изображения (несжатый код UINT16 с большим порядком байтов хранится в одной полосе). Единственная необычная вещь — это тег 65000, содержащий строку DimapDocument ~43 МБ.   -  person cgohlke    schedule 28.01.2018
comment
Ммм.. мы, кажется, не делаем большого прогресса здесь! Может быть, вы могли бы объяснить, почему вы считаете, что значения неверны, и привести примеры того, какими, по вашему мнению, они должны быть и что вам действительно удается извлечь...   -  person Mark Setchell    schedule 29.01.2018
comment
@MarkSetchell Извините за поздний ответ, но проблема решена. С файлом проблем не было, проблема была во мне... :D Во-первых, это файл RGB, а это было не то, что мне было нужно. Мне просто нужны были значения различных полос (как видимых, так и невидимых) и к формату RGB это не имеет никакого отношения. Для этого мне пришлось экспортировать файл немного другим способом. Кроме того, мне сказали, что может быть невозможно получить то, что мне нужно, из файлов TIFF. Поэтому я экспортировал его в другой формат и успешно обработал. В любом случае, я ценю вашу помощь, большое спасибо ;)   -  person Mantas    schedule 30.01.2018


Ответы (1)


Я посмотрел на это и тоже запутался, но, может быть, если я поставлю то, что знаю, в качестве начала ответа, кто-то умнее меня (@fmw42 может быть) сможет рассказать нам, что происходит.

Ваше изображение 16-битное, в оттенках серого. Максимальное значение пикселя в файле составляет 13 107, что по шкале от 0 до 65 535 соответствует 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 ...>
person Mark Setchell    schedule 25.01.2018
comment
@emcconville Может быть, у вас есть минутка, чтобы посмотреть на это, пожалуйста? - person Mark Setchell; 27.01.2018