Rkruemmel's picture
Upload folder using huggingface_hub
84b7171 verified
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from skimage.metrics import structural_similarity as ssim
import cv2
# Pfade zu den Bildern
original_path = "input.jpeg"
neural_path = "kunst.webp"
# Lade die Bilder
original_image = Image.open(original_path).convert("RGB")
neural_image = Image.open(neural_path).convert("RGB")
# Größe des Originalbildes anpassen, falls nötig
neural_image_resized = neural_image.resize(original_image.size, resample=Image.LANCZOS)
# 1. Histogramm-Vergleich
original_hist, _ = np.histogram(np.array(original_image).flatten(), bins=256, range=(0, 255))
neural_hist, _ = np.histogram(np.array(neural_image_resized).flatten(), bins=256, range=(0, 255))
plt.figure(figsize=(12, 6))
plt.bar(range(256), original_hist, color='blue', alpha=0.5, label='Original')
plt.bar(range(256), neural_hist, color='red', alpha=0.5, label='Neural')
plt.title("Histogram Comparison")
plt.xlabel("Pixel Intensity")
plt.ylabel("Frequency")
plt.legend()
plt.savefig("histogram_comparison.png")
plt.close()
# 2. Kanten-Detektion
original_gray = original_image.convert("L")
neural_gray_resized = neural_image_resized.convert("L")
edges_original = cv2.Canny(np.array(original_gray), threshold1=100, threshold2=200)
edges_neural = cv2.Canny(np.array(neural_gray_resized), threshold1=100, threshold2=200)
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].imshow(edges_original, cmap="gray")
axes[0].set_title("Edges - Original Image")
axes[0].axis("off")
axes[1].imshow(edges_neural, cmap="gray")
axes[1].set_title("Edges - Neural Network Image")
axes[1].axis("off")
plt.tight_layout()
plt.savefig("edge_detection.png")
plt.close()
# 3. Differenzanalyse
original_array = np.array(original_image)
neural_array = np.array(neural_image_resized)
difference = np.abs(original_array.astype(int) - neural_array.astype(int))
difference_highlighted = np.clip(difference * 5, 0, 255).astype(np.uint8)
plt.figure(figsize=(8, 8))
plt.imshow(difference_highlighted)
plt.title("Pixel Difference (Highlighted)")
plt.axis("off")
plt.savefig("pixel_difference.png")
plt.close()
# 4. SSIM-Analyse
original_gray_cv = cv2.cvtColor(np.array(original_image), cv2.COLOR_RGB2GRAY)
neural_gray_cv = cv2.cvtColor(np.array(neural_image_resized), cv2.COLOR_RGB2GRAY)
similarity_index, diff = ssim(original_gray_cv, neural_gray_cv, full=True)
diff = (diff * 255).astype(np.uint8)
plt.figure(figsize=(8, 8))
plt.imshow(diff, cmap="gray")
plt.title(f"SSIM Difference Map (Index: {similarity_index:.4f})")
plt.axis("off")
plt.savefig("ssim_difference.png")
plt.close()
# 5. Frequenzanalyse
def plot_frequency_spectrum(image, title, save_path):
# Fourier-Transformation
image_array = np.array(image.convert("L"))
f_transform = np.fft.fft2(image_array)
f_shift = np.fft.fftshift(f_transform)
magnitude_spectrum = 20 * np.log(np.abs(f_shift) + 1)
# Darstellung
plt.figure(figsize=(8, 8))
plt.imshow(magnitude_spectrum, cmap="gray")
plt.title(title)
plt.axis("off")
plt.savefig(save_path)
plt.close()
# Analyse des Original- und Neural-Bildes
plot_frequency_spectrum(original_gray, "Frequenzspektrum - Originalbild", "frequency_spectrum_original.png")
plot_frequency_spectrum(neural_gray_resized, "Frequenzspektrum - Neural generiertes Bild", "frequency_spectrum_neural.png")
# 6. Vergleich der Frequenzbereiche
def decompose_frequency(image, title, save_path):
# Fourier-Transformation
image_array = np.array(image.convert("L"))
f_transform = np.fft.fft2(image_array)
f_shift = np.fft.fftshift(f_transform)
# Maskierung
rows, cols = f_shift.shape
crow, ccol = rows // 2, cols // 2
# Niedrige Frequenzen
low_pass = np.copy(f_shift)
low_pass[crow-50:crow+50, ccol-50:ccol+50] = 0
# Hohe Frequenzen
high_pass = f_shift - low_pass
# Rücktransformation
low_image = np.abs(np.fft.ifft2(np.fft.ifftshift(low_pass)))
high_image = np.abs(np.fft.ifft2(np.fft.ifftshift(high_pass)))
# Darstellung
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(low_image, cmap="gray")
plt.title(f"Niedrige Frequenzen - {title}")
plt.axis("off")
plt.subplot(1, 2, 2)
plt.imshow(high_image, cmap="gray")
plt.title(f"Hohe Frequenzen - {title}")
plt.axis("off")
plt.tight_layout()
plt.savefig(save_path)
plt.close()
# Analyse des Original- und Neural-Bildes
decompose_frequency(original_gray, "Originalbild", "frequency_decomposition_original.png")
decompose_frequency(neural_gray_resized, "Neural generiertes Bild", "frequency_decomposition_neural.png")
# Erweiterung: Vergleich der Farbfrequenzen
def compare_color_frequency(image1, image2, save_path):
# Zerlege beide Bilder in RGB-Komponenten
image1_array = np.array(image1)
image2_array = np.array(image2)
fig, axes = plt.subplots(3, 1, figsize=(10, 8))
colors = ['red', 'green', 'blue']
for i, color in enumerate(colors):
hist1, _ = np.histogram(image1_array[..., i].flatten(), bins=256, range=(0, 255))
hist2, _ = np.histogram(image2_array[..., i].flatten(), bins=256, range=(0, 255))
axes[i].bar(range(256), hist1, color=color, alpha=0.5, label='Original')
axes[i].bar(range(256), hist2, color=color, alpha=0.5, label='Neural')
axes[i].set_title(f"{color.capitalize()} Channel Comparison")
axes[i].legend()
plt.tight_layout()
plt.savefig(save_path)
plt.close()
# Erweiterung: Local Binary Pattern (LBP) für Texturen
def compute_lbp(image, radius=1, points=8):
from skimage.feature import local_binary_pattern
gray_image = np.array(image.convert("L"))
lbp = local_binary_pattern(gray_image, points, radius, method="uniform")
return lbp
def compare_lbp(image1, image2, save_path):
lbp1 = compute_lbp(image1)
lbp2 = compute_lbp(image2)
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].imshow(lbp1, cmap="gray")
axes[0].set_title("LBP - Original Image")
axes[0].axis("off")
axes[1].imshow(lbp2, cmap="gray")
axes[1].set_title("LBP - Neural Image")
axes[1].axis("off")
plt.tight_layout()
plt.savefig(save_path)
plt.close()
# Erweiterung: Gradient Magnitude (Unschärfeprüfung)
def compute_gradient_magnitude(image):
gray_image = np.array(image.convert("L"), dtype=float)
grad_x = np.gradient(gray_image, axis=1)
grad_y = np.gradient(gray_image, axis=0)
grad_magnitude = np.sqrt(grad_x**2 + grad_y**2)
return grad_magnitude
def compare_gradients(image1, image2, save_path):
grad1 = compute_gradient_magnitude(image1)
grad2 = compute_gradient_magnitude(image2)
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
axes[0].imshow(grad1, cmap="hot")
axes[0].set_title("Gradient Magnitude - Original Image")
axes[0].axis("off")
axes[1].imshow(grad2, cmap="hot")
axes[1].set_title("Gradient Magnitude - Neural Image")
axes[1].axis("off")
plt.tight_layout()
plt.savefig(save_path)
plt.close()
# Farbfrequenzvergleich
compare_color_frequency(original_image, neural_image_resized, "color_frequency_comparison.png")
# LBP-Analyse
compare_lbp(original_image, neural_image_resized, "lbp_comparison.png")
# Gradientenvergleich
compare_gradients(original_image, neural_image_resized, "gradient_comparison.png")
# Ergebnisse in eine Textdatei speichern
with open("comparison_results.txt", "w") as f:
f.write("Histogram Comparison:\n")
f.write(f"Original Histogram: {original_hist}\n")
f.write(f"Neural Histogram: {neural_hist}\n\n")
f.write("SSIM Analysis:\n")
f.write(f"Similarity Index: {similarity_index:.4f}\n\n")
f.write("Color Frequency Comparison:\n")
for i, color in enumerate(['red', 'green', 'blue']):
hist1, _ = np.histogram(np.array(original_image)[..., i].flatten(), bins=256, range=(0, 255))
hist2, _ = np.histogram(np.array(neural_image_resized)[..., i].flatten(), bins=256, range=(0, 255))
f.write(f"{color.capitalize()} Channel:\n")
f.write(f"Original: {hist1}\n")
f.write(f"Neural: {hist2}\n\n")
f.write("LBP Analysis:\n")
lbp1 = compute_lbp(original_image)
lbp2 = compute_lbp(neural_image_resized)
f.write(f"LBP Original: {lbp1}\n")
f.write(f"LBP Neural: {lbp2}\n\n")
f.write("Gradient Magnitude Comparison:\n")
grad1 = compute_gradient_magnitude(original_image)
grad2 = compute_gradient_magnitude(neural_image_resized)
f.write(f"Gradient Original: {grad1}\n")
f.write(f"Gradient Neural: {grad2}\n")
print("Analyse abgeschlossen. Ergebnisse sind gespeichert.")