基于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. 多指标综合评估时建议加权处理
相关推荐
LDR0063 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术3 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园3 天前
C++20 Modules 模块详解
java·开发语言·spring
xiao5kou4chang6kai43 天前
MATLAB机器学习、深度学习--从数据预处理到模型训练
深度学习·机器学习·matlab·数据预处理
swordbob3 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享3 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.3 天前
C语言--day30
c语言·开发语言
何以解忧,唯有..3 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽3 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下3 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php