基于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. 多指标综合评估时建议加权处理
相关推荐
我是唐青枫27 分钟前
C#.NET PInvoke 深入解析:封送、内存布局与原生互操作实战
开发语言·c#·.net
程序猿编码36 分钟前
纯C++轻量计算机视觉推理引擎:基于GGML的端侧CV模型部署技术全解析
开发语言·c++·计算机视觉·大模型·transformer
SEO_juper1 小时前
外贸多语言站最隐蔽的流量杀手:hreflang 错了,谷歌把德语页推给美国人(附审计脚本)
开发语言·前端·python·seo·独立站·谷歌优化
geovindu1 小时前
CSharp: Strategy Pattern
开发语言·后端·c#·.net·.netcore·策略模式·行为模式
Tairitsu_H2 小时前
[C++] C++11新增构造:列表初始化和std::initializer_list
开发语言·c++·c++11·构造
宣宣猪的小花园.2 小时前
【嵌入式】故障与降级:看门狗、保护机制和工程可靠性的底线
开发语言·人工智能·嵌入式硬件·机器学习
shmily麻瓜小菜鸡2 小时前
JS/TS 易踩坑知识点 — 自动分号插入(ASI)
开发语言·javascript·ecmascript
CoderYanger2 小时前
前端基础——JavaScript(WebAPI)代码案例
java·开发语言·前端·javascript·css·前端框架·html5
geovindu2 小时前
CSharp: Task Scheduler
开发语言·后端·c#·.net·.netcore
qq_401700412 小时前
Qt窗体大小控制从resize到自适应
开发语言·qt