Spaces:
Sleeping
Sleeping
File size: 3,941 Bytes
b08d464 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
import cv2
import numpy as np
class ImageComparison:
def __init__(self, original, mosaic):
self.original = np.array(original)
self.mosaic = np.array(mosaic)
def compute_similarity_metrics(self):
# Resize the images to the same dimensions
original = cv2.resize(self.original, (self.mosaic.shape[1], self.mosaic.shape[0]))
# Compute Mean Squared Error (MSE) (lower is better)
mse_score = np.mean((original - self.mosaic) ** 2)
# Compute Peak Signal-to-Noise Ratio (PSNR) (higher is better)
psnr_score = cv2.PSNR(original, self.mosaic)
# Compute Histogram Comparison (Correlation, Chi-Square, Intersection, Bhattacharyya)
hist_original = cv2.calcHist([original], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
hist_mosaic = cv2.calcHist([self.mosaic], [0, 1, 2], None, [256, 256, 256], [0, 256, 0, 256, 0, 256])
hist_original = cv2.normalize(hist_original, hist_original).flatten()
hist_mosaic = cv2.normalize(hist_mosaic, hist_mosaic).flatten()
correlation = cv2.compareHist(hist_original, hist_mosaic, cv2.HISTCMP_CORREL)
chi_square = cv2.compareHist(hist_original, hist_mosaic, cv2.HISTCMP_CHISQR)
intersection = cv2.compareHist(hist_original, hist_mosaic, cv2.HISTCMP_INTERSECT)
bhattacharyya = cv2.compareHist(hist_original, hist_mosaic, cv2.HISTCMP_BHATTACHARYYA)
return {
"MSE": mse_score,
"PSNR": psnr_score,
"Histogram Correlation": correlation,
"Histogram Chi-Square": chi_square,
"Histogram Intersection": intersection,
"Histogram Bhattacharyya": bhattacharyya
}
def generate_metrics_explanation(self):
"""
Provides explanations for the computed similarity metrics values.
Args:
metrics: Dictionary containing the computed metric values
Returns:
String containing human-readable explanations of the metrics
"""
explanations = []
metrics = self.compute_similarity_metrics()
# MSE Explanation
mse = metrics["MSE"]
explanations.append(f"Mean Squared Error (MSE): {mse:.2f}")
explanations.append("- Lower values indicate more similarity between images")
explanations.append("- A value of 0 would mean identical images")
# PSNR Explanation
psnr = metrics["PSNR"]
explanations.append(f"\nPeak Signal-to-Noise Ratio (PSNR): {psnr:.2f} dB")
explanations.append("- Higher values indicate better image quality")
explanations.append("- Typical values are between 30-50 dB, where higher is better")
# Histogram Correlation Explanation
correlation = metrics["Histogram Correlation"]
explanations.append(f"\nHistogram Correlation: {correlation:.4f}")
explanations.append("- Values range from -1 to 1")
explanations.append("- 1 indicates perfect correlation, -1 perfect negative correlation")
# Chi-Square Explanation
chi_square = metrics["Histogram Chi-Square"]
explanations.append(f"\nHistogram Chi-Square: {chi_square:.4f}")
explanations.append("- Lower values indicate better matches")
explanations.append("- 0 would indicate a perfect match")
# Intersection Explanation
intersection = metrics["Histogram Intersection"]
explanations.append(f"\nHistogram Intersection: {intersection:.4f}")
explanations.append("- Higher values indicate better matches")
# Bhattacharyya Explanation
bhattacharyya = metrics["Histogram Bhattacharyya"]
explanations.append(f"\nBhattacharyya Distance: {bhattacharyya:.4f}")
explanations.append("- Lower values indicate better matches")
explanations.append("- 0 would indicate a perfect match")
return "\n".join(explanations) |