summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick White <git@njw.name>2020-08-03 15:49:55 +0100
committerNick White <git@njw.name>2020-08-03 15:49:55 +0100
commit1fe7dcdd23691212e8393559fc9d7d5100981386 (patch)
tree64d5b548c7ac9342e57f99315ba30224e8de2d9e
parentd0b28b984bcd1c73dc5782c8d4df2bdc4ab0b310 (diff)
Add more Sum() tests, and further correct bugs found from it
The implementation should be bug-free now. Of course, I thought that previously, then found more, so we shall see. There are more tests, though, and they definitely pass, so that's a good start.
-rw-r--r--integralimg.go33
-rw-r--r--integralimg_test.go22
2 files changed, 37 insertions, 18 deletions
diff --git a/integralimg.go b/integralimg.go
index 922b1ce..a197920 100644
--- a/integralimg.go
+++ b/integralimg.go
@@ -140,38 +140,43 @@ func highest(a, b int) int {
}
func (i Image) topLeft(r image.Rectangle) uint64 {
- x := highest(r.Min.X, 0)
- y := highest(r.Min.Y, 0)
- if x == 0 || y == 0 {
+ b := i.Bounds()
+ x := r.Min.X - 1
+ y := r.Min.Y - 1
+ x = lowest(x, b.Max.X - 1)
+ y = lowest(y, b.Max.Y - 1)
+ if x < 0 || y < 0 {
return 0
}
return i[y][x]
}
func (i Image) topRight(r image.Rectangle) uint64 {
- x := lowest(r.Max.X - 1, i.Bounds().Dx() - 1)
- y := highest(r.Min.Y, 0)
- if x == 0 || y == 0 {
+ b := i.Bounds()
+ x := lowest(r.Max.X - 1, b.Max.X - 1)
+ y := r.Min.Y - 1
+ y = lowest(y, b.Max.Y - 1)
+ if x < 0 || y < 0 {
return 0
}
return i[y][x]
}
func (i Image) bottomLeft(r image.Rectangle) uint64 {
- x := highest(r.Min.X, 0)
- y := lowest(r.Max.Y - 1, i.Bounds().Dy() - 1)
- if x == 0 || y == 0 {
+ b := i.Bounds()
+ x := r.Min.X - 1
+ x = lowest(x, b.Max.X - 1)
+ y := lowest(r.Max.Y - 1, b.Max.Y - 1)
+ if x < 0 || y < 0 {
return 0
}
return i[y][x]
}
func (i Image) bottomRight(r image.Rectangle) uint64 {
- x := lowest(r.Max.X - 1, i.Bounds().Dx() - 1)
- y := lowest(r.Max.Y - 1, i.Bounds().Dy() - 1)
- if x == 0 || y == 0 {
- return 0
- }
+ b := i.Bounds()
+ x := lowest(r.Max.X - 1, b.Max.X - 1)
+ y := lowest(r.Max.Y - 1, b.Max.Y - 1)
return i[y][x]
}
diff --git a/integralimg_test.go b/integralimg_test.go
index bd8a983..35b353d 100644
--- a/integralimg_test.go
+++ b/integralimg_test.go
@@ -70,11 +70,25 @@ func TestSum(t *testing.T) {
draw.Draw(imgplus, b, img, b.Min, draw.Src)
draw.Draw(integral, b, img, b.Min, draw.Src)
- sumimg := imgplus.sum(b)
- sumint := integral.Sum(b)
+ cases := []struct {
+ name string
+ r image.Rectangle
+ }{
+ {"fullimage", b},
+ {"small", image.Rect(1, 1, 5, 5)},
+ {"toobig", image.Rect(0, 0, 2000, b.Dy())},
+ {"toosmall", image.Rect(-1, -1, 4, 5)},
+ {"small2", image.Rect(0, 0, 4, 4)},
+ }
- if sumimg != sumint {
- t.Errorf("Sum of integral image differs to regular image: regular: %d, integral: %d\n", sumimg, sumint)
+ for _, c := range cases{
+ t.Run(c.name, func(t *testing.T) {
+ sumimg := imgplus.sum(c.r)
+ sumint := integral.Sum(c.r)
+ if sumimg != sumint {
+ t.Errorf("Sum of integral image differs to regular image: regular: %d, integral: %d\n", sumimg, sumint)
+ }
+ })
}
}