搜索图片及相似度探秘 二

一在这里
搜索图片及相似度探秘 一

在这里插入图片描述

还是继续,准备了五幅图片

两个易烊千玺,两个肖战,一个地球星空
还是像上次那样,准备均值和标准差,但是这次,多了一个图片索引hash计算,这次计算的是整个图片的均值和hash,然后将缩小的图片减去均值,来求大于和小于的概率统计,因为并非真实图片的统计,是8*8 像素的图片统计,所以具有一定的概率性。ok,以下是代码

string compare_func()
{
	string retString = "{\"ret\":\"file is null\"}";
	Mat image1 = cv::imread("./y1.png", IMREAD_GRAYSCALE);
	Mat image2 = cv::imread("./y2.png", IMREAD_GRAYSCALE);
	Mat image3 = cv::imread("./x1.png", IMREAD_GRAYSCALE);
	Mat image4 = cv::imread("./x2.png", IMREAD_GRAYSCALE);
	Mat image5 = cv::imread("./earth.png", IMREAD_GRAYSCALE);	
	

	if (image1.empty() || image2.empty())
	{
		return retString;
	}
    
	Mat a1, a2,a3,a4,a5;
	cv::resize(image1, a1, cv::Size(8,8));
	cv::resize(image2, a2, cv::Size(8,8));
	cv::resize(image3, a3, cv::Size(8,8));
	cv::resize(image4, a4, cv::Size(8,8));
	cv::resize(image5, a5, cv::Size(8,8));
	Mat mat_mean1, mat_mean2, mat_mean3, mat_mean4, mat_mean5;
	Mat mat_stddev1, mat_stddev2, mat_stddev3, mat_stddev4, mat_stddev5;
	cv::meanStdDev(image1, mat_mean1, mat_stddev1);
	cv::meanStdDev(image2, mat_mean2, mat_stddev2);
	cv::meanStdDev(image3, mat_mean3, mat_stddev3);
	cv::meanStdDev(image4, mat_mean4, mat_stddev4);
	cv::meanStdDev(image5, mat_mean5, mat_stddev5);

	double m1,m2,m3,m4,m5, s1,s2,s3,s4,s5;
	m1 = mat_mean1.at<double>(0, 0);
	s1 = mat_stddev1.at<double>(0, 0);
	cout << "a1" << "灰度均值:" << m1 <<" std: "<<s1 <<endl;

	m2 = mat_mean2.at<double>(0, 0);
	s2 = mat_stddev2.at<double>(0, 0);
	cout << "a2" << "灰度均值:" << m2 << " std: " << s2 << endl;

	m3 = mat_mean3.at<double>(0, 0);
	s3 = mat_stddev3.at<double>(0, 0);
	cout << "a3" << "灰度均值:" << m3 << " std: " << s3 << endl;
	
	m4 = mat_mean4.at<double>(0, 0);
	s4 = mat_stddev4.at<double>(0, 0);
	cout << "a4" << "灰度均值:" << m4 << " std: " << s4 << endl;

	m5 = mat_mean5.at<double>(0, 0);
	s5 = mat_stddev5.at<double>(0, 0);
	cout << "a5" << "灰度均值:" << m5 << " std: " << s5 << endl;

	uint64_t v1 = 0;
	uint64_t v2 = 0;
	uint64_t v3 = 0;
	uint64_t v4 = 0;
	uint64_t v5 = 0;

	int offset = 64;


	for (int i = 0; i < 8; i++)
	{
		uchar* x = a1.ptr<uchar>(i);
		uchar* y = a2.ptr<uchar>(i);
		uchar* z = a3.ptr<uchar>(i);
		uchar* q = a4.ptr<uchar>(i);
		uchar* e = a5.ptr<uchar>(i);
		for (int j = 0; j < 8; j++)
		{
			offset--;
			if (x[j] > m1)
				v1 |= (uint64)1 << offset;
			if (y[j] > m2)
				v2 |= (uint64)1 << offset;
			if (z[j] > m3)
				v3 |= (uint64)1 << offset;
			if (q[j] > m4)
				v4 |= (uint64)1 << offset;
			if (e[j] > m5)
				v5 |= (uint64)1 << offset;
		}
	}

	int ret1 = compare_hash(v1, v2);
	int ret2 = compare_hash(v1, v3);
	int ret3 = compare_hash(v1, v4);
	int ret4 = compare_hash(v1, v5);
	cout << v1 << " " << v2<< " " << v3 <<" "<< v4 <<" "<<v5<<endl;
	cout << ret1 << " " << ret2 <<" "<< ret3<<" "<<ret4<< endl;
	imshow("1", image1);
	imshow("2", image2);
	imshow("3", image3);
	imshow("4", image4);
	imshow("5", image5);
	cv::waitKey(0);
}

