OpenCV学习二十四:基于直方图的图片相似度计算函数 compareHist
2018-03-07 21:01
441 查看
函数的使用很简单,直接把 OpenCV 的官方文档截取过来吧,主要是。。。懒了。。。
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace cv;
using namespace std;
char file[] = "1.jpg";
string convertToString(double d);
int main(int argc, char** argv)
{
Mat img1 = imread(file, -1);
pyrDown(img1, img1, Size(img1.cols/2, img1.rows/2));
imshow("1",img1);
Mat img20 = imread("img.jpg", -1);
imshow("2", img20);
//转到HSV
cvtColor(img1, img1, CV_BGR2HSV);
cvtColor(img20, img20, CV_BGR2HSV);
Mat img2;
img20.copyTo(img2);
//
int h_bins = 50;int 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};
MatND hist_base, hist_test1, hist_test2;
calcHist(&img1, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false);
normalize(hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat());
calcHist(&img2, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false);
normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat());
double basetest1 = compareHist(hist_base, hist_base, CV_COMP_CORREL);
double basetest2 = compareHist(hist_base, hist_test1, CV_COMP_CORREL);//相关性比较
double basetest3 = compareHist(hist_base, hist_test1, CV_COMP_CHISQR);//卡方比较
double basetest4 = compareHist(hist_base, hist_test1, CV_COMP_INTERSECT);//十字交叉性
double basetest5 = compareHist(hist_base, hist_test1, CV_COMP_BHATTACHARYYA);//巴氏距离
putText(img1, convertToString(basetest1), Point(50, 90), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
putText(img1, "Origional CORREL", Point(50, 40), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
imshow("3", img1);
imwrite("13.jpg", img1);
img20.copyTo(img2);
putText(img2, convertToString(basetest2), Point(50, 90), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
putText(img2, "CORREL", Point(50, 40), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
imshow("相关性比较", img2);
imwrite("14.jpg", img2);
img20.copyTo(img2);
putText(img2, convertToString(basetest3), Point(50, 90), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
putText(img2, "CHISQR", Point(50, 40), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
imshow("卡方比较", img2);
imwrite("15.jpg", img2);
img20.copyTo(img2);
putText(img2, convertToString(basetest4), Point(50, 90), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
putText(img2, "INTERSECT", Point(50, 40), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
imshow("十字交叉", img2);
imwrite("16.jpg", img2);
img20.copyTo(img2);
putText(img2, convertToString(basetest5), Point(50, 90), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
putText(img2, "BHATTACHARYYA", Point(50, 40), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
imshow("巴氏距离", img2);
imwrite("17.jpg", img2);
waitKey();
return 1;
}
string convertToString(double d)
{
ostringstream os;
if (os << d)
{
return os.str();
}
return "invalid conversion";
}
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace cv;
using namespace std;
char file[] = "1.jpg";
string convertToString(double d);
int main(int argc, char** argv)
{
Mat img1 = imread(file, -1);
pyrDown(img1, img1, Size(img1.cols/2, img1.rows/2));
imshow("1",img1);
Mat img20 = imread("img.jpg", -1);
imshow("2", img20);
//转到HSV
cvtColor(img1, img1, CV_BGR2HSV);
cvtColor(img20, img20, CV_BGR2HSV);
Mat img2;
img20.copyTo(img2);
//
int h_bins = 50;int 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};
MatND hist_base, hist_test1, hist_test2;
calcHist(&img1, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false);
normalize(hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat());
calcHist(&img2, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false);
normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat());
double basetest1 = compareHist(hist_base, hist_base, CV_COMP_CORREL);
double basetest2 = compareHist(hist_base, hist_test1, CV_COMP_CORREL);//相关性比较
double basetest3 = compareHist(hist_base, hist_test1, CV_COMP_CHISQR);//卡方比较
double basetest4 = compareHist(hist_base, hist_test1, CV_COMP_INTERSECT);//十字交叉性
double basetest5 = compareHist(hist_base, hist_test1, CV_COMP_BHATTACHARYYA);//巴氏距离
putText(img1, convertToString(basetest1), Point(50, 90), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
putText(img1, "Origional CORREL", Point(50, 40), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
imshow("3", img1);
imwrite("13.jpg", img1);
img20.copyTo(img2);
putText(img2, convertToString(basetest2), Point(50, 90), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
putText(img2, "CORREL", Point(50, 40), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
imshow("相关性比较", img2);
imwrite("14.jpg", img2);
img20.copyTo(img2);
putText(img2, convertToString(basetest3), Point(50, 90), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
putText(img2, "CHISQR", Point(50, 40), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
imshow("卡方比较", img2);
imwrite("15.jpg", img2);
img20.copyTo(img2);
putText(img2, convertToString(basetest4), Point(50, 90), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
putText(img2, "INTERSECT", Point(50, 40), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
imshow("十字交叉", img2);
imwrite("16.jpg", img2);
img20.copyTo(img2);
putText(img2, convertToString(basetest5), Point(50, 90), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
putText(img2, "BHATTACHARYYA", Point(50, 40), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0,0,0), 2 );
imshow("巴氏距离", img2);
imwrite("17.jpg", img2);
waitKey();
return 1;
}
string convertToString(double d)
{
ostringstream os;
if (os << d)
{
return os.str();
}
return "invalid conversion";
}
相关文章推荐
- opencv学习笔记(六)直方图比较图片相似度
- OpenCV学习笔记3:找出人脸,同时比较两张图片中的人脸相似度
- 深度学习(十六)基于2-channel network的图片相似度判别-CVPR 2015
- opencv学习之四:rgb通道的分离以及直方图的显示计算
- 转:OpenCV学习笔记3:找出人脸,同时比较两张图片中的人脸相似度
- 【OpenCV学习笔记】【函数学习】十五(批量读入图片)
- OpenCV2学习笔记(十四):基于OpenCV的图片卡通化处理
- OpenCV学习二十五:calcBackProject 直方图反射函数
- Python OpenCV学习笔记之:计算彩色图像各通道的直方图及图像区域直方图
- 【OpenCV学习笔记】二十二、直方图计算及绘制(二)
- OpenCV学习——物体跟踪的粒子滤波算法实现之计算选定区域直方图
- Python OpenCV学习笔记之:灰度图像的直方图计算
- OpenCV学习:找出人脸,同时比较两张图片中的人脸相似度
- opencv学习之(五)-直方图计算和绘制图像直方图
- OpenCV 计算图片相似度
- opencv学习-imgprocess-直方图比较compareHist
- python OpenCV学习笔记(二十四):直方图反向投影
- 利用颜色直方图计算8张图片的相似度,并按相似度的高低依次显示出图片
- opencv学习之(五)-直方图计算和绘制图像直方图
- 我的OpenCV学习笔记(14):用直方图对比完成基于内容的图像检索