82 lines
1.9 KiB
Go
82 lines
1.9 KiB
Go
package common
|
|
|
|
import (
|
|
"image"
|
|
"image/color"
|
|
"math/bits"
|
|
"math/rand"
|
|
"testing"
|
|
)
|
|
|
|
func noiseImg(seed int64) *image.Gray {
|
|
rng := rand.New(rand.NewSource(seed))
|
|
img := image.NewGray(image.Rect(0, 0, 160, 120))
|
|
for i := range img.Pix {
|
|
img.Pix[i] = uint8(rng.Intn(256))
|
|
}
|
|
return img
|
|
}
|
|
|
|
func hamming(a, b uint64) int {
|
|
return bits.OnesCount64(a ^ b)
|
|
}
|
|
|
|
// TestImageDHash64:同图哈希恒等,异噪声图哈希距离应远超相似阈值(8)
|
|
func TestImageDHash64(t *testing.T) {
|
|
h1, err := hashOf(noiseImg(1))
|
|
if err != nil {
|
|
t.Fatalf("hashOf noise: %v", err)
|
|
}
|
|
h2, err := hashOf(noiseImg(1))
|
|
if err != nil {
|
|
t.Fatalf("hashOf same noise: %v", err)
|
|
}
|
|
if h1 != h2 {
|
|
t.Fatalf("same image hash mismatch: %d vs %d", h1, h2)
|
|
}
|
|
h3, err := hashOf(noiseImg(2))
|
|
if err != nil {
|
|
t.Fatalf("hashOf other noise: %v", err)
|
|
}
|
|
if d := hamming(h1, h3); d <= 8 { // 64 位随机噪声期望距离 ~32
|
|
t.Fatalf("unrelated images too close: hamming=%d", d)
|
|
}
|
|
}
|
|
|
|
// TestImageDHash64Uniform:纯色图哈希为 0(全等帧),与另一纯色图判为同图属预期
|
|
func TestImageDHash64Uniform(t *testing.T) {
|
|
u := image.NewGray(image.Rect(0, 0, 64, 64))
|
|
for i := range u.Pix {
|
|
u.Pix[i] = 128
|
|
}
|
|
h, err := hashOf(u)
|
|
if err != nil {
|
|
t.Fatalf("hashOf uniform: %v", err)
|
|
}
|
|
if h != 0 {
|
|
t.Fatalf("uniform image hash = %d, want 0", h)
|
|
}
|
|
}
|
|
|
|
// 灰度渐变图(列渐变:左暗右亮)
|
|
func gradientImg() *image.Gray {
|
|
img := image.NewGray(image.Rect(0, 0, 90, 80))
|
|
for y := 0; y < 80; y++ {
|
|
for x := 0; x < 90; x++ {
|
|
img.SetGray(x, y, color.Gray{Y: uint8(x * 255 / 89)})
|
|
}
|
|
}
|
|
return img
|
|
}
|
|
|
|
// TestImageDHash64Gradient:行渐变每对相邻列左<右,64 位全 1
|
|
func TestImageDHash64Gradient(t *testing.T) {
|
|
h, err := hashOf(gradientImg())
|
|
if err != nil {
|
|
t.Fatalf("hashOf gradient: %v", err)
|
|
}
|
|
if bits.OnesCount64(h) != 64 {
|
|
t.Fatalf("gradient hash bits = %d, want 64 (all 1s)", bits.OnesCount64(h))
|
|
}
|
|
}
|