diff options
author | Nick White <git@njw.name> | 2019-05-13 19:23:03 +0100 |
---|---|---|
committer | Nick White <git@njw.name> | 2019-05-13 19:23:03 +0100 |
commit | 02a6c66eb77a5b455bcf2d0547d2383074eb7e41 (patch) | |
tree | 00f2bde1dfa7a1b23e55478309f26ba1b54fdab9 /binarize/sauvola.go | |
parent | d94fb9f7e74aaad335a587030ed2b4ce44c24cbf (diff) |
Reorganise image manipulation to separate integral image parts
Also unify everything else under preproc/
Note that the UsefulImg interface should be used by the main
functions, to simplify things, but this hasn't been done yet.
Diffstat (limited to 'binarize/sauvola.go')
-rw-r--r-- | binarize/sauvola.go | 54 |
1 files changed, 0 insertions, 54 deletions
diff --git a/binarize/sauvola.go b/binarize/sauvola.go deleted file mode 100644 index 6d9c1af..0000000 --- a/binarize/sauvola.go +++ /dev/null @@ -1,54 +0,0 @@ -package binarize - -import ( - "image" - "image/color" -) - -// Implements Sauvola's algorithm for text binarization, see paper -// "Adaptive document image binarization" (2000) -func Sauvola(img *image.Gray, ksize float64, windowsize int) *image.Gray { - b := img.Bounds() - new := image.NewGray(b) - - for y := b.Min.Y; y < b.Max.Y; y++ { - for x := b.Min.X; x < b.Max.X; x++ { - window := surrounding(img, x, y, windowsize) - m, dev := meanstddev(window) - threshold := m * (1 + ksize * ((dev / 128) - 1)) - if img.GrayAt(x, y).Y < uint8(threshold) { - new.SetGray(x, y, color.Gray{0}) - } else { - new.SetGray(x, y, color.Gray{255}) - } - } - } - - return new -} - -// Implements Sauvola's algorithm using Integral Images, see paper -// "Efficient Implementation of Local Adaptive Thresholding Techniques Using Integral Images" -// and -// https://stackoverflow.com/questions/13110733/computing-image-integral -func IntegralSauvola(img *image.Gray, ksize float64, windowsize int) *image.Gray { - b := img.Bounds() - new := image.NewGray(b) - - integral := Integralimg(img) - integralsq := integralimgsq(img) - - for y := b.Min.Y; y < b.Max.Y; y++ { - for x := b.Min.X; x < b.Max.X; x++ { - m, dev := integralmeanstddev(integral, integralsq, x, y, windowsize) - threshold := m * (1 + ksize * ((dev / 128) - 1)) - if img.GrayAt(x, y).Y < uint8(threshold) { - new.SetGray(x, y, color.Gray{0}) - } else { - new.SetGray(x, y, color.Gray{255}) - } - } - } - - return new -} |