当前位置:   article > 正文

图像相似性度量—— 归一化互信息实现_互信息相似度

互信息相似度

1. 概述

归一化互信息是度量两张图片相似度的一种表达方式,它的值越大代表两张图片的相似性越高。通常用来作为图像配准中的评判准则或是目标函数。它在两幅图像的灰度级数相似的情况下有良好的配准精度,较高的可靠性;但是同时存在计算量大实时性差的不足。:这里的实现是基于Opencv2的。
原理是分别计算图像A,B的信息熵,再计算联合的信息熵。

然后代入公式计算归一化信息熵。这里的联合概率密度P(a,b)具体指的是A图像的灰度级a在图像的相同坐标下在图像B中灰度级为b的像素点的个数与总点数的比值。

2. 实现

  1. //************************************************************************
  2. // 函数名称: GetMutualInfo
  3. // 访问权限: public
  4. // 创建日期: 2016/12/09
  5. // 创 建 人:
  6. // 函数说明: 计算输入图像A和输入图像B的互信息
  7. // 函数参数: cv::Mat & img_a 输入图像A
  8. // 函数参数: cv::Mat & img_b 输入图像B
  9. // 返 回 值: double
  10. //************************************************************************
  11. double CCalcMutualInfo::GetMutualInfo(cv::Mat& img_a, cv::Mat& img_b)
  12. {
  13. if (!img_a.data || !img_b.data)
  14. {
  15. cout << "no input img" << endl;
  16. return 0.0;
  17. }
  18. if (img_a.rows!=img_a.rows || img_a.cols!=img_b.cols)
  19. {
  20. cout << "input img's row and cosl not eqaul" << endl;
  21. return 0.0;
  22. }
  23. int rows(img_a.rows);
  24. int cols(img_b.cols);
  25. int total_pixel(rows*cols);
  26. unsigned char* data_a = nullptr;
  27. unsigned char* data_b = nullptr;
  28. double value(0.0); //计算得到的互信息的结果
  29. double H_a(0.0), H_b(0.0), H_ab(0.0); //图像A,B或是AB的信息熵
  30. double* count_array_a = new double[256];
  31. memset(count_array_a, 0, sizeof(double)*256);
  32. double* count_array_b = new double[256];
  33. memset(count_array_b, 0, sizeof(double)* 256);
  34. double* count_array_ab = new double[256*256];
  35. memset(count_array_ab, 0, sizeof(double)* 256 * 256);
  36. //计算H_a, H_b
  37. for (int i=0; i<rows; i++)
  38. {
  39. data_a = img_a.ptr<unsigned char>(i);
  40. data_b = img_b.ptr<unsigned char>(i);
  41. for (int j=0; j<cols; j++)
  42. {
  43. count_array_a[data_a[j]]++;
  44. count_array_b[data_b[j]]++;
  45. }
  46. }
  47. for (int i=0; i<255; i++)
  48. {
  49. if (0.0 != count_array_a[i])
  50. {
  51. double p(count_array_a[i] / (double)total_pixel);
  52. H_a = H_a + (-1.0*p*(std::log(p) / std::log(2)));
  53. }
  54. if (0.0 != count_array_b[i])
  55. {
  56. double p(count_array_b[i] / (double)total_pixel);
  57. H_b = H_b + (-1.0*p*(std::log(p) / std::log(2)));
  58. }
  59. }
  60. //计算H_ab
  61. for (int m = 0; m < 256; m++) //8位的灰度级
  62. {
  63. for (int n = 0; n < 256; n++)
  64. {
  65. for (int i = 0; i < rows; i++)
  66. {
  67. data_a = img_a.ptr<unsigned char>(i);
  68. data_b = img_b.ptr<unsigned char>(i);
  69. for (int j = 0; j < cols; j++)
  70. {
  71. //if ((std::abs(m-data_a[j])<20) && (std::abs(n-data_b[j])<20))
  72. if ((m == data_a[j]) && (n == data_b[j])) //由联合概率密度的实际物理意义,统计点数
  73. {
  74. count_array_ab[m*256 + n]++;
  75. }
  76. }
  77. }
  78. }
  79. }
  80. for (int m = 0; m < 256; m++)
  81. {
  82. for (int n = 0; n < 256; n++)
  83. {
  84. if (0.0 != count_array_ab[m*256 + n])
  85. {
  86. double p(count_array_ab[m*256 + n] / (double)total_pixel);
  87. H_ab = H_ab + (-1.0*p*(std::log(p) / std::log(2)));
  88. }
  89. }
  90. }
  91. value = (H_a + H_b) / H_ab; //得出归一化互信息
  92. delete[] count_array_a;
  93. delete[] count_array_b;
  94. delete[] count_array_ab;
  95. count_array_ab = nullptr;
  96. count_array_a = nullptr;
  97. count_array_b = nullptr;
  98. return value;
  99. }



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/239058
推荐阅读
相关标签
  

闽ICP备14008679号