最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

opencv3/C++ PHash算法圖像檢索詳解

 更新時(shí)間:2019年12月11日 10:01:21   作者:阿卡蒂奧  
今天小編就為大家分享一篇opencv3/C++ PHash算法圖像檢索詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

PHash算法即感知哈希算法/Perceptual Hash algorithm,計(jì)算基于低頻的均值哈希.對(duì)每張圖像生成一個(gè)指紋字符串,通過對(duì)該字符串比較可以判斷圖像間的相似度.

PHash算法原理

將圖像轉(zhuǎn)為灰度圖,然后將圖片大小調(diào)整為32*32像素并通過DCT變換,取左上角的8*8像素區(qū)域。然后計(jì)算這64個(gè)像素的灰度值的均值。將每個(gè)像素的灰度值與均值對(duì)比,大于均值記為1,小于均值記為0,得到64位哈希值。

PHash算法實(shí)現(xiàn)

將圖片轉(zhuǎn)為灰度值

將圖片尺寸縮小為32*32

resize(src, src, Size(32, 32));

DCT變換

 Mat srcDCT; 
 dct(src, srcDCT);

計(jì)算DCT左上角8*8像素區(qū)域均值,求hash值

 double sum = 0;
 for (int i = 0; i < 8; i++)
  for (int j = 0; j < 8; j++)
   sum += srcDCT.at<float>(i,j);

 double average = sum/64;
 Mat phashcode= Mat::zeros(Size(8, 8), CV_8U);
 for (int i = 0; i < 8; i++)
  for (int j = 0; j < 8; j++)
   phashcode.at<char>(i,j) = srcDCT.at<float>(i,j) > average ? 1:0;

hash值匹配

  int d = 0;
  for (int n = 0; n < srchash.size[1]; n++)
   if (srchash.at<uchar>(0,n) != dsthash.at<uchar>(0,n)) d++; 

即,計(jì)算兩幅圖哈希值之間的漢明距離,漢明距離越大,兩圖片越不相似。

OpenCV實(shí)現(xiàn)

如圖在下圖中對(duì)比各個(gè)圖像與圖person.jpg的漢明距離,以此衡量兩圖之間的額相似度。

#include <iostream> 
#include <stdio.h>
#include <fstream>
#include <io.h>
#include <string>
#include <opencv2\opencv.hpp> 
#include <opencv2\core\core.hpp>
#include <opencv2\core\mat.hpp>
using namespace std; 
using namespace cv; 
int fingerprint(Mat src, Mat* hash);

int main()
{
 Mat src = imread("E:\\image\\image\\image\\person.jpg", 0); 
 if(src.empty())
 {
  cout << "the image is not exist" << endl; 
  return -1;
 }
 Mat srchash, dsthash;
 fingerprint(src, &srchash);
 for(int i = 1; i <= 8; i++)
 { 
  string path0 = "E:\\image\\image\\image\\person";
  string number; 
  stringstream ss; 
  ss << i; 
  ss >> number; 
  string path = "E:\\image\\image\\image\\person" + number +".jpg"; 
  Mat dst = imread(path, 0); 
  if(dst.empty())
  {
   cout << "the image is not exist" << endl; 
   return -1;
  }
  fingerprint(dst, &dsthash);
  int d = 0;
  for (int n = 0; n < srchash.size[1]; n++)
   if (srchash.at<uchar>(0,n) != dsthash.at<uchar>(0,n)) d++; 

  cout <<"person" << i <<" distance= " <<d<<"\n"; 
 }

 system("pause");
 return 0;
}


int fingerprint(Mat src, Mat* hash)
{
 resize(src, src, Size(32, 32));
 src.convertTo(src, CV_32F);
 Mat srcDCT; 
 dct(src, srcDCT);
 srcDCT = abs(srcDCT);
 double sum = 0;
 for (int i = 0; i < 8; i++)
  for (int j = 0; j < 8; j++)
   sum += srcDCT.at<float>(i,j);

 double average = sum/64;
 Mat phashcode= Mat::zeros(Size(8, 8), CV_8U);
 for (int i = 0; i < 8; i++)
  for (int j = 0; j < 8; j++)
   phashcode.at<char>(i,j) = srcDCT.at<float>(i,j) > average ? 1:0;

 *hash = phashcode.reshape(0,1).clone();
 return 0;
}

