@@ -395,9 +395,10 @@ BinaryImage binarizeWindow(const QImage& src,
395395
396396 const int areaFull = w * h;
397397 assert (areaFull > 0 );
398- const double meanFull = ( double ) integralImage.sum (QRect (0 , 0 , w, h)) / areaFull;
398+ const uint64_t meanFull = integralImage.sum (QRect (0 , 0 , w, h)) / areaFull;
399399 double deviationMax = 0.0 ;
400400 double deviationMin = 256.0 ;
401+ const double coefw = k * 3.0 ; // translate from Wolf to Window coef.
401402
402403 grayLine = gray.bits ();
403404 for (int y = 0 ; y < h; ++y) {
@@ -416,21 +417,22 @@ BinaryImage binarizeWindow(const QImage& src,
416417 const double mean = windowSum * rArea;
417418 const double sqmean = windowSqsum * rArea;
418419
419- const double variance = sqmean - mean * mean;
420- const double deviation = std::sqrt (std::fabs ( variance) );
420+ const double variance = std::fabs ( sqmean - mean * mean) ;
421+ const double deviation = std::sqrt (variance);
421422
422423 deviationMax = (deviation > deviationMax) ? deviation : deviationMax;
423424 deviationMin = (deviation < deviationMin) ? deviation : deviationMin;
424425 }
425426 grayLine += grayBpl;
426427 }
427428
428- const double deviationD = ( deviationMax > deviationMin) ? (deviationMax - deviationMin) : 1.0 ;
429+ const double deviationD = deviationMax - deviationMin;
429430
430431 BinaryImage bwImg (w, h);
431432 uint32_t * bwLine = bwImg.data ();
432433 const int bwWpl = bwImg.wordsPerLine ();
433434
435+ const uint32_t msb = uint32_t (1 ) << 31 ;
434436 grayLine = gray.bits ();
435437 for (int y = 0 ; y < h; ++y) {
436438 const int top = (y > windowLowerHalf) ? (y - windowLowerHalf) : 0 ;
@@ -448,17 +450,16 @@ BinaryImage binarizeWindow(const QImage& src,
448450 const double mean = windowSum * rArea;
449451 const double sqmean = windowSqsum * rArea;
450452
451- const double variance = sqmean - mean * mean;
452- const double deviation = std::sqrt (std::fabs ( variance) );
453+ const double variance = std::fabs ( sqmean - mean * mean) ;
454+ const double deviation = std::sqrt (variance);
453455
454456 const double md = (mean + 1.0 - delta) / (meanFull + deviation + 1.0 );
455457 const double kdm = (meanFull + meanFull + 1.0 ) / (deviation + 1.0 );
456- const double kds = (deviation - deviationMin) / deviationD;
458+ const double kds = (deviationD > 0.0 ) ? (( deviation - deviationMin) / deviationD) : 1.0 ;
457459 const double kd = 1.0 + kdm * kds;
458460
459- const double threshold = mean * (1.0 - k * 3.0 * md / kd);
461+ const double threshold = mean * (1.0 - coefw * md / kd);
460462
461- const uint32_t msb = uint32_t (1 ) << 31 ;
462463 const uint32_t mask = msb >> (x & 31 );
463464 if ((grayLine[x] < lowerBound) || ((grayLine[x] <= upperBound) && (int (grayLine[x]) < threshold))) {
464465 // black
0 commit comments