github.com/dolotech/hongbao@v0.0.0-20191130105438-fd59d7a5dda5/src/utils/imgo/recog.go (about) 1 package imgo 2 3 import ( 4 "bytes" 5 ) 6 7 import( 8 "math" 9 ) 10 11 12 //calculate Cosine Similarity of two images, input two file path 13 func CosineSimilarityBytes(src1 , src2 []byte)(cossimi float64,err error){ 14 matrix1,err1:=ResizeForMatrixBytes(src1,80,60) 15 if err1 != nil { 16 err = err1 17 return 18 } 19 20 matrix2,err2:=ResizeForMatrixBytes(src2,80,60) 21 if err2 != nil { 22 err = err2 23 return 24 } 25 26 myx:=Matrix2Vector(matrix1) 27 myy:=Matrix2Vector(matrix2) 28 cos1:=Dot(myx,myy) 29 cos21:=math.Sqrt(Dot(myx,myx)) 30 cos22:=math.Sqrt(Dot(myy,myy)) 31 32 cossimi = cos1/(cos21*cos22) 33 return 34 } 35 36 //calculate Cosine Similarity of two images, input two file path 37 func CosineSimilarity(src1 string, src2 string)(cossimi float64,err error){ 38 matrix1,err1:=ResizeForMatrix(src1,80,60) 39 if err1 != nil { 40 err = err1 41 return 42 } 43 44 matrix2,err2:=ResizeForMatrix(src2,80,60) 45 if err2 != nil { 46 err = err2 47 return 48 } 49 50 myx:=Matrix2Vector(matrix1) 51 myy:=Matrix2Vector(matrix2) 52 cos1:=Dot(myx,myy) 53 cos21:=math.Sqrt(Dot(myx,myx)) 54 cos22:=math.Sqrt(Dot(myy,myy)) 55 56 cossimi = cos1/(cos21*cos22) 57 return 58 } 59 60 //binaryzation process of image matrix , threshold can use 127 to test 61 func Binaryzation(src [][][]uint8, threshold int) [][][]uint8 { 62 imgMatrix := RGB2Gray(src) 63 64 height:=len(imgMatrix) 65 width:=len(imgMatrix[0]) 66 for i:=0; i<height; i++ { 67 for j:=0; j<width; j++ { 68 var rgb int = int(imgMatrix[i][j][0])+int(imgMatrix[i][j][1])+int(imgMatrix[i][j][2]) 69 if rgb > threshold { 70 rgb = 255 71 }else{ 72 rgb = 0 73 } 74 imgMatrix[i][j][0]=uint8(rgb) 75 imgMatrix[i][j][1]=uint8(rgb) 76 imgMatrix[i][j][2]=uint8(rgb) 77 } 78 } 79 80 return imgMatrix 81 } 82 83 //GetFingerprint use Perceptual Hash Algorithm to get fingerprint from a pircture 84 func GetFingerprint(src string) (fp string, err error) { 85 imgMatrix, err1 := ResizeForMatrix(src,8,8) 86 if err1 != nil { 87 return "",err1 88 } 89 90 //convert RGB to Gray 91 h,w := len(imgMatrix),len(imgMatrix[0]) 92 gray := make([]byte, w*h) 93 for x:=0; x<w; x++ { 94 for y:=0; y<h; y++ { 95 gray[x+y*8] = byte((imgMatrix[x][y][0]*30+imgMatrix[x][y][1]*59+imgMatrix[x][y][2]*11)/100) 96 } 97 } 98 99 //calculate average value of color of picture 100 sum := 0 101 for _, v := range gray { 102 sum += int(v) 103 } 104 avg := byte(sum / len(gray)) 105 106 var buffer bytes.Buffer 107 for _, v := range gray { 108 if avg >= v { 109 buffer.WriteByte('1') 110 } else { 111 buffer.WriteByte('0') 112 } 113 } 114 fp = buffer.String() 115 return 116 }