Changeset 14763

Show
Ignore:
Timestamp:
06/24/08 17:40:53 (5 months ago)
Author:
warmerdam
Message:

Add support for scanning from top and bottom as well as from the sides.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/gdal/apps/nearblack.cpp

    r12792 r14763  
    3232 
    3333static void ProcessLine( GByte *pabyLine, int iStart, int iEnd, int nBands, 
    34                          int nNearDist, int nMaxNonBlack, int bNearWhite ); 
     34                         int nNearDist, int nMaxNonBlack, int bNearWhite, 
     35                         int *panLastLineCounts,  
     36                         int bDoHorizontalCheck,  
     37                         int bDoVerticalCheck ); 
    3538 
    3639/************************************************************************/ 
     
    156159/* -------------------------------------------------------------------- */ 
    157160    GByte *pabyLine; 
     161    int   *panLastLineCounts; 
    158162 
    159163    pabyLine = (GByte *) CPLMalloc(nXSize * nBands); 
     164 
     165    panLastLineCounts = (int *) CPLCalloc(sizeof(int),nXSize); 
    160166 
    161167/* -------------------------------------------------------------------- */ 
     
    175181         
    176182        ProcessLine( pabyLine, 0, nXSize-1, nBands, nNearDist, nMaxNonBlack, 
    177                      bNearWhite ); 
     183                     bNearWhite, panLastLineCounts, TRUE, TRUE ); 
    178184        ProcessLine( pabyLine, nXSize-1, 0, nBands, nNearDist, nMaxNonBlack, 
    179                      bNearWhite ); 
     185                     bNearWhite, NULL, TRUE, FALSE ); 
    180186         
    181187        eErr = GDALDatasetRasterIO( hOutDS, GF_Write, 0, iLine, nXSize, 1,  
     
    185191            break; 
    186192         
    187         GDALTermProgress( (iLine+1) / (double) nYSize, NULL, NULL ); 
     193        GDALTermProgress( 0.5 * ((iLine+1) / (double) nYSize), NULL, NULL ); 
     194    } 
     195 
     196/* -------------------------------------------------------------------- */ 
     197/*      Now process from the bottom back up, doing only the vertical pass.*/ 
     198/* -------------------------------------------------------------------- */ 
     199    memset( panLastLineCounts, 0, sizeof(int) * nXSize); 
     200     
     201    for( iLine = nYSize-1; iLine >= 0; iLine-- ) 
     202    { 
     203        CPLErr eErr; 
     204 
     205        eErr = GDALDatasetRasterIO( hOutDS, GF_Read, 0, iLine, nXSize, 1,  
     206                                    pabyLine, nXSize, 1, GDT_Byte,  
     207                                    nBands, NULL, nBands, nXSize * nBands, 1 ); 
     208        if( eErr != CE_None ) 
     209            break; 
     210         
     211        ProcessLine( pabyLine, 0, nXSize-1, nBands, nNearDist, nMaxNonBlack, 
     212                     bNearWhite, panLastLineCounts, FALSE, TRUE ); 
     213         
     214        eErr = GDALDatasetRasterIO( hOutDS, GF_Write, 0, iLine, nXSize, 1,  
     215                                    pabyLine, nXSize, 1, GDT_Byte,  
     216                                    nBands, NULL, nBands, nXSize * nBands, 1 ); 
     217        if( eErr != CE_None ) 
     218            break; 
     219         
     220        GDALTermProgress( 0.5 + 0.5 * (nYSize-iLine) / (double) nYSize,  
     221                          NULL, NULL ); 
    188222    } 
    189223 
    190224    CPLFree(pabyLine); 
     225    CPLFree( panLastLineCounts ); 
     226 
    191227    GDALClose( hOutDS ); 
    192228    if( hInDS != hOutDS ) 
     
    203239 
    204240static void ProcessLine( GByte *pabyLine, int iStart, int iEnd, int nBands, 
    205                          int nNearDist, int nMaxNonBlack, int bNearWhite ) 
     241                         int nNearDist, int nMaxNonBlack, int bNearWhite, 
     242                         int *panLastLineCounts,  
     243                         int bDoHorizontalCheck,  
     244                         int bDoVerticalCheck ) 
    206245 
    207246{ 
    208247    int iDir, i; 
    209     int nNonBlackPixels = 0; 
    210  
    211     if( iStart < iEnd ) 
    212         iDir = 1; 
    213     else 
    214         iDir = -1; 
    215  
    216     for( i = iStart; i != iEnd; i += iDir ) 
    217     { 
    218         int iBand; 
    219         int bIsNonBlack = FALSE; 
    220  
    221         for( iBand = 0; iBand < nBands; iBand++ ) 
    222         { 
    223             if( bNearWhite ) 
    224             { 
    225                 if( (255 - pabyLine[i * nBands + iBand]) > nNearDist ) 
     248 
     249/* -------------------------------------------------------------------- */ 
     250/*      Vertical checking.                                              */ 
     251/* -------------------------------------------------------------------- */ 
     252    if( bDoVerticalCheck ) 
     253    { 
     254        int nXSize = MAX(iStart+1,iEnd+1); 
     255 
     256        for( i = 0; i < nXSize; i++ ) 
     257        { 
     258            int iBand; 
     259            int bIsNonBlack = FALSE; 
     260 
     261            // are we already terminated for this column? 
     262            if( panLastLineCounts[i] > nMaxNonBlack ) 
     263                continue; 
     264 
     265            for( iBand = 0; iBand < nBands; iBand++ ) 
     266            { 
     267 
     268                if( bNearWhite ) 
    226269                { 
    227                     bIsNonBlack = TRUE; 
    228                     break; 
     270                    if( (255 - pabyLine[i * nBands + iBand]) > nNearDist ) 
     271                    { 
     272                        bIsNonBlack = TRUE; 
     273                        break; 
     274                    } 
    229275                } 
     276                else 
     277                { 
     278                    if( pabyLine[i * nBands + iBand] > nNearDist ) 
     279                    { 
     280                        bIsNonBlack = TRUE; 
     281                        break; 
     282                    } 
     283                } 
     284            } 
     285 
     286            if( bIsNonBlack ) 
     287            { 
     288                panLastLineCounts[i]++; 
     289 
     290                if( panLastLineCounts[i] > nMaxNonBlack ) 
     291                    continue;  
    230292            } 
    231293            else 
    232             { 
    233                 if( pabyLine[i * nBands + iBand] > nNearDist ) 
     294                panLastLineCounts[i] = 0; 
     295 
     296            for( iBand = 0; iBand < nBands; iBand++ ) 
     297            { 
     298                if( bNearWhite ) 
     299                    pabyLine[i * nBands + iBand] = 255; 
     300                else 
     301                    pabyLine[i * nBands + iBand] = 0; 
     302            } 
     303        } 
     304    } 
     305 
     306/* -------------------------------------------------------------------- */ 
     307/*      Horizontal Checking.                                            */ 
     308/* -------------------------------------------------------------------- */ 
     309    if( bDoHorizontalCheck ) 
     310    { 
     311        int nNonBlackPixels = 0; 
     312 
     313        if( iStart < iEnd ) 
     314            iDir = 1; 
     315        else 
     316            iDir = -1; 
     317 
     318        for( i = iStart; i != iEnd; i += iDir ) 
     319        { 
     320            int iBand; 
     321            int bIsNonBlack = FALSE; 
     322 
     323            for( iBand = 0; iBand < nBands; iBand++ ) 
     324            { 
     325                if( bNearWhite ) 
    234326                { 
    235                     bIsNonBlack = TRUE; 
    236                     break; 
     327                    if( (255 - pabyLine[i * nBands + iBand]) > nNearDist ) 
     328                    { 
     329                        bIsNonBlack = TRUE; 
     330                        break; 
     331                    } 
    237332                } 
    238             } 
    239         } 
    240  
    241         if( bIsNonBlack ) 
    242         { 
    243             nNonBlackPixels++
    244  
    245             if( nNonBlackPixels > nMaxNonBlack ) 
    246                 return; 
    247         } 
    248         else 
    249             nNonBlackPixels = 0; 
    250  
    251         for( iBand = 0; iBand < nBands; iBand++ ) 
    252         { 
    253             if( bNearWhite ) 
    254                 pabyLine[i * nBands + iBand] = 255; 
     333                else 
     334                { 
     335                    if( pabyLine[i * nBands + iBand] > nNearDist ) 
     336                    { 
     337                        bIsNonBlack = TRUE; 
     338                        break
     339                    } 
     340                } 
     341            } 
     342 
     343            if( bIsNonBlack ) 
     344            { 
     345                nNonBlackPixels++; 
     346 
     347                if( nNonBlackPixels > nMaxNonBlack ) 
     348                    return; 
     349            } 
    255350            else 
    256                 pabyLine[i * nBands + iBand] = 0; 
    257         } 
    258     } 
     351                nNonBlackPixels = 0; 
     352 
     353            for( iBand = 0; iBand < nBands; iBand++ ) 
     354            { 
     355                if( bNearWhite ) 
     356                    pabyLine[i * nBands + iBand] = 255; 
     357                else 
     358                    pabyLine[i * nBands + iBand] = 0; 
     359            } 
     360        } 
     361    } 
     362 
    259363}