利用颜色直方图计算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; }
相关文章推荐
- 颜色直方图的计算、显示、处理、对比及反向投影(How to Use Histogram? Calculate, Show, Process, Compare and BackProject)
- OpenCV_颜色直方图的计算、显示、处理、对比及反向投影
- 利用opencv实现RGB图片滤波前和滤波后直方图显示
- OpenCV_颜色直方图的计算、显示、处理、对比及反向投影
- OpenCV_颜色直方图的计算、显示、处理、对比及反向投影
- OpenCV_颜色直方图的计算、显示、处理、对比及反向投影
- OpenCV_颜色直方图的计算、显示、处理、对比及反向投影
- OpenCV学习二十四:基于直方图的图片相似度计算函数 compareHist
- 【Shader】利用mask图片中的不同颜色通道改变模型显示
- OpenCV_颜色直方图的计算、显示、处理、对比及反向投影【转】
- 颜色直方图的计算、显示、处理、对比及反向投影(How to Use Histogram? Calculate, Show, Process, Compare and BackProject)
- 利用空间距离比较两张图片颜色的相似度
- 图像相似度计算之直方图方法OpenCV实现
- 优化ImageView,在使用ListView或GridView的时候,每次更新图片的时候,在显示新的图片和旧的图片一样大小的时候,不需要去重新计算大小
- OpenCV Python教程(3、直方图的计算与显示)
- flex4.0 利用外部项呈示器显示List信息并添加图片示例
- OpenCV 利用滚动条在不缩小的情况下显示大型图片
- 如何显示二进制流的图片(利用img控件)
- 使用base64对图片的二进制进行编码,使其可以利用ajax进行显示
- 项目实例改编:利用structs2的action 实时显示图片、pdf和其他内容的框架抽取。(转)