Advertisement
Guest User

ngry

a guest
Dec 6th, 2011
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. ptrdiff_t BinarizeSavuola2 ( quint8 const* pageBits,
  2.                              ptrdiff_t pageStride,
  3.                              ptrdiff_t pageWidth,
  4.                              ptrdiff_t pageHeight,
  5.                              ptrdiff_t radius,
  6.                              double    factor,
  7.                              QImage&   dst
  8.                             ) throw() {
  9.   assert(pageBits);
  10.  
  11.   dst = QImage ( pageWidth, pageHeight, QImage::Format_Indexed8 );
  12.  
  13.   QVector<QRgb> colorTable (256);
  14.   for (size_t i = 0; i < 256; ++i) {
  15.     QColor col( i, i, i);
  16.     colorTable[i] = col.rgb();
  17.   }
  18.   dst.setColorTable ( colorTable );
  19.  
  20.   QVarLengthArray <double, 2048> rowSum ( 2 * pageWidth ); 
  21.  
  22.   double *pISum  = rowSum.data(),     // sums
  23.          *pISSum = pISum + pageWidth; // sums of squares
  24.    
  25.   memset( rowSum.data(), 0, 2 * pageWidth * sizeof(double) );
  26.  
  27.   ptrdiff_t y,x, ymin,ymax, xmin, xmax, dstStride = dst.bytesPerLine();
  28.   quint8 const *srcRow;
  29.   quint8 *dstRow;
  30.   size_t    cpix;
  31.  
  32.   double mean, std, area, wsum, wssum, factor1 = 1. - factor;
  33.  
  34.   // initialize rowSum array
  35.  
  36.   for ( y = 0, srcRow = pageBits; y < radius; ++y, srcRow += pageStride )
  37.     for ( x = 0; x < pageWidth; ++x ) {
  38.       cpix = srcRow [ x ];
  39.       pISum [ x ] += cpix;
  40.       pISSum[ x ] += cpix * cpix;
  41.     }
  42.  
  43.   for ( y = 0, srcRow = pageBits, dstRow = dst.bits(); y < pageHeight; ++y, srcRow += pageStride, dstRow += dstStride ) {
  44.    
  45.     ymin = qMax(ptrdiff_t(0),y-radius);
  46.     ymax = qMin(pageHeight-1,y+radius);
  47.    
  48.     // initialize window sums
  49.     for ( wsum = wssum = 0., x = 0; x < radius; ++x ) {
  50.       wsum  += pISum [ x ];
  51.       wssum += pISSum[ x ];
  52.     }
  53.    
  54.     // loop on row
  55.     for ( x = 0; x < pageWidth; ++x ) {
  56.      
  57.       xmin = qMax(ptrdiff_t(0),x-radius);
  58.       xmax = qMin(pageWidth-1, x+radius);
  59.      
  60.       area = (xmax-xmin+1.)*(ymax-ymin+1.);
  61.      
  62.       mean = wsum / area;
  63.       std  = sqrt((wssum - wsum*wsum/area)/area);
  64.      
  65.       // threshold the current pixel
  66.  
  67.       dstRow [ x ] = srcRow [ x ] < mean * ( factor1 + factor *  std * .0078125 )  ? 0 : 255;
  68.      
  69.       // Housekeeping for left and right boundary cases
  70.      
  71.       if ( xmin ) {
  72.         // Subtract leftmost column from window sums
  73.         wsum  -= pISum [ xmin ];
  74.         wssum -= pISSum[ xmin ];
  75.       }
  76.      
  77.       if ( xmax < pageWidth - 1 ) {
  78.         // Add rightmost collumn to window histogram
  79.         wsum  += pISum [ xmax ];
  80.         wssum += pISSum[ xmax ];
  81.       }
  82.     }
  83.    
  84.     // Housekeeping for top and bottom boundary cases
  85.    
  86.     if ( ymin ) {
  87.       // Subtract top row from row sums
  88.       quint8 const* row = pageBits + ymin * pageStride;
  89.       for ( x = 0; x < pageWidth; ++x ) {
  90.         cpix = row [ x ];
  91.         pISum [ x ] -= cpix;
  92.         pISSum[ x ] -= cpix*cpix;  
  93.       }
  94.     }
  95.    
  96.     if ( ymax < pageHeight - 1 ) {
  97.       // Add bottom collumn to row sums
  98.       quint8 const* row = pageBits + ymax * pageStride;
  99.       for ( x = 0; x < pageWidth; ++x ) {
  100.         cpix = row [ x ];
  101.         pISum [ x ] += cpix;
  102.         pISSum[ x ] += cpix*cpix;
  103.       }
  104.     }
  105.    
  106.   }
  107.  
  108.   return 1;
  109. }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement