基于MATLAB的图像融合评价指标实现方案,包含PSNR、SSIM、MI、AG、SF等核心指标的代码实现及原理详解
一、核心指标实现代码
1. 峰值信噪比(PSNR)
function psnr_val = calculate_psnr(img1, img2)% 计算峰值信噪比(单位:dB)if size(img1,3) == 3img1 = rgb2gray(img1);img2 = rgb2gray(img2);endimg1 = im2double(img1);img2 = im2double(img2);mse = mean((img1(:) - img2(:)).^2);if mse == 0psnr_val = Inf;elsemax_pixel = 1; % 归一化到[0,1]范围psnr_val = 10 * log10(1 / mse);end
end
2. 结构相似性指数(SSIM)
function ssim_val = calculate_ssim(img1, img2)% 计算结构相似性指数if size(img1,3) == 3img1 = rgb2gray(img1);img2 = rgb2gray(img2);endimg1 = 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)
function mi_val = calculate_mutual_information(img1, img2, num_bins)% 计算互信息量if size(img1,3) == 3img1 = rgb2gray(img1);img2 = rgb2gray(img2);endimg1 = 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)
function ag_val = calculate_average_gradient(img)% 计算平均梯度(清晰度指标)if size(img,3) == 3img = rgb2gray(img);endimg = im2double(img);[dx, dy] = gradient(img);gradient = sqrt(dx.^2 + dy.^2);ag_val = mean(gradient(:));
end
5. 空间频率(SF)
function sf_val = calculate_spatial_frequency(img)% 计算空间频率if size(img,3) == 3img = rgb2gray(img);endimg = im2double(img);[rows, cols] = size(img);RF = 0;CF = 0;for i = 1:rowsfor j = 2:colsRF = RF + (img(i,j) - img(i,j-1))^2;endendfor j = 1:colsfor i = 2:rowsCF = CF + (img(i,j) - img(i-1,j))^2;endendsf_val = sqrt(RF/(rows*cols) + CF/(rows*cols));
end
二、综合评估函数
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
三、使用示例
% 读取图像
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/contentcnk/79017.html
五、注意事项
- 输入图像需为相同尺寸
 - 彩色图像建议先转换为灰度图
 - MI计算需保证图像数据类型为双精度
 - 多指标综合评估时建议加权处理