-
Notifications
You must be signed in to change notification settings - Fork 0
/
imgdedup.go
83 lines (72 loc) · 1.86 KB
/
imgdedup.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package main
import (
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
"github.com/pkg/profile"
)
var distanceFunction = flag.String("t", "manhattan", "distance type, default manhattan")
var toleration = flag.Int("e", 100000, "distance under this value indicates that images are similar, default: 100000")
var dirpath = flag.String("d", "", "directory with images")
var verbose = flag.Bool("v", false, "turn on verbose messages")
var prof = flag.Bool("p", false, "profiling")
func main() {
flag.Parse()
if *dirpath == "" {
flag.PrintDefaults()
os.Exit(1)
}
if *prof {
defer profile.Start(profile.MemProfile, profile.ProfilePath(".")).Stop()
}
/*
switch prof {
case "cpu":
defer profile.Start(profile.CPUProfile, profile.ProfilePath(".")).Stop()
case "mem":
defer profile.Start(profile.MemProfile, profile.ProfilePath(".")).Stop()
case "block":
defer profile.Start(profile.BlockProfile, profile.ProfilePath(".")).Stop()
default:
}
*/
dir, err := filepath.Abs(*dirpath)
if err != nil {
log.Fatal(err)
}
files, err := ioutil.ReadDir(dir)
if err != nil {
log.Fatal(err)
}
hList := []*histrec{}
numFiles := len(files)
for i, f := range files {
fname := path.Join(*dirpath, f.Name())
if *verbose {
fmt.Printf("Processing (%v/%v): %v\n", i, numFiles, filepath.FromSlash(fname))
} else {
fmt.Printf("\r%d/%d", i, numFiles)
}
hist, err := histogram(fname)
if err != nil {
fmt.Printf("\r%s\n", err.Error())
} else {
hList = append(hList, hist)
}
}
fmt.Println()
distFunc := getDistanceFunction(*distanceFunction)
for i := 0; i < len(hList)-1; i++ {
for j := i + 1; j < len(hList); j++ {
distance := distFunc(hList[i].h, hList[j].h)
if distance < *toleration {
fmt.Printf("Similar: %v <-> %v dist: %v\n",
filepath.FromSlash(hList[i].n), filepath.FromSlash(hList[j].n), distance)
}
}
}
}