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

利用颜色直方图计算8张图片的相似度,并按相似度的高低依次显示出图片

2018-01-28 10:11 387 查看
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
int main()
{

Mat srcImage_test1, hsvImage_test1;
Mat srcImage_test2, hsvImage_test2;
Mat srcImage_test3, hsvImage_test3;
Mat srcImage_test4, hsvImage_test4;
Mat srcImage_test5, hsvImage_test5;
Mat srcImage_test6, hsvImage_test6;
Mat srcImage_test7, hsvImage_test7;
Mat srcImage_test8, hsvImage_test8;

srcImage_test1 = imread("C:\\Users\\dell\\Desktop\\zhifangtu\\1.jpg", 1);
srcImage_test2 = imread("C:\\Users\\dell\\Desktop\\zhifangtu\\2.jpg", 1);
srcImage_test3 = imread("C:\\Users\\dell\\Desktop\\zhifangtu\\3.jpg", 1);
srcImage_test4 = imread("C:\\Users\\dell\\Desktop\\zhifangtu\\4.jpg", 1);
srcImage_test5 = imread("C:\\Users\\dell\\Desktop\\zhifangtu\\5.jpg", 1);
srcImage_test6 = imread("C:\\Users\\dell\\Desktop\\zhifangtu\\6.jpg", 1);
srcImage_test7 = imread("C:\\Users\\dell\\Desktop\\zhifangtu\\7.jpg", 1);
srcImage_test8 = imread("C:\\Users\\dell\\Desktop\\zhifangtu\\8.jpg", 1);

//将图像由BGR色彩空间转换到 HSV色彩空间
cvtColor(srcImage_test1, hsvImage_test1, COLOR_BGR2HSV);
cvtColor(srcImage_test2, hsvImage_test2, COLOR_BGR2HSV);
cvtColor(srcImage_test3, hsvImage_test3, COLOR_BGR2HSV);
cvtColor(srcImage_test4, hsvImage_test4, COLOR_BGR2HSV);
cvtColor(srcImage_test5, hsvImage_test5, COLOR_BGR2HSV);
cvtColor(srcImage_test6, hsvImage_test6, COLOR_BGR2HSV);
cvtColor(srcImage_test7, hsvImage_test7, COLOR_BGR2HSV);
cvtColor(srcImage_test8, hsvImage_test8, COLOR_BGR2HSV);

//初始化计算直方图需要的实参
//对hue通道使用30个bin,对saturatoin通道使用32个bin
int h_bins = 50; int s_bins = 60;
int histSize[] = { h_bins, s_bins };
// hue的取值范围从0到256, saturation取值范围从0到180
float h_ranges[] = { 0, 256 };
float s_ranges[] = { 0, 180 };
const float* ranges[] = { h_ranges, s_ranges };
// 使用第0和第1通道
int channels[] = { 0, 1 };

// 创建储存直方图的 MatND 类:
MatND baseHist;
MatND testHist1;
MatND testHist2;
MatND testHist3;
MatND testHist4;
MatND testHist5;
MatND testHist6;
MatND testHist7;
MatND testHist8;
// 计算基准图像,两张测试图像,半身基准图像的HSV直方图:
calcHist(&hsvImage_test1, 1, channels, Mat(), testHist1, 1, histSize, ranges, true, false);
calcHist(&hsvImage_test2, 1, channels, Mat(), testHist2, 1, histSize, ranges, true, false);
calcHist(&hsvImage_test3, 1, channels, Mat(), testHist3, 1, histSize, ranges, true, false);
calcHist(&hsvImage_test4, 1, channels, Mat(), testHist4, 1, histSize, ranges, true, false);
calcHist(&hsvImage_test5, 1, channels, Mat(), testHist5, 1, histSize, ranges, true, false);
calcHist(&hsvImage_test6, 1, channels, Mat(), testHist6, 1, histSize, ranges, true, false);
calcHist(&hsvImage_test7, 1, channels, Mat(), testHist7, 1, histSize, ranges, true, false);
calcHist(&hsvImage_test8, 1, channels, Mat(), testHist8, 1, histSize, ranges, true, false);

//按顺序使用4种对比标准将基准图像的直方图与其余各直方图进行对比:
double base_test[8];
double b[8], temp;
int i, j, a[8];
base_test[0] = compareHist(testHist1, testHist1, 0);
base_test[1] = compareHist(testHist1, testHist2, 0);
base_test[2] = compareHist(testHist1, testHist3, 0);
base_test[3] = compareHist(testHist1, testHist4, 0);
base_test[4] = compareHist(testHist1, testHist5, 0);
base_test[5] = compareHist(testHist1, testHist6, 0);
base_test[6] = compareHist(testHist1, testHist7, 0);
base_test[7] = compareHist(testHist1, testHist8, 0);

printf("【测试图1 - 测试图1】:  %f \n【测试图1 - 测试图2】:  %f \n【测试图1 - 测试图3】:  %f \n【测试图1 - 测试图4】: % f \n【测试图1 - 测试图5】: % f \n【测试图1 - 测试图6】: % f \n【测试图1 - 测试图7】: % f \n【测试图1 - 测试图8】: % f \n",base_test[0], base_test[1],base_test[2], base_test[3], base_test[4], base_test[5], base_test[6], base_test[7]);
//printf("检测结束。");
for (i = 0; i < 8; i++) {//输入数组,并用b保存数组a的值;
b[i] = base_test[i];
}
for (i = 0; i < 8; i++) {//对a从大到小冒泡排序
for (j = 0; j < 7 - i; j++)
if (base_test[j] < base_test[j + 1]) {
temp = base_test[j];
base_test[j] = base_test[j + 1];
base_test[j + 1] = temp;
}

}
for (i = 0; i<8; i++)//输出排序后的a
printf("%f ", base_test[i]);
printf("\n");

for (i = 0; i < 8; i++) {//遍历找出以前的位置
for (j = 0; j < 8; j++) {
if (base_test[i] == b[j])
{
a[i] = j;
switch (j)
{
case 1:
imshow("test2", srcImage_test2);
break;
case 2:
imshow("test3", srcImage_test3);
break;
case 3:
imshow("test4", srcImage_test4);
break;
case 4:
imshow("test5", srcImage_test5);
break;
case 5:
imshow("test6", srcImage_test6);
break;
case 6:
imshow("test7", srcImage_test7);
break;
case 7:
imshow("test8", srcImage_test8);
break;
default:
imshow("test1", srcImage_test1);
}
}
}
waitKey(0);
}

waitKey(0);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