From d9c6a724e97141db9cbaa66226e0410a5535ae28 Mon Sep 17 00:00:00 2001 From: Nick White Date: Thu, 23 Jul 2020 15:01:41 +0100 Subject: Add Set and NewImage functions to implement image/draw.Image interface Now the integralimg can be created directly from an image using image/draw.Draw. --- integralimg.go | 40 ++++++++++++++++++++++++++++++++++------ integralimg_test.go | 5 ++--- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/integralimg.go b/integralimg.go index 17d3332..a0cb565 100644 --- a/integralimg.go +++ b/integralimg.go @@ -28,22 +28,50 @@ func (i I) At(x, y int) color.Color { return color.Gray{} } - var oldx, oldy, oldxy uint64 - oldx, oldy, oldxy = 0, 0, 0 + var prevx, prevy, prevxy uint64 + prevx, prevy, prevxy = 0, 0, 0 if x > 0 { - oldx = i[y][x-1] + prevx = i[y][x-1] } if y > 0 { - oldy = i[y-1][x] + prevy = i[y-1][x] } if x > 0 && y > 0 { - oldxy = i[y-1][x-1] + prevxy = i[y-1][x-1] } - orig := i[y][x] + oldxy - oldx - oldy + orig := i[y][x] + prevxy - prevx - prevy return color.Gray{uint8(orig)} } +func (i I) Set(x, y int, c color.Color) { + var prevx, prevy, prevxy uint64 + prevx, prevy, prevxy = 0, 0, 0 + if x > 0 { + prevx = i[y][x-1] + } + if y > 0 { + prevy = i[y-1][x] + } + if x > 0 && y > 0 { + prevxy = i[y-1][x-1] + } + gray := color.GrayModel.Convert(c).(color.Gray).Y + final := uint64(gray) + prevx + prevy - prevxy + i[y][x] = final +} + +// NewImage returns a new Integral Image with the given bounds. +func NewImage(r image.Rectangle) *I { + w, h := r.Dx(), r.Dy() + var rows I + for i := 0; i < h; i++ { + col := make([]uint64, w) + rows = append(rows, col) + } + return &rows +} + // Sq contains an Integral Image and its Square type WithSq struct { Img I diff --git a/integralimg_test.go b/integralimg_test.go index 3bc8dd6..df97caa 100644 --- a/integralimg_test.go +++ b/integralimg_test.go @@ -23,10 +23,9 @@ func TestFromPNG(t *testing.T) { t.Fatalf("Could not decode image: %v\n", err) } b := img.Bounds() - gray := image.NewGray(image.Rect(0, 0, b.Dx(), b.Dy())) - draw.Draw(gray, b, img, b.Min, draw.Src) - integral := ToIntegralImg(gray) + integral := NewImage(image.Rect(0, 0, b.Dx(), b.Dy())) + draw.Draw(integral, b, img, b.Min, draw.Src) if !imgsequal(img, integral) { t.Errorf("Read png image differs to integral\n") -- cgit v1.2.1-24-ge1ad