基于MATLAB的图像融合评价指标实现方案
基于MATLAB的图像融合评价指标实现方案,包含PSNR、SSIM、MI、AG、SF等核心指标的代码实现及原理详解
一、核心指标实现代码
1. 峰值信噪比(PSNR)
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)
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)
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)
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)
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
二、综合评估函数
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计算需保证图像数据类型为双精度
- 多指标综合评估时建议加权处理

浙公网安备 33010602011771号