aihot  2017-05-26 18:27:20  OpenCV |   查看评论   

 操作步骤:

 
1.      载入图像(灰度图或者彩色图),并使其大小一致;
 
2.      若为彩色图,增进行颜色空间变换,从RGB转换到HSV,若为灰度图则无需变换;
 
3.      若为灰度图,直接计算其直方图,并进行直方图归一化;
 
4.      若为彩色图,则计算其彩色直方图,并进行彩色直方图归一化;
 
5.      使用相似度公式,如相关系数、卡方、相交或巴氏距离,计算出相似度值。
 
  1. string strSrcImageName = "src.jpg";  
  2.   
  3. cv::Mat matSrc, matSrc1, matSrc2;  
  4.   
  5. matSrc = cv::imread(strSrcImageName, CV_LOAD_IMAGE_UNCHANGED);  
  6.   
  7. cv::resize(matSrc, matSrc1, cv::Size(357, 419), 0, 0, cv::INTER_NEAREST);  
  8. cv::resize(matSrc, matSrc2, cv::Size(2177, 3233), 0, 0, cv::INTER_LANCZOS4);  
  9.   
  10. cv::Mat matDst1, matDst2;  
  11. cv::Size sizeImage = cv::Size(500, 500);   
  12.   
  13. cv::resize(matSrc1, matDst1, sizeImage, 0, 0, cv::INTER_CUBIC);  
  14. //cv::flip(matDst1, matDst1, 1);  
  15. cv::resize(matSrc2, matDst2, sizeImage, 0, 0, cv::INTER_CUBIC);  
  16.   
  17. if (matSrc.channels() == 1) {  
  18.     int histSize = 256;  
  19.     float range[] = {0, 256};  
  20.     const float* histRange = {range};  
  21.     bool uniform = true;  
  22.     bool accumulate = false;  
  23.   
  24.     cv::Mat hist1, hist2;  
  25.   
  26.     cv::calcHist(&matDst1, 1, 0, cv::Mat(), hist1, 1, &histSize, &histRange, uniform, accumulate);  
  27.     cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());  
  28.   
  29.     cv::calcHist(&matDst2, 1, 0, cv::Mat(), hist2, 1, &histSize, &histRange, uniform, accumulate);  
  30.     cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());  
  31.   
  32.     double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL);//,CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYYA  
  33.   
  34.     cout<<"similarity = "<<dSimilarity<<endl;  
  35. else {  
  36.     cv::cvtColor(matDst1, matDst1, cv::COLOR_BGR2HSV);  
  37.     cv::cvtColor(matDst2, matDst2, cv::COLOR_BGR2HSV);  
  38.   
  39.     int h_bins = 50, s_bins = 60;  
  40.     int histSize[] = {h_bins, s_bins};  
  41.     float h_ranges[] = {0, 180};  
  42.     float s_ranges[] = {0, 256};  
  43.     const float* ranges[] = {h_ranges, s_ranges};  
  44.     int channels[] = {0, 1};  
  45.   
  46.     cv::MatND hist1, hist2;  
  47.   
  48.     cv::calcHist(&matDst1, 1, channels, cv::Mat(), hist1, 2, histSize, ranges, truefalse);  
  49.     cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());  
  50.   
  51.     cv::calcHist(&matDst2, 1, channels, cv::Mat(), hist2, 2, histSize, ranges, truefalse);  
  52.     cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());  
  53.   
  54.     double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL);  
  55.   
  56.     cout<<"similarity = "<<dSimilarity<<endl;  
  57. }  
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自图像相似度计算之直方图方法OpenCV实现

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]