我有一个现有的python程序,它接受一个图像URL并对加载的图像进行操作。我尝试将图像数据传递到C ++中的pHash模块,然后获取图像哈希。我尝试使用python extension library将图像从python传递给C程序,但没有成功。整个过程的速度是一个优先事项。它包括获取查询图像的哈希值,从大量图像系统中查找相似图像。所以,不是传递巨大的图像数据,而是转换为CImg图像对象,我觉得在python代码中计算哈希值会更好更容易,并将哈希值传递给pHash模块以找出相似的图像。所以,我期待在Python中获得DCT图像哈希。
有没有人知道如何在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;
}
我真的很感谢你的帮助。非常感谢
答案 0 :(得分:2)
Imagehash模块具有phash的实现,但我不知道它是否与您的phash实现兼容。
那说:我没有使用phash库的经验,但c ++版本可能更快(特别是因为PIL不是最快的)
很抱歉找到这篇文章,希望没问题