Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I simply load a greyscale tiff in libtiff and get an array of pixel intensities?

I am trying to understand images some more, and I'm having a great deal of trouble. From using matlab, I have experience in using imread('test.tif'), and getting a beautiful matrix of rows vs. columns, where you have the intensity of each pixel as an integer. So, a 720 x 250 image will give a 720 x 250 matrix, where each cell contains the intensity of the pixel, on a scale from 0-255 (depending on the data type). So, 0 was black, 255 was white.

It was so simple and made so much sense. Now I am attempting to use libtiff, and I am really struggling. I want to do the same thing--access those pixels, and I just can't get it.

I have the following code:

int main(int argc, char *argv[]){
  TIFF* tif = TIFFOpen( argv[1], "r");
    FILE *fp = fopen("test2.txt", "w+");

  if (tif) {
      int * buf;
      tstrip_t strip;
      uint32* bc;
      uint32 stripsize;
  TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &bc);
  stripsize = bc[0];
  buf   = _TIFFmalloc(stripsize);
  for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++ ) {
      if( bc[strip] > stripsize) {
          buf = _TIFFrealloc(buf, bc[strip]);
          stripsize = bc[strip];
      }
      TIFFReadRawStrip(tif, strip, buf, bc[strip]);
  }
  int i;
  for (i=0; i<stripsize; i++) {
      if ( i % 960 ==0 )
          fprintf(fp, "\n");
      fprintf(fp,"%d ",  buf[i]);
  }
  _TIFFfree(buf);
  TIFFClose(tif);
  }
  exit(0);
}

But I get completely meaningless results--just completely wacked out numbers. Nothing like the numbers I see when I load the image in matlab.

How can I simply access the pixel values, and look at them?

Thanks so much.

like image 925
The_Anomaly Avatar asked Mar 29 '11 23:03

The_Anomaly


People also ask

How do I make a TIFF grayscale?

Navigate to the Color tab in the main toolbar, click on the Filters icon and select Grayscale from the drop-down to automatically convert your TIFF image into grayscale.

How do I extract an image from a TIFF?

Open the tiff file in Adobe Acrobat Professional 7.0 (for large files this will take some time). Pull down the Acrobat menu and select Preferences. Click on the “Picture Tasks” button and select Export Pictures.


1 Answers

I think you should read Using The TIFF Library article. It contains enough information to get started with libtiff.

Here is some code to read image scanlines and print values of each sample.

main()
{
    TIFF* tif = TIFFOpen("myfile.tif", "r");
    if (tif) {
        uint32 imagelength;
        tsize_t scanline;
        tdata_t buf;
        uint32 row;
        uint32 col;

        TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
        scanline = TIFFScanlineSize(tif);
        buf = _TIFFmalloc(scanline);
        for (row = 0; row < imagelength; row++)
        {
            TIFFReadScanline(tif, buf, row);
            for (col = 0; col < scanline; col++)
                printf("%d ", buf[col]);

            printf("\n");
        }
        _TIFFfree(buf);
        TIFFClose(tif);
    }
}
like image 145
Bobrovsky Avatar answered Sep 17 '22 20:09

Bobrovsky