輸出漢明距離:

可以看出若將閾值設(shè)置為20則可將后三張其他圖片篩選掉。

以上這篇opencv3/C++ PHash算法圖像檢索詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實(shí)現(xiàn)遞歸函數(shù)的方法

    C++實(shí)現(xiàn)遞歸函數(shù)的方法

    在本篇內(nèi)容里小編給大家分享了關(guān)于C++實(shí)現(xiàn)遞歸函數(shù)的教學(xué)步驟,需要的朋友跟著參考下。
    2018-12-12
  • 基于樹莓派實(shí)現(xiàn)播放MP3音樂

    基于樹莓派實(shí)現(xiàn)播放MP3音樂

    這篇文章主要為大家詳細(xì)介紹了基于樹莓派實(shí)現(xiàn)播放MP3音樂,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C語言sizeof和strlen的指針和數(shù)組面試題詳解

    C語言sizeof和strlen的指針和數(shù)組面試題詳解

    strlen是函數(shù),字符串長度,不包括停止符。而sizeof則是內(nèi)存塊的大小,包括停止符。數(shù)組是一種數(shù)據(jù)類型,數(shù)據(jù)類型的本質(zhì)就是固定大小,內(nèi)存塊的別名??梢杂胹izeof()一般都是數(shù)據(jù)類型
    2022-04-04
  • C++實(shí)現(xiàn)猜數(shù)字游戲

    C++實(shí)現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++實(shí)現(xiàn)簡單的通訊錄管理系統(tǒng)

    C++實(shí)現(xiàn)簡單的通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單的通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++畫正弦線實(shí)例代碼

    C++畫正弦線實(shí)例代碼

    這篇文章主要介紹了C++畫正弦線實(shí)例代碼,是C++圖形操作程序設(shè)計(jì)中比較常見的一個(gè)技巧,需要的朋友可以參考下
    2014-10-10
  • C++實(shí)現(xiàn)LeetCode(70.爬樓梯問題)

    C++實(shí)現(xiàn)LeetCode(70.爬樓梯問題)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(70.爬樓梯問題),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt實(shí)現(xiàn)實(shí)時(shí)鼠標(biāo)繪制圖形

    Qt實(shí)現(xiàn)實(shí)時(shí)鼠標(biāo)繪制圖形

    這篇文章主要介紹了Qt中QGraphicsView架構(gòu)下如何實(shí)現(xiàn)實(shí)時(shí)鼠標(biāo)繪制圖形,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試
    2022-02-02
  • C指針原理教程之Ncurses介紹

    C指針原理教程之Ncurses介紹

    Ncurses 提供字符終端處理庫,包括面板和菜單。為了能夠使用ncurses庫,您必須在您的源程序中將curses.h包括(include)進(jìn)來,而且在編譯的需要與它連接起來. 在gcc中您可以使用參數(shù)-lcurses進(jìn)行編譯.
    2019-02-02
  • 使用MySQL編程實(shí)現(xiàn)C語言功能強(qiáng)大化步驟示例

    使用MySQL編程實(shí)現(xiàn)C語言功能強(qiáng)大化步驟示例

    這篇文章主要為大家介紹了使用MySQL編程實(shí)現(xiàn)C語言功能強(qiáng)大化步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論

盐城市| 宣恩县| 九台市| 应用必备| 阿坝| 麻栗坡县| 宁波市| 罗平县| 乌兰县| 朝阳县| 丹棱县| 沂源县| 十堰市| 娄底市| 抚顺市| 环江| 广西| 太仆寺旗| 资阳市| 梁山县| 淄博市| 屏南县| 大石桥市| 社会| 镇康县| 德兴市| 疏附县| 屏边| 莆田市| 霸州市| 马龙县| 锡林浩特市| 淮滨县| 凤山市| 徐汇区| 梅州市| 隆德县| 鹤峰县| 绥阳县| 白沙| 密山市|