2013-03-05 10 views
2

이미지 URL을 허용하고로드 된 이미지에서 조작을 수행하는 기존의 Python 프로그램이 있습니다. 이미지 데이터를 C++의 pHash 모듈에 전달한 다음 이미지 해시를 가져 왔습니다. 나는 python extension library을 사용하여 파이썬에서 C 프로그램으로 이미지를 전달하려고했지만 성공하지는 못했습니다. 전체 프로세스의 속도가 우선 순위입니다. 여기에는 쿼리 이미지의 해시 값을 가져 와서 거대한 이미지 시스템 컬렉션에서 유사한 이미지를 찾는 작업이 포함됩니다. 따라서 대용량 이미지 데이터를 전달하는 대신 CImg 이미지 객체로 변환하는 대신 파이썬 코드에서 해시를 계산하고 해시 값을 pHash 모듈로 전달하여 유사한 이미지를 찾아내는 것이 더 쉽고 쉬울 것이라고 생각합니다. . 그래서 저는 파이썬에서 DCT 이미지 해시를 얻길 기대하고 있습니다.Pyash 모듈에서 사용 된 DCT 이미지 해시 함수와 동일한 의미입니다.

누구든지 파이썬에서 동일한 해시 값을 얻는 방법을 알고 있습니까? 나는 바퀴를 발명하고 싶지 않다. 나는 구글로 파이썬에서 동등한 함수를 찾지 만 성공하지 못했다. 다음은 이미지 해시 함수입니다 (출처 : 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 가장 빠른 아니므로 ESP)이 게시물을 necroing 죄송

을 나는 phash 라이브러리 어떤 경험을 가지고 있지 않지만, C++ 버전이 더 빠를 수도, 희망 OK입니다.