比较hansh函数,每幅图是一个hash,当两幅图像的位值,也就是是0还是1,无论是0还是1,只要相等我们就将相似度加1.

int compare_hash(uint64_t target, uint64_t compare)
{
	int ret = 0;
	for (int i = 0;i < 64; i++)
	{
		uint64_t a = (target >> i) << (63 - i);
		uint64_t b = (compare >> i) << (63 - i);
		if (a == b)
			ret++;
	}
	//1100110100001001
	return ret;
}

结果:
结果
很可惜,根本就查不到相似之处,而且1和2 都是易烊千玺,3和4 都是肖战,但是均值和标准差并没有什么规律,hash值比较并没有比较出什么规律,说明方法都是失效的,ok,如何找到规律,才是我们要做的,这将在下一节继续努力,敬请期待。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 计算两张图片相似度通常的方法是计算它们之间的差异。OpenCV可以实现图像差异的计算。首先,将两张图片转换为同一尺寸的灰度图像,这可以通过将它们调整为相同的大小并将它们转换为灰度图像来实现。使用OpenCV的cv2.absdiff()函数可以计算出两张图像之间像素值的差异矩阵,然后可以使用numpy.sum()函数计算出差异矩阵的总和。最后,将总和除以两张图片的像素数得到两张图片相似度。 图像的相似度将在0到1之间,其中0表示两张图片完全不相似,1表示它们完全相同。为了得到更精确的结果,可以对差异矩阵进行平滑处理,例如使用OpenCV的cv2.GaussianBlur()函数。此外,还可以使用其他图像处理技术来提高相似度的准确性,如图像特征提取和机器学习算法。 总之,使用OpenCV计算两张图片相似度是可行的,但在实际应用中需要考虑多种因素,如图像的清晰度、背景等。 ### 回答2: OpenCV是一种计算机视觉库,用于图像处理和计算机视觉算法开发。通过使用OpenCV,可以比较两张图片相似度。如何比较两张图片相似度是一个关键问题,因为它可以应用于很多领域,如图像检索、图像分类和目标跟踪等。 在OpenCV中,可以通过哈希算法比较两张图片相似度,即将图片哈希为一个数字或字符串,然后将这些哈希值进行比较计算相似度。 另外,还可以使用特征匹配的方法对图片进行比较。通过提取图片的特征点,然后比较特征点之间的距离和方向,从而计算图片相似度。 除此之外,还有一种方法是使用深度学习技术,如卷积神经网络(CNN),通过训练网络来学习图片的特征表示,然后比较这些特征表示之间的相似度。 总的来说,在OpenCV中,可以通过多种方法比较两张图片相似度,具体的选择方法需要根据具体的应用场景和要求来决定。 ### 回答3: 相似度是根据两张图片的内容和特征来计算的。OpenCV是一个非常流行的图像处理库,可以用于计算两张图片相似度。 为了计算两张图片相似度,首先需要将它们转换为灰度图像。然后,可以使用OpenCV中的特征提取算法(例如SIFT、SURF、ORB等)来从每个图像中提取一组描述符。描述符是一个数学向量,用于描述图像的特征。将这些描述符进行比较,可以计算两张图片之间的相似度。 在比较描述符时,可以使用不同的算法来计算距离(例如欧几里得距离、曼哈顿距离等)。一个常用的算法是基于SIFT和FLANN(快速最近邻搜索)的方法,该方法可以在大型图像数据库中快速匹配图像。为了提高匹配的准确性,还可以使用一些过滤器和排除器,例如RANSAC和LO-RANSAC。 如果两张图片的描述符非常相似,它们的相似度会很高。相反,如果它们的描述符非常不同,它们的相似度会很低。因此,OpenCV可以用于计算图片之间的相似度,并且可以应用于各种应用程序,如图像搜索、图像分类和对象识别。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianbo_insist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值