圖像類似度計算之直方圖方法OpenCV實現

操做步驟:code

1.      載入圖像(灰度圖或者彩色圖),並使其大小一致;orm

2.      若爲彩色圖,增進行顏色空間變換,從RGB轉換到HSV,若爲灰度圖則無需變換;ip

3.      若爲灰度圖,直接計算其直方圖,並進行直方圖歸一化;string

4.      若爲彩色圖,則計算其彩色直方圖,並進行彩色直方圖歸一化;it

5.      使用類似度公式,如相關係數、卡方、相交或巴氏距離,計算出類似度值。form

string strSrcImageName = "src.jpg";  
  
cv::Mat matSrc, matSrc1, matSrc2;  
  
matSrc = cv::imread(strSrcImageName, CV_LOAD_IMAGE_UNCHANGED);  
  
cv::resize(matSrc, matSrc1, cv::Size(357, 419), 0, 0, cv::INTER_NEAREST);  
cv::resize(matSrc, matSrc2, cv::Size(2177, 3233), 0, 0, cv::INTER_LANCZOS4);  
  
cv::Mat matDst1, matDst2;  
cv::Size sizeImage = cv::Size(500, 500);   
  
cv::resize(matSrc1, matDst1, sizeImage, 0, 0, cv::INTER_CUBIC);  
//cv::flip(matDst1, matDst1, 1);  
cv::resize(matSrc2, matDst2, sizeImage, 0, 0, cv::INTER_CUBIC);  
  
if (matSrc.channels() == 1) {  
    int histSize = 256;  
    float range[] = {0, 256};  
    const float* histRange = {range};  
    bool uniform = true;  
    bool accumulate = false;  
  
    cv::Mat hist1, hist2;  
  
    cv::calcHist(&matDst1, 1, 0, cv::Mat(), hist1, 1, &histSize, &histRange, uniform, accumulate);  
    cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());  
  
    cv::calcHist(&matDst2, 1, 0, cv::Mat(), hist2, 1, &histSize, &histRange, uniform, accumulate);  
    cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());  
  
    double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL);//,CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYYA  
  
    cout<<"similarity = "<<dSimilarity<<endl;  
} else {  
    cv::cvtColor(matDst1, matDst1, cv::COLOR_BGR2HSV);  
    cv::cvtColor(matDst2, matDst2, cv::COLOR_BGR2HSV);  
  
    int h_bins = 50, s_bins = 60;  
    int histSize[] = {h_bins, s_bins};  
    float h_ranges[] = {0, 180};  
    float s_ranges[] = {0, 256};  
    const float* ranges[] = {h_ranges, s_ranges};  
    int channels[] = {0, 1};  
  
    cv::MatND hist1, hist2;  
  
    cv::calcHist(&matDst1, 1, channels, cv::Mat(), hist1, 2, histSize, ranges, true, false);  
    cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());  
  
    cv::calcHist(&matDst2, 1, channels, cv::Mat(), hist2, 2, histSize, ranges, true, false);  
    cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());  
  
    double dSimilarity = cv::compareHist(hist1, hist2, CV_COMP_CORREL);  
  
    cout<<"similarity = "<<dSimilarity<<endl;  
}
相關文章
相關標籤/搜索