您的位置:首页 > 运维架构

图像相似度计算之直方图方法OpenCV实现

2017-02-09 11:46 951 查看
操作步骤:
1.      载入图像(灰度图或者彩色图),并使其大小一致;
2.      若为彩色图,增进行颜色空间变换,从RGB转换到HSV,若为灰度图则无需变换;
3.      若为灰度图,直接计算其直方图,并进行直方图归一化;
4.      若为彩色图,则计算其彩色直方图,并进行彩色直方图归一化;
5.      使用相似度公式,如相关系数、卡方、相交或巴氏距离,计算出相似度值。

[cpp] view
plain copy

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;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv