2013-03-05 4 views
2

У меня есть существующая программа python, которая принимает URL-адрес изображения и выполняет манипуляции с загруженным изображением. Я попытался передать данные изображения в модуль pHash на C++, а затем получить хэш изображения. Я пробовал использовать python extension library, чтобы передать изображение с питона на программу C, но безуспешно. Скорость всего процесса является приоритетом. Он включает в себя получение хэш-значения изображения запроса, поиск похожих изображений из огромной коллекции системы изображений. Таким образом, вместо передачи огромных данных изображения, а затем преобразования в объект изображения CImg, я считаю, что было бы лучше и проще просто вычислить хэш в коде python и передать значение хэша в модуль pHash для поиска похожих изображений , Итак, я с нетерпением жду, чтобы получить хэш-код DCT в Python.Python эквивалент хэш-функции DCT-изображения, используемой в модуле pHash

Кто-нибудь знает, как получить такое же значение хеша в python? Я не хочу изобретать колесо. Я пытался google и нашел эквивалентную функцию в python, но не имел успеха. Вот хэш-функция изображения: (источник: модуль pHash)

int ph_dct_imagehash(const char* file,ulong64 &hash){ 

    if (!file){ 
    return -1; 
    } 
    CImg<uint8_t> src; 
    try { 
    src.load(file); 
    } catch (CImgIOException ex){ 
    return -1; 
    } 
    CImg<float> meanfilter(7,7,1,1,1); 
    CImg<float> img; 
    if (src.spectrum() == 3){ 
     img = src.RGBtoYCbCr().channel(0).get_convolve(meanfilter); 
    } else if (src.spectrum() == 4){ 
     int width = img.width(); 
     int height = img.height(); 
     int depth = img.depth(); 
     img = src.crop(0,0,0,0,width-1,height-1,depth-1,2).RGBtoYCbCr().channel(0).get_convolve(meanfilter); 
    } else { 
     img = src.channel(0).get_convolve(meanfilter); 
    } 

    img.resize(32,32); 
    CImg<float> *C = ph_dct_matrix(32); 
    CImg<float> Ctransp = C->get_transpose(); 

    CImg<float> dctImage = (*C)*img*Ctransp; 

    CImg<float> subsec = dctImage.crop(1,1,8,8).unroll('x');; 

    float median = subsec.median(); 
    ulong64 one = 0x0000000000000001; 
    hash = 0x0000000000000000; 
    for (int i=0;i< 64;i++){ 
     float current = subsec(i); 
      if (current > median) 
      hash |= one; 
     one = one << 1; 
    } 

    delete C; 
    return 0; 
} 

Я был бы очень признателен за вашу помощь. Большое спасибо

ответ

2

Модуль Imagehash имеет реализацию фашизма, но я не знаю, совместима ли она с вашей реализацией phash.

Это говорит: У меня нет никакого опыта работы с библиотекой phash, но с ++ версия может быть быстрее (. Особ, как PIL не самый быстрый)

Извините за necroing этот пост, надеюсь, что в норме