openCV与C++的图像识别(五)——颜色直方图输出相似度

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/vivien1997/article/details/102723713
两张军装图  0.393316
吴京截取图  0.956293
两张敬礼图  0.519365
军装和夜景  0.627251

#include "StdAfx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
using namespace cv;
void getRGBvector(const Mat&src, vector<unsigned int>& count)//得到64维向量
{
	int nRows = src.rows,nCols = src.cols * src.channels();
	const uchar* p;
	for (int i = 0; i < nRows; ++i)
	{
		p = src.ptr<uchar>(i);
		for (int j = 0; j < nCols; j += 3)
		{
			int r = int(p[j])/64;    
			int g = int(p[j + 1])/64;
			int b = int(p[j + 2])/64;
			count[r * 16 + g * 4 + b]++;
		}
	}
}
double getVectorLength(vector<unsigned int> &vec)
{
	long float res = 0;
	for (int i = 0; i < vec.size(); i++)
		res += vec[i] * vec[i];
	return sqrt(res);
}
double getcos(vector<unsigned int> &count1, vector<unsigned int> &count2)
{
	double len1 = getVectorLength(count1);
	double len2 = getVectorLength(count2);
	assert(len1 != 0 && len2 != 0);
	long long sum = 0;
	for (int i = 0; i < count1.size(); i++)
		sum += count1[i] * count2[i];
	return (double)sum / len1 / len2 >0 ? (double)sum / len1 / len2:0;
}
double getsimilarity(const Mat&src1, const Mat&src2)
{
	vector<unsigned int> count1(64), count2(64);
	getRGBvector(src1, count1);
	getRGBvector(src2, count2);
	double res = getcos(count1, count2);
	return res;
}
int main()
{
	Mat src1 = imread("F://army//person.jpg",1),src2 = imread("F://army//person4.jpg", 1);
	imshow("src1", src1),imshow("src2", src2);
	double res = getsimilarity(src1,src2);
	cout << res << endl;
	waitKey(0);

}












//以下是尝试的一段运行不了的代码,但也有借鉴意义
/*
ahash,全称叫做average hash,应该是phash(perceptual hash, 感知哈希)算法的一种。
主要用于由图像的缩略图搜原图,对于图像的旋转、平移、对比度和微变形等都无能为力,所以很局限。
*/

#include<opencv2/opencv.hpp>
#include<bitset>
using namespace std;
using namespace cv;
#define hashlength 64
const int size = 8;
void alike(Mat_<uchar> img, bitset<hashlength> &vec){

	float temp = 0;
	for (int i = 0; i < size; i++){
		for (int j = 0; j < size; j++){
			temp += img(i, j);
		}
	}
	float average = temp / hashlength;
	cout << average << endl;
	for (int i = 0; i < size; i++){
		int pos = i * size;
		for (int j = 0; j < size; j++){
			vec[pos + j] = img(i, j) >= average ? 1 : 0;
		}
	}
}

int main(){
	Mat img = imread("F://army//person.jpg");
	Mat img1 = imread("F://army//person4.jpg");

	resize(img, img, Size(size, size));
	cvtColor(img, img, CV_BGR2GRAY);
	resize(img1, img1, Size(size, size));
	cvtColor(img1, img1, CV_BGR2GRAY);

	bitset<hashlength> hash_vec;
	bitset<hashlength> hash_vec_;
	alike(img,hash_vec);
	alike(img1,hash_vec_);

	int num = 0;
	for (int i = 0; i < hashlength; i++){
		cout << hash_vec.at(i);
	}
	cout << endl;
	for (int i = 0; i < hashlength; i++){
		cout << hash_vec_.at(i);
		num += hash_vec[i] == hash_vec_[i] ? 0 : 1;
	}
	cout << endl;
	cout << num << endl;
	cout << "相似性:"<< (float)(hashlength-num )/ hashlength;
	cin.get();
	return 0;
}
}

猜你喜欢

转载自blog.csdn.net/vivien1997/article/details/102723713
今日推荐