评价指标
This commit is contained in:
		
							
								
								
									
										74
									
								
								image_fusion/evaluate_module/evaluate.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								image_fusion/evaluate_module/evaluate.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
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
 | 
			
		||||
		Reference in New Issue
	
	Block a user