日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像检索:图像拷贝检索PHash改进方案

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像检索:图像拷贝检索PHash改进方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

感知哈希是用來做圖像拷貝檢索(Copy Detection)最容易操作的一種方法,實際上除了感知哈希、均值哈希,還有很多的從圖像本身出發計算出來的圖像哈希值,在OpenCV 3.3及其以后的版本中,包含了很多圖像哈希的計算方法,具體的可以參考The module brings implementations of different image hashing algorithms,其中各種圖像哈希方法對8種不同變化的抗干擾程度,文檔中做了一個很好的總結:

從圖中可以看到,Phash具備較好的對不同變化的抗干擾性,因為在一般要求不高的圖像拷貝檢索場景中,應用得較多。下面小白菜就PHash的原理(計算步驟)、在使用中存在的問題以及改進方案做一個記錄與總結。

PHash原理

感知哈希(Perceptual Hash, PHash)比均值哈希要穩健,PHash使用DCT將圖像由空域轉為頻域,并對頻域的低頻成分進行散列化。PHash算法可分為以下幾個步驟:

  • 將圖片resize到32*32最好,這樣可以簡化DCT計算;
  • 將彩色圖像轉為灰度圖像;
  • 計算DCT,使用32*32的DCT變換;
  • DCT的結果是32*32的矩陣,只要保留左上角的8*8矩陣就可以了,因為這部分呈現了圖片中的最低頻率;
  • 計算DCT的平均值;
  • 根據8*8的DCT矩陣來與平均值進行比較,大于平均值的為1,小于的為0。
  • 注意:在保留左上角的8*8矩陣的時候,不一定非得是最左上角,可以往右下移一個或幾個像素。下面是采用PHash做拷貝檢索結果:

    可以看到,對于上面查詢,PHash能夠獲得很好的拷貝檢索準確率,但是PHash除了上面圖表所示的對椒鹽噪聲、旋轉幾乎不具有抗干擾特性外,還有其他的方面的一些局限。

    PHash的局限:PHash為了容忍圖像的一些形變而只取了圖像的低頻部分,從而造成了特征捕獲不到圖像的細節部分,使得對于純色或者近似純色圖像在做查重的時候并不是很理想。具體地說,由于PHash取的是dct的左上角部分,屬于低頻成分,也就是關注的是圖像的大致外形,沒有關注細節,所以對于純色圖片或者近似純色圖片,就沒法捕獲到它的輪廓細節,導致對純色圖像或者近似純色圖片的查重準確率不高。一種改進的方式是:把這個取的部分往右下移,這樣就可以獲得圖像的輪廓細節,純色圖像或者近似純色圖片查重準確率就會提升,壞處就是輪廓細節取多了,容忍細節變化就小了,導致圖像容忍的形變變小,但是這種思路是值得借鑒的。

    PHash特性

    PHash對噪聲、模糊、jpeg壓縮等具備較好的不變性,此外,在實際應用中還有另一類變換也是值得非常關注的,即對圖像做水平鏡像操作。PHash對鏡像不具備不變性,可以通過一個簡單的實驗予以驗證。

    實驗過程:測試了兩對圖片,每一對圖片包含圖片自身,已經其對應的鏡像圖片(圖片對的大小是一樣的,說明為jpeg壓縮影響),分別計算圖片對之間的距離,一對算出來的距離是35,一對算出來的是33。說明PHash對鏡像無召回能力。

    既然談到了圖像的鏡像變換,我們不妨對PHash、基于SIFT特征的Fisher Vector以及DL相似特征對鏡像變換是否有不變形做一個整理:

    特征形變是否抗干擾備注
    PHash特征鏡像見上面說的驗證過程
    FV特征鏡像很弱SIFT對鏡像不具備不變性,故FV對鏡像召回能力很弱,具體參考論文Flip-Invariant SIFT for Copy and Object Detection
    DL相似特征鏡像由于DL相似特征在訓練的時候,數據增強里面包含鏡像,DL相似特征對鏡像具備旋轉特性,檢索顯示的top@K里面,可以找回鏡像的視頻,見結果鏡像檢索結果

    PHash改進方案

    在前面已經提到了PHash對于純色或近似純色圖像做拷貝檢索存在的缺陷,當DCT進行散列化時如果選取的DCT的頻率過低,則對純色或近似純色圖像的拷貝檢索存在badcase,如下圖所示:

    從上圖可以看到,由于查詢圖像是接近純色的圖片,導致取得DCT的低頻只能捕獲到圖像的大致外觀,因而很多接近純色的圖片到排在了前面。對這類case的改進優化,我們知道無論是取低頻還是高頻部分做散列化都不合適,如果只取高頻,則會影響正常圖片的召回。因此,比較容易想到的一種改進方式是:對于正常的圖片,只需采用低頻DCT哈希值做排序;對于純色或近似純色圖像,先用低頻DCT哈希值檢索排序,然后再用高頻DCT哈希值檢索再做重排。這種改進方式的好處是顯而易見的,對于每一張圖片,只需要額外增加64個比特位的存儲空間,并且不用對整個拷貝檢索的架構做很大的調整,我們所要做的就是再計算一下高頻DCT的哈希值,并且增加一個對純色或接近純色的檢索服務,就能使PHash在圖像拷貝檢索上獲得較大的精度提升,同時又不至于較大的減少召回。

    對于圖像純色或接近純色的檢索,小白菜以為應該做得輕巧簡潔,因為本身PHash做拷貝檢索就是一個很輕量的服務,如果圖像純色或接近純色的檢索做的過重,比如用DL對圖像純色與非純色進行分類,就失去了用PHash做拷貝檢索的意義,另外采用還需消耗大量的GPU,因而圖像純色或接近純色的服務越輕巧越好。下面小白菜提供的一個極輕量的圖像純色或接近純色的檢索方法:

    cv::Mat imGray = cv::imread("123.jpg", CV_LOAD_IMAGE_GRAYSCALE);int histSize = 256; float range[] = {0, 255} ; const float* histRange = {range}; cv::Mat hist; cv::calcHist(&imGray, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange);cv::Mat idx; cv::sortIdx(hist, idx, CV_SORT_EVERY_COLUMN + CV_SORT_DESCENDING); cv::sort(hist, hist, CV_SORT_EVERY_COLUMN + CV_SORT_DESCENDING);float maxFre = hist.at<float>(0,0); float secFre = hist.at<float>(0,1); float allFre = cv::sum(hist)[0];float ratio1 = (maxFre + secFre)/allFre; if(ratio1 >= 0.51){cout << "pure image" << endl; }

    根據灰度測試的結果,在閾值為0.51時,粗略評估對于純色或接近純色圖像的召回率至少在85%以上,準確率在90%以上,檢測速度在10ms左右。這里,對于召回率和準確率的要求是,召回越高越好,對準確率的要求可以相對低一點,因為我們的目的是要改善純色或接近純色圖像的拷貝檢索的準確率,可以小幅犧牲點非純色圖像拷貝檢索的召回。

    改善性能驗證

    按上述所提的改進方案重排后,即:

    • 對于一個查詢,先使用低頻分量DCT哈希值進行排序;
    • 對查詢圖像進行純色或者近似純色圖像檢測,如果不是純色或者近似純色圖像,當前排序結果為最終拷貝檢索排序結果;
    • 如果是純色或者近似純色圖像,使用高頻DCT哈希值對初排結果進行重新排序,對重排序結果只保留漢明距離只小于等于某一閾值的那些結果,將其作為最終排序結果;

    下面是上面查詢圖像采用該改進方案重排后的一個結果,如下圖所示:

    從上面可以看到,經過重排后,對于純色或者接近純色圖像的拷貝檢索,結果有了很大的提升,實際中測試了很多的case,發現都能夠獲得很好的改善。

    總結

    在本篇文章中,小白菜就PHash的原理、存在的缺陷以及改進的方案做了詳細的總結,這個問題的存在以及想到的解決方法并不是憑空產生和獲得的,而是實際應用中確確實實會存在這樣或那樣的問題,需要不斷從原理上推敲,然后反復進行實驗。當然對PHash的改進應該有非常多,這種改進方案不一定是最好的,但是可以值得借鑒,希望對有需要的同學有所幫助或者啟發。

    from:?http://yongyuan.name/blog/improve-phash-for-copy-detection.html?

    總結

    以上是生活随笔為你收集整理的图像检索:图像拷贝检索PHash改进方案的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。