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  }