[Gdal-dev] how to get pixels' band vector efficiently

Andrew Finley afinley at gis.umn.edu
Wed Sep 15 09:34:09 EDT 2004


Thanks Frank,
I'll give this a try too.  I really appreciate everyones help.
-andy

On Wed, 2004-09-15 at 08:23, Frank Warmerdam wrote:
> Andrew Finley wrote:
> > Hi All,
> > I have written an image classification algorithm which uses gdal to fill
> > a vector of band values for each pixel.  I'm looking for a better/faster
> > way of accessing these values. Two general ways I might think to speed
> > this up are: 
> > 
> > 1) move one tile at a time into memory then apply the loop below.
> > 2) find a way to load my target vector more efficiently than one
> > pixel/layer at a time.
> > 
> > So I guess I'm looking for some ideas or example code.  Could the
> > tileindex application offer any help? Does it load logical image blocks
> > (i.e., from a single page)?
> 
> > Current approach:
> > //every pixel loop
> > for (int row = 0; row < featureDataset->GetRasterYSize(); row++){
> > 	for (int col = 0; col < featureDataset->GetRasterXSize(); col++){
> > 
> > 	//fill targetBandVec
> > 	for (layer = 1; layer <= featureDataset->GetRasterCount(); layer++){
> > 		featureBand = featureDataset->GetRasterBand( layer );
> > 		featureBand->RasterIO(GF_Read, col, row, 1, 1, featurePixel, 1, 1,
> > GDT_Float32, 0, 0 );
> > 		targetBandVec[layer-1]=featurePixel[0];
> > 	}
> 
> Andy,
> 
> Reading one pixel at a time is going to be terrible for performance.  I would
> encourage you to at least change you code to read one line at a time.  This
> will give you a huge performance boost.  Going to a tile oriented (or better
> yet to the native block size of the source) will help a bit more in some cases,
> but not likely very much.
> 
> I am also using the multi-band RasterIO() directly on the dataset, one
> line at a time in the following example:
> 
>   // Make sure that lineBuf holds one whole line of data.
>   float *lineBuf;
>   int  xsize = featureDataset->GetRasterXSize();
>   int  ysize = featureDataset->GetRasterYSize();
>   int  bandCount = featureDataset->GetRasterCount();
> 
>   lineBuf = (float *) CPLMalloc(xsize * bandCount);
> 
>   //every row loop
>   for (int row = 0; row < featureDataset->GetRasterYSize(); row++){
>       featureDataset->RasterIO( GF_Read, 0, row, xsize, 1,
>                                 lineBuf, xsize, 1, GDT_Float32,
>                                 bandCount, NULL,
>                                 4 * bandCount, 0, 4 );
>       // every pixel in row.
>       for (int col = 0; col < featureDataset->GetRasterXSize(); col++){
>           float *targetBandVec = lineBuf + col;
> 
>           ... perform classification ..
>       }
>   }
> 
> Good luck,



More information about the Gdal-dev mailing list