图像相似度计算之直方图方法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;
}
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实现
- 图像相似度计算之直方图方法OpenCV实现
- 图像相似度计算之直方图方法OpenCV实现
- 图像相似度计算之哈希值方法OpenCV实现
- 图像相似度计算之哈希值方法OpenCV实现
- 图像相似度计算之哈希值方法OpenCV实现
- 图像相似度计算之哈希值方法OpenCV实现
- opencv图像相似度的计算方法
- 计算图像直方图(OpenCV内置实现)
- opencv实现灰度图像的直方图点计算以及灰度直方图显示
- 计算图像直方图方法,纠正calcHist调用错误(OpenCV)
- opencv学习之(五)-直方图计算和绘制图像直方图
- opencv基于直方图实现图像检索匹配
- OpenCV2+入门系列(四):计算图像的直方图,平均灰度,灰度方差
- 余弦方法计算相似度算法实现
- OpenCV【4】---calcHist 计算图像的直方图
- 【图像处理】基于OpenCV底层实现的直方图匹配
- 字符串相似度计算的方法,使用SQL以及C#实现,本文非原创摘自网络(.NET SQL技术交流群入群206656202需注明博客园)
- 通过傅里叶变换方法求图像卷积-OpenCV实现
- OpenCV 计算图像一维直方图