基于MATLAB的图像融合评价指标实现方案

基于MATLAB的图像融合评价指标实现方案,包含PSNR、SSIM、MI、AG、SF等核心指标的代码实现及原理详解


一、核心指标实现代码

1. 峰值信噪比(PSNR)
matlab 复制代码
function psnr_val = calculate_psnr(img1, img2)
    % 计算峰值信噪比(单位:dB)
    if size(img1,3) == 3
        img1 = rgb2gray(img1);
        img2 = rgb2gray(img2);
    end
    img1 = im2double(img1);
    img2 = im2double(img2);
    
    mse = mean((img1(:) - img2(:)).^2);
    if mse == 0
        psnr_val = Inf;
    else
        max_pixel = 1; % 归一化到[0,1]范围
        psnr_val = 10 * log10(1 / mse);
    end
end
2. 结构相似性指数(SSIM)
matlab 复制代码
function ssim_val = calculate_ssim(img1, img2)
    % 计算结构相似性指数
    if size(img1,3) == 3
        img1 = rgb2gray(img1);
        img2 = rgb2gray(img2);
    end
    img1 = im2double(img1);
    img2 = im2double(img2);
    
    [m, n] = size(img1);
    window = fspecial('gaussian', [11 11], 1.5);
    K = [0.01 0.03];
    L = 1;
    
    C1 = (K(1)*L)^2;
    C2 = (K(2)*L)^2;
    
    mu1 = filter2(window, img1, 'valid');
    mu2 = filter2(window, img2, 'valid');
    
    mu1_sq = mu1.^2;
    mu2_sq = mu2.^2;
    mu1_mu2 = mu1 .* mu2;
    
    sigma1_sq = filter2(window, img1.^2, 'valid') - mu1_sq;
    sigma2_sq = filter2(window, img2.^2, 'valid') - mu2_sq;
    sigma12 = filter2(window, img1 .* img2, 'valid') - mu1_mu2;
    
    numerator = (2*mu1_mu2 + C1) .* (2*sigma12 + C2);
    denominator = (mu1_sq + mu2_sq + C1) .* (sigma1_sq + sigma2_sq + C2);
    
    ssim_map = numerator ./ denominator;
    ssim_val = mean(ssim_map(:));
end
3. 互信息(MI)
matlab 复制代码
function mi_val = calculate_mutual_information(img1, img2, num_bins)
    % 计算互信息量
    if size(img1,3) == 3
        img1 = rgb2gray(img1);
        img2 = rgb2gray(img2);
    end
    img1 = im2double(img1);
    img2 = im2double(img2);
    
    [counts1, ~] = imhist(img1, num_bins);
    [counts2, ~] = imhist(img2, num_bins);
    [joint_counts, ~, ~] = imhist2(img1, img2, num_bins);
    
    p1 = counts1 / numel(img1);
    p2 = counts2 / numel(img2);
    p_joint = joint_counts / numel(img1);
    
    H1 = -sum(p1(p1 > 0) .* log2(p1(p1 > 0)));
    H2 = -sum(p2(p2 > 0) .* log2(p2(p2 > 0)));
    H_joint = -sum(p_joint(p_joint > 0) .* log2(p_joint(p_joint > 0)));
    
    mi_val = H1 + H2 - H_joint;
end
4. 平均梯度(AG)
matlab 复制代码
function ag_val = calculate_average_gradient(img)
    % 计算平均梯度(清晰度指标)
    if size(img,3) == 3
        img = rgb2gray(img);
    end
    img = im2double(img);
    
    [dx, dy] = gradient(img);
    gradient = sqrt(dx.^2 + dy.^2);
    ag_val = mean(gradient(:));
end
5. 空间频率(SF)
matlab 复制代码
function sf_val = calculate_spatial_frequency(img)
    % 计算空间频率
    if size(img,3) == 3
        img = rgb2gray(img);
    end
    img = im2double(img);
    
    [rows, cols] = size(img);
    RF = 0;
    CF = 0;
    
    for i = 1:rows
        for j = 2:cols
            RF = RF + (img(i,j) - img(i,j-1))^2;
        end
    end
    
    for j = 1:cols
        for i = 2:rows
            CF = CF + (img(i,j) - img(i-1,j))^2;
        end
    end
    
    sf_val = sqrt(RF/(rows*cols) + CF/(rows*cols));
end

二、综合评估函数

matlab 复制代码
function metrics = evaluate_fusion(reference, fused, source1, source2)
    % 综合评估融合质量
    metrics = struct();
    
    % 转换为双精度浮点型
    reference = im2double(reference);
    fused = im2double(fused);
    source1 = im2double(source1);
    source2 = im2double(source2);
    
    % 计算各项指标
    metrics.PSNR = calculate_psnr(reference, fused);
    metrics.SSIM = calculate_ssim(reference, fused);
    metrics.MI = calculate_mutual_information(source1, fused, 256) + ...
                 calculate_mutual_information(source2, fused, 256);
    metrics.AG = calculate_average_gradient(fused);
    metrics.SF = calculate_spatial_frequency(fused);
    metrics.STD = std(fused(:));
end

三、使用示例

matlab 复制代码
% 读取图像
reference = imread('source1.jpg');
source2 = imread('source2.jpg');
fused = imread('fused_image.jpg');

% 计算指标
results = evaluate_fusion(reference, fused, source1, source2);

% 输出结果
fprintf('=== 融合质量评估结果 ===
');
fprintf('PSNR: %.4f dB\n', results.PSNR);
fprintf('SSIM: %.4f\n', results.SSIM);
fprintf('MI: %.4f\n', results.MI);
fprintf('AG: %.4f\n', results.AG);
fprintf('SF: %.4f\n', results.SF);
fprintf('STD: %.4f\n', results.STD);

四、关键参数说明

指标名称 取值范围 最佳值 物理意义
PSNR [0, ∞) >30 dB 图像失真程度
SSIM [0, 1] 接近1 结构相似性程度
MI [0, ∞) 越高越好 信息保留程度
AG [0, ∞) 越高越好 图像清晰度
SF [0, ∞) 越高越好 灰度变化频率
STD [0, 1] 越高越好 细节丰富程度

参考代码 图像融合的评价指标程序代码 www.youwenfan.com/contentcso/79017.html

五、注意事项

  1. 输入图像需为相同尺寸
  2. 彩色图像建议先转换为灰度图
  3. MI计算需保证图像数据类型为双精度
  4. 多指标综合评估时建议加权处理
相关推荐
瑾修2 小时前
golang查找cpu过高的函数
开发语言·后端·golang
kkkAloha2 小时前
JS笔记汇总
开发语言·javascript·笔记
LawrenceLan8 小时前
Flutter 零基础入门(十一):空安全(Null Safety)基础
开发语言·flutter·dart
txinyu的博客9 小时前
解析业务层的key冲突问题
开发语言·c++·分布式
码不停蹄Zzz9 小时前
C语言第1章
c语言·开发语言
行者969 小时前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿蒙Amon9 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
SmartRadio10 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词10 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派10 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习