图像相似度计算之哈希值方法OpenCV实现
来源:互联网 发布:沟通软件 编辑:程序博客网 时间:2024/06/05 18:03
感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个“指纹”(fingerprint)字符串,然后比较不同图像的指纹。结果越接近,就说明图像越相似。
实现步骤:
1. 缩小尺寸:将图像缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图像的细节,只保留结构/明暗等基本信息,摒弃不同尺寸/比例带来的图像差异;
2. 简化色彩:将缩小后的图像,转为64级灰度,即所有像素点总共只有64种颜色;
3. 计算平均值:计算所有64个像素的灰度平均值;
4. 比较像素的灰度:将每个像素的灰度,与平均值进行比较,大于或等于平均值记为1,小于平均值记为0;
5. 计算哈希值:将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图像的指纹。组合的次序并不重要,只要保证所有图像都采用同样次序就行了;
6. 得到指纹以后,就可以对比不同的图像,看看64位中有多少位是不一样的。在理论上,这等同于”汉明距离”(Hamming distance,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数)。如果不相同的数据位数不超过5,就说明两张图像很相似;如果大于10,就说明这是两张不同的图像。
以上内容摘自:http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html
下面是用OpenCV实现的测试代码:
string strSrcImageName = "src.jpg";cv::Mat matSrc, matSrc1, matSrc2;matSrc = cv::imread(strSrcImageName, CV_LOAD_IMAGE_COLOR);CV_Assert(matSrc.channels() == 3);cv::resize(matSrc, matSrc1, cv::Size(357, 419), 0, 0, cv::INTER_NEAREST);//cv::flip(matSrc1, matSrc1, 1);cv::resize(matSrc, matSrc2, cv::Size(2177, 3233), 0, 0, cv::INTER_LANCZOS4);cv::Mat matDst1, matDst2;cv::resize(matSrc1, matDst1, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);cv::resize(matSrc2, matDst2, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);cv::cvtColor(matDst1, matDst1, CV_BGR2GRAY);cv::cvtColor(matDst2, matDst2, CV_BGR2GRAY);int iAvg1 = 0, iAvg2 = 0;int arr1[64], arr2[64];for (int i = 0; i < 8; i++) {uchar* data1 = matDst1.ptr<uchar>(i);uchar* data2 = matDst2.ptr<uchar>(i);int tmp = i * 8;for (int j = 0; j < 8; j++) {int tmp1 = tmp + j;arr1[tmp1] = data1[j] / 4 * 4;arr2[tmp1] = data2[j] / 4 * 4;iAvg1 += arr1[tmp1];iAvg2 += arr2[tmp1];}}iAvg1 /= 64;iAvg2 /= 64;for (int i = 0; i < 64; i++) {arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;arr2[i] = (arr2[i] >= iAvg2) ? 1 : 0;}int iDiffNum = 0;for (int i = 0; i < 64; i++)if (arr1[i] != arr2[i])++iDiffNum;cout<<"iDiffNum = "<<iDiffNum<<endl;if (iDiffNum <= 5)cout<<"two images are very similar!"<<endl;else if (iDiffNum > 10)cout<<"they are two different images!"<<endl;elsecout<<"two image are somewhat similar!"<<endl;
0 1
- 图像相似度计算之哈希值方法OpenCV实现
- 图像相似度计算之哈希值方法OpenCV实现
- 图像相似度计算之直方图方法OpenCV实现
- 图像相似度计算之直方图方法OpenCV实现
- 图像相似度计算之直方图方法OpenCV实现
- 计算图像相似度
- 图像相似度计算
- 图像相似度计算
- 图像相似度计算
- 图像相似度计算
- 图像相似度计算
- 图像相似度计算
- 图像相似度计算
- 余弦方法计算相似度算法实现
- 余弦方法计算相似度算法实现
- 哈希算法实现图像相似度比较(Python&OpenCV)
- OpenCV 图像相似度匹配之感知哈希算法
- OpenCV 计算图片相似度
- C/C++时间函数的使用
- freebsd平台编译openwrt
- 知识点
- iOS开发导航控制器下不同视图控制器之间切换:利用CATrasition和view的layer层来实现自定义的动画效果
- MFC为工具栏中的工具设置提示信息
- 图像相似度计算之哈希值方法OpenCV实现
- HTML5实现文件上传进度条显示
- 那些微笑,你还记得吗
- django cpu监控之二-----csv文件读取
- The Center of Gravity
- 《泰晤士报》百本新经典童书推荐-0-3岁宝宝阅读
- 疯狂Java讲义之内部类(二)
- Android基础系列之Service(一)
- 难度和量度