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

#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;
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值