Skip to content

Commit 6365ee0

Browse files
committed
1.1.1: fix Windows threshold overflow
1 parent 48318d0 commit 6365ee0

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

src/imageproc/Binarize.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)