2016-07-19 1 views
0

У меня есть служба, которая сравнивает два закодирована base64 строки изображенияСравнение строк base64 изображения в Golang

Моя первая попытка показала, что есть различия в метаданных в то время как фактическое изображение (JPG) в этом случае совпадает (размер, разрешение , размеры и т.д.).

Есть ли способ отделить большую часть динамических метаданных, чтобы я мог просто сравнить визуальный аспект изображения?

В настоящее время я использую следующие ...

package converter 

import (
    "bufio" 
    "encoding/base64" 
    "log" 
    "os" 
) 

func Base64(path string) (string, error) { 
    imgFile, err := os.Open(path) 
    if err != nil { 
     log.Fatalln(err) 
    } 

    defer imgFile.Close() 

    // create a new buffer base on file size 
    fInfo, _ := imgFile.Stat() 
    var size int64 = fInfo.Size() 
    buf := make([]byte, size) 

    // read file content into buffer 
    fReader := bufio.NewReader(imgFile) 
    fReader.Read(buf) 

    // convert the buffer bytes to base64 string - use buf.Bytes() for new image 
    imgBase64Str := base64.StdEncoding.EncodeToString(buf) 

    return imgBase64Str,nil 
} 
+3

jpeg - сжатие с потерями и зависит от кодировщика/декодера, поэтому вы не можете точно сравнивать данные изображения с различными файлами jpeg (а сравнение визуального сходства - очень большой вопрос для ответа SO). Однако, если размер файла точно такой же, то вы, вероятно, имеете одинаковое изображение и неправильно сравниваете base64. (также гораздо эффективнее сравнивать хэш, почему сравнивать данные всего изображения?) – JimB

+0

Две возможности: 1) фактические данные изображения идентичны, и только заголовки разные, и 2) изображение * выглядит * тем же, но фактически различаются на уровне данных изображения. Для первого вы должны убрать метаданные и сравнить только данные изображения. Для этого потребуется некоторое знание формата JPEG. Для последнего вам понадобится какой-то алгоритм «хеширования изображения», например. PhotoDNA. Эти алгоритмы хэш-изображения визуально и предназначены для надежного масштабирования и вращения. – smarx

ответ

1

Perceptual Hash библиотека для вычисления phash; хэш изображения, основанный на визуальных характеристиках. github.com/carlogit/phash - воплощение голанга. Он имеет функции для создания и сравнения двух хэшей, чтобы дать «расстояние», указывающее на то, как разнородны два изображения.

Из интереса я дал ему попробовать, он прост в использовании и эффективен с помощью некоторых тестовых изображений. Например:

QueenstownQueenstowndistance: 0

QueenstownQueenstown Golddistance: 2

QueenstownHomer Saddledistance: 32

package main 

import (
    "fmt" 
    "log" 
    "os" 

    "github.com/carlogit/phash" 
) 

func main() { 
    if len(os.Args) < 3 { 
     log.Fatalf("usage: %s <ImageFileA> <ImageFileB>\n", os.Args[0]) 
    } 

    a := hash(os.Args[1]) 
    b := hash(os.Args[2]) 
    distance := phash.GetDistance(a, b) 

    fmt.Printf("distance: %d\n", distance) 
} 

//hash returns a phash of the image 
func hash(filename string) string { 
    img, err := os.Open(filename) 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer img.Close() 

    ahash, err := phash.GetHash(img) 
    if err != nil { 
     log.Fatal(err) 
    } 
    return ahash 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^