opencv 矩阵的相似性对比 (图片之间比较)

http://blog.csdn.net/zxlstudio/article/details/10024175?utm_source=tuicool&utm_medium=referral

 

opencv 矩阵的相似性对比 (图片之间比较)



  1558人阅读  评论(0)  收藏  举报
  分类:
 

测试图片:

    

 

code:

[cpp]  view plain  copy
  1. #include <opencv\cv.h>  
  2. #include <opencv\highgui.h>  
  3. #include <opencv\cxcore.h>  
  4. #include <stdlib.h>  
  5. #include <stdio.h>  
  6.   
  7.   
  8.   
  9. /* 
  10. *函数功能:获取输入图像 的轮廓 
  11. * 
  12. *输入:  
  13. *srcIn : 单通道图像 
  14. * 
  15. *返回: 
  16. *CvSeq* : 存储轮廓信息 
  17. * 
  18. */  
  19.    
  20. CvSeq* getImageContour(IplImage* srcIn){  
  21.    
  22.     IplImage* src;  
  23.     src = cvCreateImage(cvGetSize(srcIn),8,1);  
  24.   
  25.     //拷贝图像   
  26.     cvCopy(srcIn,src);  
  27.    
  28.     //创建空间   
  29.     CvMemStorage* mem = cvCreateMemStorage(0);  
  30.     //结构体 (mem和seq属于同一个地址<当释放的时候只要释放一个就行了>)  
  31.     CvSeq* seq;  
  32.    
  33.     if(!mem){  
  34.         printf("mem is null");  
  35.     }  
  36.    
  37.     //二值化图像  
  38.     cvThreshold(src,src,100,255,0);  
  39.    
  40.     //计算图像轮廓 计算后的轮廓信息不能释放 在后面需要用到  
  41.     cvFindContours(src,mem,&seq,sizeof(CvContour),CV_RETR_CCOMP);  
  42.    
  43.     //释放图像空间  
  44.     cvReleaseImage(&src);  
  45.    
  46.     //返回轮廓信息  
  47.      return seq;  
  48.    
  49. }  
  50.    
  51.   
  52.   
  53.   
  54. int main(int argc, char* argv[]){  
  55.    
  56.     //加载图像1  
  57.     IplImage* src1 = cvLoadImage("C:\\Users\\zxl\\Desktop\\1.png",CV_LOAD_IMAGE_GRAYSCALE);  
  58.     //获取图像1的轮廓  
  59.     CvSeq* contour1;  
  60.     contour1 = getImageContour(src1);  
  61.   
  62.   
  63.     //加载图像2  
  64.     IplImage* src2 = cvLoadImage("C:\\Users\\zxl\\Desktop\\3.png",CV_LOAD_IMAGE_GRAYSCALE);  
  65.     //获取图像2的轮廓  
  66.     CvSeq* contour2;  
  67.     contour2 = getImageContour(src2);  
  68.    
  69.   
  70.     //进行比对  -- 比较这两个轮廓所对应的HU矩的距离 有多远  
  71.     double result;  
  72.     //cvMatchShapes函数参数(轮廓1,轮廓2,方法)  
  73.     //计算第一个轮廓的普通矩和中心距 , 然后计算这个矩形的HU矩(HU距的7个数值保存在ma的数组里)  
  74.     //的哥个轮廓同上(HU距保存在mb中)   
  75.     //然后比较这两个HU距的相似性   
  76.     //方法参数有3个 参数分别是1,2,3 三种计算方法  
  77.     result = cvMatchShapes(contour1,contour2,1);  
  78.   
  79.     //输出结果 结果越小 相似度越高  
  80.     printf("result is %f \n",result);  
  81.    
  82.     //释放轮廓存储空间  
  83.     cvReleaseMemStorage(&contour1->storage);  
  84.     cvReleaseMemStorage(&contour2->storage);  
  85.    
  86.     //释放图像空间  
  87.     cvReleaseImage(&src1);  
  88.     cvReleaseImage(&src2);  
  89.       
  90.     return 0;  
  91.    
  92. }  
  93.    


 



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值