datastes/Clarity Test/image_test.py

185 lines
6.2 KiB
Python
Raw Permalink Normal View History

2025-05-13 17:03:15 +08:00
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)