import os import cv2 import numpy as np # 高斯模糊 def image_blur(image,ksize): if image is None: raise ValueError("Image is not loaded correctly.") gaussian_blur = cv2.GaussianBlur(image, (ksize, ksize), 0) return gaussian_blur # 椒盐噪声 def add_salt_pepper(image, salt_prob=0.05, pepper_prob=0.05): noisy = image.copy() # 添加盐噪声 salt = np.random.randint(0, 256, size=image.shape[:2]) noisy[salt < salt_prob*255] = 255 # 添加椒噪声 pepper = np.random.randint(0, 256, size=image.shape[:2]) noisy[pepper < pepper_prob*255] = 0 return noisy # Brenner 梯度函数计算 def brenner(img): ''' :param img: narray 二维灰度图像 :return: int 图像越清晰越大 ''' return int(np.sum((img[:-2, :] - img[2:, :]) ** 2)) # Laplacian 梯度函数计算 def Laplacian(img): ''' :param img: narray 二维灰度图像 :return: int 图像越清晰越大 ''' return int(cv2.Laplacian(img, cv2.CV_64F).var()) # SMD 梯度函数计算 def SMD(img): ''' :param img: narray 二维灰度图像 :return: int 图像越清晰越大 ''' diff_x = np.abs(img[1:-1, :] - img[:-2, :]) diff_y = np.abs(img[1:, :] - img[:-1, :]) return int(np.sum(diff_x) + np.sum(diff_y)) # SMD2 函数计算 def SMD2(img): ''' :param img: narray 二维灰度图像 :return: int 图像越清晰越大 ''' sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) gradient = np.abs(sobel_x) + np.abs(sobel_y) return int(np.sum(gradient ** 2)) # 方差函数计算 def variance(img): ''' :param img: narray 二维灰度图像 :return: int 图像越清晰越大 ''' u = np.mean(img) return int(np.sum((img - u) ** 2)) # Energy 函数计算 def energy(img): ''' :param img: narray 二维灰度图像 :return: int 图像越清晰越大 ''' diff_x = img[1:, :-1] - img[:-1, :-1] diff_y = img[:-1, 1:] - img[:-1, :-1] return int(np.sum(diff_x ** 2 * diff_y ** 2)) # Vollath 函数计算 def Vollath(img): ''' :param img: narray 二维灰度图像 :return: int 图像越清晰越大 ''' u = np.mean(img) return int(-img.size * (u ** 2) + np.sum(img[:-1, :] * img[1:, :])) # Entropy 函数计算 def entropy(img): ''' :param img: narray 二维灰度图像 :return: int 图像越清晰越大 ''' hist = np.bincount(img.flatten(), minlength=256) p = hist / img.size p = p[p > 0] return int(-np.sum(p * np.log(p))) def image_test(filename,image,noisy_img,blur_image): image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) noisy_gray = cv2.cvtColor(noisy_img, cv2.COLOR_BGR2GRAY) blur_gray = cv2.cvtColor(blur_image, cv2.COLOR_BGR2GRAY) # 定义一个格式化字符串,确保每个数值占据相同的宽度 format_str = "{:<10} {:<15} {:<15} {:<15}" # 打印标题 print(format_str.format(filename, "Original", "Noisy", "Blur")) # 打印每个指标的值 print(format_str.format("Brenner", brenner(image_gray), brenner(noisy_gray), brenner(blur_gray))) print(format_str.format("Laplacian", Laplacian(image_gray), Laplacian(noisy_gray), Laplacian(blur_gray))) print(format_str.format("SMD", SMD(image_gray), SMD(noisy_gray), SMD(blur_gray))) print(format_str.format("SMD2", SMD2(image_gray), SMD2(noisy_gray), SMD2(blur_gray))) print(format_str.format("Variance", variance(image_gray), variance(noisy_gray), variance(blur_gray))) print(format_str.format("Energy", energy(image_gray), energy(noisy_gray), energy(blur_gray))) print(format_str.format("Vollath", Vollath(image_gray), Vollath(noisy_gray), Vollath(blur_gray))) print(format_str.format("Entropy", entropy(image_gray), entropy(noisy_gray), entropy(blur_gray))) # print(filename,'noisy','blur') # print('Brenner',brenner(image_gray),brenner(noisy_gray),brenner(blur_gray)) # print('Laplacian',Laplacian(image_gray),Laplacian(noisy_gray),Laplacian(blur_gray)) # print('SMD',SMD(image_gray), SMD(noisy_gray), SMD(blur_gray)) # print('SMD2',SMD2(image_gray), SMD2(noisy_gray), SMD2(blur_gray)) # print('Variance',variance(image_gray),variance(noisy_gray),variance(blur_gray)) # print('Energy',energy(image_gray),energy(noisy_gray),energy(blur_gray)) # print('Vollath',Vollath(image_gray),Vollath(noisy_gray),Vollath(blur_gray)) # print('Entropy',entropy(image_gray),entropy(noisy_gray),entropy(blur_gray)) def process_images(input_dir, salty_dir,blur_dir): # 创建输出目录(如果不存在) if not os.path.exists(salty_dir): os.makedirs(salty_dir) if not os.path.exists(blur_dir): os.makedirs(blur_dir) # 支持的图片格式 img_exts = ('.jpg', '.jpeg', '.png', '.bmp', '.tif', '.tiff') # 遍历输入目录 for filename in os.listdir(input_dir): if filename.lower().endswith(img_exts): # 读取图片 img_path = os.path.join(input_dir, filename) img = cv2.imread(img_path) img = cv2.resize(img,(512, 512)) if img is None: raise ValueError("Error: Image not found or unable to load.") if img is not None: # 添加椒盐噪声 noisy_img = add_salt_pepper(img) # 添加Gauss噪声 blur_image = image_blur(img,ksize=25) # 构造新文件名 name, ext = os.path.splitext(filename) salty_filename = f"{name}_salty{ext}" blur_filename = f"{name}_blur{ext}" image_test(filename,img,noisy_img,blur_image) print('\n') salty_path = os.path.join(salty_dir, salty_filename) cv2.imwrite(salty_path, noisy_img) blur_path = os.path.join(blur_dir, blur_filename) cv2.imwrite(blur_path, blur_image) if __name__ == '__main__': input_dir = 'data_process/Clarity Test/images/source' salty_dir = 'data_process/Clarity Test/images/salty' blur_dir = 'data_process/Clarity Test/images/blur' process_images(input_dir, salty_dir,blur_dir)