pHash-modu中DCT图像哈希函数的Python等价性

2024-09-29 18:59:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个现有的python程序,它接受图像URL并对加载的图像进行操作。我尝试将图像数据传递到C++中的{{1}模块,然后获得图像哈希。我尝试过使用python extension library将图像从python传递到C程序,但是没有成功。整个过程的速度是优先考虑的。它包括获取查询图像的哈希值,从大量的图像系统中找到相似的图像。所以,与其传递大量的图像数据,然后转换成CImg image对象,我觉得用python代码计算散列值,然后将散列值传递给pHash模块,以便找出相似的图像,这样会更好、更容易。所以,我期待着在Python中得到DCT图像哈希。在

有人知道如何在python中获得相同的散列值吗?我不想重新发明轮子。我试着搜索python中的等效函数,但是没有成功。以下是图像哈希函数:(来源:pHash module)

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;
}

我真的很感激你的帮助。非常感谢


Tags: 图像srcimggetreturnifchannelhash
1条回答
网友
1楼 · 发布于 2024-09-29 18:59:42

Imagehash模块有一个phash实现,但我不知道它是否与您的phash实现兼容。在

也就是说:我对phash库没有任何经验,但是c++版本可能更快(尤其是PIL不是最快的)

很抱歉把这篇文章死掉了,希望没问题

相关问题 更多 >

    热门问题