图像相似性度量—— 归一化互信息实现
实现 图像 度量 归一化 相似性
2023-09-11 14:22:29 时间
1. 概述
归一化互信息是度量两张图片相似度的一种表达方式,它的值越大代表两张图片的相似性越高。通常用来作为图像配准中的评判准则或是目标函数。它在两幅图像的灰度级数相似的情况下有良好的配准精度,较高的可靠性;但是同时存在计算量大,实时性差的不足。注:这里的实现是基于Opencv2的。
原理是分别计算图像A,B的信息熵,再计算联合的信息熵。
然后代入公式计算归一化信息熵。这里的联合概率密度P(a,b)具体指的是A图像的灰度级a在图像的相同坐标下在图像B中灰度级为b的像素点的个数与总点数的比值。
2. 实现
//************************************************************************
// 函数名称: GetMutualInfo
// 访问权限: public
// 创建日期: 2016/12/09
// 创 建 人:
// 函数说明: 计算输入图像A和输入图像B的互信息
// 函数参数: cv::Mat & img_a 输入图像A
// 函数参数: cv::Mat & img_b 输入图像B
// 返 回 值: double
//************************************************************************
double CCalcMutualInfo::GetMutualInfo(cv::Mat& img_a, cv::Mat& img_b)
{
if (!img_a.data || !img_b.data)
{
cout << "no input img" << endl;
return 0.0;
}
if (img_a.rows!=img_a.rows || img_a.cols!=img_b.cols)
{
cout << "input img's row and cosl not eqaul" << endl;
return 0.0;
}
int rows(img_a.rows);
int cols(img_b.cols);
int total_pixel(rows*cols);
unsigned char* data_a = nullptr;
unsigned char* data_b = nullptr;
double value(0.0); //计算得到的互信息的结果
double H_a(0.0), H_b(0.0), H_ab(0.0); //图像A,B或是AB的信息熵
double* count_array_a = new double[256];
memset(count_array_a, 0, sizeof(double)*256);
double* count_array_b = new double[256];
memset(count_array_b, 0, sizeof(double)* 256);
double* count_array_ab = new double[256*256];
memset(count_array_ab, 0, sizeof(double)* 256 * 256);
//计算H_a, H_b
for (int i=0; i<rows; i++)
{
data_a = img_a.ptr<unsigned char>(i);
data_b = img_b.ptr<unsigned char>(i);
for (int j=0; j<cols; j++)
{
count_array_a[data_a[j]]++;
count_array_b[data_b[j]]++;
}
}
for (int i=0; i<255; i++)
{
if (0.0 != count_array_a[i])
{
double p(count_array_a[i] / (double)total_pixel);
H_a = H_a + (-1.0*p*(std::log(p) / std::log(2)));
}
if (0.0 != count_array_b[i])
{
double p(count_array_b[i] / (double)total_pixel);
H_b = H_b + (-1.0*p*(std::log(p) / std::log(2)));
}
}
//计算H_ab
for (int m = 0; m < 256; m++) //8位的灰度级
{
for (int n = 0; n < 256; n++)
{
for (int i = 0; i < rows; i++)
{
data_a = img_a.ptr<unsigned char>(i);
data_b = img_b.ptr<unsigned char>(i);
for (int j = 0; j < cols; j++)
{
//if ((std::abs(m-data_a[j])<20) && (std::abs(n-data_b[j])<20))
if ((m == data_a[j]) && (n == data_b[j])) //由联合概率密度的实际物理意义,统计点数
{
count_array_ab[m*256 + n]++;
}
}
}
}
}
for (int m = 0; m < 256; m++)
{
for (int n = 0; n < 256; n++)
{
if (0.0 != count_array_ab[m*256 + n])
{
double p(count_array_ab[m*256 + n] / (double)total_pixel);
H_ab = H_ab + (-1.0*p*(std::log(p) / std::log(2)));
}
}
}
value = (H_a + H_b) / H_ab; //得出归一化互信息
delete[] count_array_a;
delete[] count_array_b;
delete[] count_array_ab;
count_array_ab = nullptr;
count_array_a = nullptr;
count_array_b = nullptr;
return value;
}
相关文章
- java实现动态验证码源代码——绘制验证码的jsp
- java通过commons-fileupload实现多张图片的上传(servlet)
- 这么说吧,java线程池的实现原理其实很简单
- Java实现 LeetCode 832 翻转图像(位运算)
- Java实现 LeetCode 835 图像重叠(暴力)
- java实现海盗比酒量
- java实现 蓝桥杯 算法提高 Problem S4: Interesting Numbers 加强版
- nginx利用lua实现nginx反向代理proxy_store缓存文件自删除
- Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
- .atitit.web 推送实现解决方案集合(3)----dwr3 Reverse Ajax
- ML之Hash_EditDistance:基于输入图片哈希化(均值哈希+差值哈希)即8*8个元素的单向vector利用编辑距离算法实现计算图像相似度案例
- CV之FD之HOG:图像检测之基于HOG算法、简介、代码实现(计算图像相似度)之详细攻略
- CV之IG之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成带背景的不同尺寸高质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)案例
- Interview:算法岗位面试—10.12上午—上海某科技公司图像算法岗位(偏图像算法,互联网AI行业)技术面试考点之LoR逻辑回归的底层代码实现、特征图计算公式
- 【图像处理】基于MATLAB的小波变换DWT图像检索(实现)
- InternImage实战:使用InternImage实现图像分类任务(一)
- MicroNet实战:使用MicroNet实现图像分类(一)
- MixNet实战:使用MixNet实现图像分类(二)
- Python图像处理丨三种实现图像形态学转化运算模式
- 【LeetCode Python实现】635. 设计日志存储系统(中等)
- Matlab实现Hough变换检測图像中的直线
- 多线程有几种实现方法,都是什么?同步的方法有几种,都是什么?
- 向量类模板的声明和实现---扩充版本
- 模型实战(6)之Alex实现图像分类:模型原理+训练+预测(详细教程!)