Graduation-Project/image_fusion/evaluate_module/evaluate.py
2025-04-21 17:51:32 +08:00

75 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import numpy as np
import cv2
from skimage.metrics import structural_similarity as ssim
from skimage.filters import sobel
from sklearn.metrics import mutual_info_score
# Helper to compute mutual information between two grayscale images
def evaluate_mutual_information(img1_gray, img2_gray):
hist_2d, _, _ = np.histogram2d(img1_gray.ravel(), img2_gray.ravel(), bins=256)
pxy = hist_2d / float(np.sum(hist_2d))
px = np.sum(pxy, axis=1)
py = np.sum(pxy, axis=0)
px_py = np.outer(px, py)
nzs = pxy > 0
mi = np.sum(pxy[nzs] * np.log(pxy[nzs] / px_py[nzs]))
return mi
# Compute SSIM between two grayscale images
def evaluate_registration_ssim(img1_gray, img2_gray):
return ssim(img1_gray, img2_gray)
# Entropy of grayscale image (fusion quality)
def evaluate_fusion_entropy(fusion_img):
gray = cv2.cvtColor(fusion_img, cv2.COLOR_RGB2GRAY)
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])
hist = hist.ravel() / hist.sum()
entropy = -np.sum(hist * np.log2(hist + 1e-9))
return entropy
# Edge strength using Sobel (fusion quality)
def evaluate_fusion_edges(fusion_img):
gray = cv2.cvtColor(fusion_img, cv2.COLOR_RGB2GRAY)
edges = sobel(gray.astype(float) / 255.0)
return np.mean(edges)
# SSIM between fused image and one of the sources
def evaluate_fusion_ssim(fusion_img, reference_img):
fusion_gray = cv2.cvtColor(fusion_img, cv2.COLOR_RGB2GRAY)
ref_gray = cv2.cvtColor(reference_img, cv2.COLOR_RGB2GRAY)
return ssim(fusion_gray, ref_gray)
# Return all in one place (stub images would be required to test)
def summarize_evaluation(img1_gray, img2_gray, fusion_img, ref_img_for_ssim):
return {
"Registration SSIM": evaluate_registration_ssim(img1_gray, img2_gray),
"Mutual Information": evaluate_mutual_information(img1_gray, img2_gray),
"Fusion Entropy": evaluate_fusion_entropy(fusion_img),
"Fusion Edge Strength": evaluate_fusion_edges(fusion_img),
"Fusion SSIM (vs Ref)": evaluate_fusion_ssim(fusion_img, ref_img_for_ssim),
}
# 将所有评价封装成一个高层函数 evaluate_all
def evaluate_all(img1_gray, img2_gray, fusion_img, ref_img_for_ssim, verbose=True):
"""
评估图像配准和融合质量的通用函数
:param img1_gray: 可见光灰度图像(原图)
:param img2_gray: 红外灰度图像(配准后)
:param fusion_img: 融合图像RGB
:param ref_img_for_ssim: 可见光RGB图用于对比SSIM
:param verbose: 是否打印结果
:return: dict 评价指标结果
"""
results = summarize_evaluation(img1_gray, img2_gray, fusion_img, ref_img_for_ssim)
if verbose:
print("图像评价指标如下:")
for k, v in results.items():
print(f"{k}: {v:.4f}")
return results