M compareargs.go +10 -0
@@ 40,8 40,18 @@ type CompareArgs struct {
ColorFactor float64
// How much to down sample image before comparing, in powers of 2.
DownSample int
+ Result int
+ Differing uint
}
+const (
+ BINARY_IDENTICAL = iota
+ DIMENSION_MISMATCH
+ PERCEPTUALLY_INDISTINGUISHABLE
+ VISIBLY_DIFFERENT
+)
+
+
func NewCompareArgs() *CompareArgs {
c := new(CompareArgs)
M metric.go +9 -24
@@ 22,6 22,7 @@ import (
. "math"
"fmt"
"image/color"
+ "os"
)
/*
@@ 119,9 120,6 @@ func (xyz *XYZ) XYZToLAB(x, y, z float64
func Yee_Compare(args *CompareArgs) bool {
for i := 0; i < args.DownSample; i++ {
- if args.Verbose {
- fmt.Printf("Downsampling by %d\n", 1 << uint(i+1))
- }
tmp, err := args.ImgA.DownSample()
if err == nil {
args.ImgA = tmp
@@ 135,7 133,7 @@ func Yee_Compare(args *CompareArgs) bool
bounds := args.ImgA.Bounds()
w, h := bounds.Dx(), bounds.Dy()
if ((w != args.ImgB.Bounds().Dx()) || (h != args.ImgB.Bounds().Dy())) {
- fmt.Printf("Image dimensions do not match\n")
+ args.Result = DIMENSION_MISMATCH
return false
}
@@ 152,7 150,7 @@ func Yee_Compare(args *CompareArgs) bool
}
}
if identical {
- fmt.Printf("Images are binary identical\n")
+ args.Result = BINARY_IDENTICAL
return true
}
@@ 171,10 169,6 @@ func Yee_Compare(args *CompareArgs) bool
aB := make([]float64, dim)
bB := make([]float64, dim)
- if args.Verbose {
- fmt.Printf("Converting RGB to XYZ\n")
- }
-
var x, y int
xyz := NewXYZ()
for y = 0; y < h; y++ {
@@ 202,20 196,12 @@ func Yee_Compare(args *CompareArgs) bool
}
}
- if args.Verbose {
- fmt.Printf("Constructing Laplacian Pyramids\n")
- }
-
la := NewLPyramid(aLum, w, h)
lb := NewLPyramid(bLum, w, h)
num_one_degree_pixels := (2.0 * Tan(args.FieldOfView * 0.5 * Pi / 180.0) * 180.0 / Pi)
pixels_per_degree := float64(w) / num_one_degree_pixels
- if (args.Verbose) {
- fmt.Printf("Performing test\n")
- }
-
num_pixels := 1.0
var adaptation_level uint
for i := uint(0); i < MAX_PYR_LEVELS; i++ {
@@ 306,23 292,22 @@ func Yee_Compare(args *CompareArgs) bool
}
}
- different := fmt.Sprintf("%d pixels are different", pixels_failed)
+ args.Differing = pixels_failed
// Always output image difference if requested.
if args.ImgDiff != nil {
- if args.ImgDiff.WriteToFile(args.ImgDiff.Name) {
- fmt.Printf("Wrote difference image to %s\n", args.ImgDiff.Name)
- } else {
- fmt.Printf("Could not write difference image to %s\n", args.ImgDiff.Name)
+ err := args.ImgDiff.WriteToFile(args.ImgDiff.Name)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Could not write difference image to %s, %v\n", args.ImgDiff.Name, err.Error())
}
}
if pixels_failed < args.ThresholdPixels {
- fmt.Printf("Images are perceptually indistinguishable\n%s\n", different)
+ args.Result = PERCEPTUALLY_INDISTINGUISHABLE
return true
}
- fmt.Printf("Images are visibly different\n%s\n", different)
+ args.Result = VISIBLY_DIFFERENT
return false
}
M perceptualdiff/main.go +14 -0
@@ 47,6 47,20 @@ func main() {
passed := perceptualdiff.Yee_Compare(args)
+ switch args.Result {
+ default:
+ fmt.Printf("library returned unknown result %d\n", args.Result)
+ case perceptualdiff.BINARY_IDENTICAL:
+ fmt.Println("images are binary identical")
+ case perceptualdiff.DIMENSION_MISMATCH:
+ fmt.Println("image dimensions do not match: %v, %v", args.ImgA.Bounds(), args.ImgB.Bounds())
+ case perceptualdiff.PERCEPTUALLY_INDISTINGUISHABLE:
+ fmt.Printf("images are perceptually indistinguishable; %d pixels differ\n", args.Differing)
+ case perceptualdiff.VISIBLY_DIFFERENT:
+ fmt.Printf("images are visually different; %d pixels differ\n", args.Differing)
+ }
+
+
if passed {
os.Exit(0)
} else {
M rgbaimage.go +6 -10
@@ 1,7 1,7 @@
package perceptualdiff
import (
- "fmt"
+ "errors"
"image"
"image/color"
"image/draw"
@@ 87,28 87,24 @@ func (r *RGBAImage) DownSample() (*RGBAI
return img, nil
}
-func (r *RGBAImage) WriteToFile(filename string) bool {
+func (r *RGBAImage) WriteToFile(filename string) error {
fout, err := os.Create(filename)
if err != nil {
- fmt.Print(err)
- return false
+ return err
}
defer fout.Close()
switch path.Ext(filename) {
default:
- fmt.Printf("Can't save to unknown filetype %s\n", filename)
- fmt.Printf("Supported extensions are png, jpg, and jpeg\n")
- return false
+ return errors.New("unknown filetype "+path.Ext(filename))
case "png", "PNG":
err = png.Encode(fout, r)
case "jpg", "jpeg", "JPG", "JPEG":
err = jpeg.Encode(fout, r, &jpeg.Options{100})
}
if err != nil {
- fmt.Print(err)
- return false
+ return err
}
- return true
+ return nil
}
func ReadFromFile(filename string) (*RGBAImage, error) {