2017-12-28 5 views
0

Mein letztes Ziel ist die Implementierung eines Cloud-Erkennungsalgorithmus mit C++. Ich hatte jedoch ein Problem.Pixelinformationen extrahieren (dl) LibTIFF verwenden

Ich habe ein Problem mit dem Extrahieren von Informationen aus Pixeln. Für die Datenvorverarbeitung wurde SNAP verwendet und ich kann dort viele Informationen für ein gegebenes Pixel (Länge, Breite, Bandwert usw.) sehen.

Pixel Info in SNAP

Das Problem entsteht, wenn ich das Bild als TIFF-Datei exportieren. Um damit umzugehen, habe ich LibTIFF-Bibliothek verwendet. Allerdings weiß ich nicht wirklich, wie man bestimmte Informationen über ein bestimmtes Pixel extrahiert. Zur Zeit habe ich einen Standardcode in der LibTIFF-Dokumentation, der alle Pixel eines Bildes durchläuft und seinen Wert ausgibt. Leider ergeben die Werte, die ich bekomme, keinen Sinn.

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); 
} 

So ist meine Frage gibt es eine einfache Möglichkeit, eine bestimmten Informationen für ein bestimmtes Pixel zu extrahieren, idealerweise LibTIFF mit? Wenn nicht, was sollte der beste Weg sein? Entschuldigung, wenn die Frage sehr einfach ist, konnte ich einfach keine Informationen darüber finden. Danke im Voraus.

EDIT: Ausgabe von 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 
+0

Warum denken Sie Ihre TIFF enthält verdoppelt? Hast du versucht 'tiffdump yourFile.tif' oder ** ImageMagick ** '' identify -verbose yourFile.tif'? –

+0

Ich nahm an, TIFF enthält Doubles, nur weil einige der Werte eines Pixels (Band-Wert, zum Beispiel) sind verdoppelt. Ich bin mir jedoch ziemlich sicher, dass ich falsch liege. Nein, ich habe Tiffdump oder ImageMagick nicht verwendet. Wenn ich es richtig verstehe, würden sie mir helfen, den Inhalt eines Pixels herauszufinden? Und dann extrahieren, was benötigt wird? – Mantas

+0

Sie müssen nur einen oder beide ausführen und sehen, womit Sie es zu tun haben. Klicken Sie unter Ihrem Beitrag auf "Bearbeiten" und fügen Sie die Ausgabe ein. –

Antwort

0

Ich habe einen Blick auf diese hatte und bin auch verwirrt, aber vielleicht, wenn ich setzen, was ich weiß, als Beginn einer Antwort, jemand schlauer als ich (@ fmw42 vielleicht) kann uns sagen, was vor sich geht.

Ihr Bild ist 16-Bit, Graustufen. Der maximale Pixelwert in der Datei beträgt 13 107, was auf einer Skala von 0 bis 65535 0,2 oder 20% entspricht, was bedeutet, dass alle Pixelwerte nur die niedrigen 20% des verfügbaren Bereichs verwenden - d. H. Das Bild ist ziemlich dunkel. Hier ist ein Histogramm:

enter image description here

Wenn ich nur die erste Zeile des Bildes mit Ihrem Programm aussehen (dh mit libtiff), ich sehe es ist schwarz, bis Spalte 165 - vermutlich, weil es sich um ein Satellitenbild ist und die Erde dreht sich in das Bild, während es gescannt wird.

Ich kann auch auf das Bild schauen ImageMagick, entweder das gesamte Bild als Text:

convert image.tif txt: 

Oder nur die erste Zeile Zuschneiden aus:

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

Wenn ich das tue, ich siehe auch, dass das erste nicht-schwarze Pixel in der ersten Scanzeile bei 165 liegt, aber es und nachfolgende Pixel unterscheiden sich von den libtiff-Werten. Die libtiff Werte sind auf der linken Seite im Diagramm unten und die ImageMagick-Werte sind auf der rechten Seite:

enter image description here

ich nicht sehen kann, was der Unterschied ist - es ist kein einfaches Verhältnis.So aufgetragen ich die erste Abtastzeile des Bildes als von libtiff (grün) berechnet und als von ImageMagick (lila) gezeigt:

enter image description here

Here I Zoom auf der linken Seite - man kann sehen, dass sie beide beginnen bei 165 Säule:

enter image description here

Und hier heran ich auf der rechten Seite in:

enter image description here

Es sieht so aus, als ob eine (ImageMagick) eine niedrigere radiometrische Auflösung (weniger Bits für die Pixelhelligkeit) als die andere hat, weil es mehr gestuft ist, aber manchmal scheint es geradezu faul und ist völlig statisch, wenn es deutlich genauere Werte darstellen könnte . Hier

ist die Ausgabe von 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 ...> 
+0

@emcconville Hast du vielleicht eine Minute, um sich das anzusehen, bitte? –