У меня есть существующая программа 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;
}
Я был бы очень признателен за вашу помощь. Большое спасибо