From bf8614ea51cf9f84018bee5f46667d8d42c94b20 Mon Sep 17 00:00:00 2001 From: Nick White Date: Mon, 13 May 2019 16:54:15 +0100 Subject: Use the simplified findbestedge function, and simplify code --- cleanup/main.go | 47 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/cleanup/main.go b/cleanup/main.go index bf94fcf..e0b66ce 100644 --- a/cleanup/main.go +++ b/cleanup/main.go @@ -1,5 +1,10 @@ package main +// TODO: add minimum size variable (default ~30%?) +// TODO: add tests +// TODO: make into a small library +// TODO: have the integral image specific stuff done by interface functions + import ( "flag" "fmt" @@ -43,9 +48,19 @@ func checkwindow(integral [][]uint64, x int, size int, thresh float64) bool { return proportion <= thresh } -// cleanimg fills the sections of image not within the boundaries +// returns the proportion of the given window that is black pixels +func proportion(integral [][]uint64, x int, size int) float64 { + height := len(integral) + window := getwindowslice(integral, x, size) + // divide by 255 as each on pixel has the value of 255 + sum := (window.bottomright + window.topleft - window.topright - window.bottomleft) / 255 + area := size * height + return float64(area)/float64(sum) - 1 +} + +// wipesides fills the sections of image not within the boundaries // of lowedge and highedge with white -func cleanimg(img *image.Gray, lowedge int, highedge int) *image.Gray { +func wipesides(img *image.Gray, lowedge int, highedge int) *image.Gray { b := img.Bounds() new := image.NewGray(b) @@ -71,6 +86,28 @@ func cleanimg(img *image.Gray, lowedge int, highedge int) *image.Gray { return new } +// findbestedge goes through every vertical line from x to x+w to +// find the one with the lowest proportion of black pixels. +func findbestedge(integral [][]uint64, x int, w int) int { + var bestx int + var best float64 + + if w == 1 { + return x + } + + right := x + w + for ; x < right; x++ { + prop := proportion(integral, x, 1) + if prop > best { + best = prop + bestx = x + } + } + + return bestx +} + // findedges finds the edges of the main content, by moving a window of wsize // from the middle of the image to the left and right, stopping when it reaches // a point at which there is a lower proportion of black pixels than thresh. @@ -80,14 +117,14 @@ func findedges(integral [][]uint64, wsize int, thresh float64) (int, int) { for x := maxx / 2; x < maxx-wsize; x++ { if checkwindow(integral, x, wsize, thresh) { - highedge = x + (wsize / 2) + highedge = findbestedge(integral, x, wsize) break } } for x := maxx / 2; x > 0; x-- { if checkwindow(integral, x, wsize, thresh) { - lowedge = x - (wsize / 2) + lowedge = findbestedge(integral, x, wsize) break } } @@ -125,7 +162,7 @@ func main() { lowedge, highedge := findedges(integral, *wsize, *thresh) - clean := cleanimg(gray, lowedge, highedge) + clean := wipesides(gray, lowedge, highedge) f, err = os.Create(flag.Arg(1)) if err != nil { -- cgit v1.2.1-24-ge1ad