NoiseBuster 是一个简单的 Python 脚本,允许用户使用OpenCV库提供的非局部均值去噪算法对图像进行去噪。
该脚本提供了一个图形用户界面(GUI),使用户能够选择输入图像,调整去噪参数,并保存去噪后的图像。
原理:
非局部均值(NL-means)是近年来提出的一项新型的去噪技术。该方法充分利用了图像中的冗余信息,在去噪的同时能最大程度地保持图像的细节特征。
基本思想是:当前像素的估计值由图像中与它具有相似邻域结构的像素加权平均得到。
特点
图形用户界面(GUI)方便用户交互和参数输入。
调整去噪参数,如 h、hForColor、templateWindowSize 和 searchWindowSize。
预览原始图像和去噪后的图像。
将去噪后的图像保存到用户指定的输出文件夹。
有以下参数:
h: 控制去噪的强度。较大的值会导致更强的去噪效果。通常,这个值越大,去噪越强烈。(默认为10,建议值为5到12)
hForColor: 与颜色相关的去噪参数。与 h 类似,较大的值表示更强的颜色相关的去噪。(默认为10,建议值为5到20)
templateWindowSize: 定义用于计算像素点权重的邻域大小。该参数影响去噪的程度和速度。较大的值会导致更大的邻域,可能会导致更平滑的结果。(默认为7,建议值为5到12)
searchWindowSize: 定义用于搜索相似块的邻域大小。该参数影响算法在图像中查找相似块的范围。较大的值会考虑更大的区域,但可能会增加计算时间。(默认为21,建议值为5到21)
这些参数一起影响了去噪算法的行为,使用户能够根据实际图像和需求来调整去噪的效果。你可以根据实际情况调整这些参数,以获得最适合你图像处理需求的效果。
import numpy as np
import cv2
import time
import tkinter as tk
from tkinter import simpledialog, filedialog # 导入文件对话框模块
from matplotlib import pyplot as plt
def resize_image(image, scale_percent):
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)
return cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
def denoise(image, h, hForColor, templateWindowSize, searchWindowSize):
dst = cv2.fastNlMeansDenoisingColored(image, None, h, hForColor, templateWindowSize, searchWindowSize)
# h: 控制去噪的强度,较大的值会导致更强的去噪效果。通常,这个值越大,去噪越强烈
# hForColor: 与颜色相关的去噪参数。与h类似,较大的值表示更强的颜色相关的去噪
# templateWindowSize: 定义用于计算像素点权重的邻域大小。该参数影响去噪的程度和速度。较大的值会导致更大的邻域,可能会导致更平滑的结果
# searchWindowSize: 定义用于搜索相似块的邻域大小。该参数影响算法在图像中查找相似块的范围。较大的值会考虑更大的区域,但可能会增加计算时间
return dst
def input_path():
root = tk.Tk()
root.withdraw()
return filedialog.askopenfilename(title="Select Image", filetypes=[("Image files", "*.png;*.jpg;*.jpeg")])
def output_path():
root = tk.Tk() #
root.withdraw() #窗口
output_path = filedialog.askdirectory(title="Select Output Folder")
return output_path
def main():
# 用户输入图像路径
input_path_var = input_path()
# 用户输入保存文件夹路径
output_path_var= output_path()
# 用户输入调整的参数坐标
h = int(input("请输入 h 的值,控制去噪强度,越大越强(默认为10,有效值3-10): "))
hForColor = int(input("请输入 hForColor 的值,颜色相关的去噪参数,与h类似3-10: "))
templateWindowSize = int(input("请输入 templateWindowSize 的值,越大越平滑(默认为7): "))
searchWindowSize = int(input("请输入 searchWindowSize 的值,定义用于搜索相似块的邻域大小,越大区域越大(默认为21): "))
# 读取输入图像
img = cv2.imread(input_path_var)
# 检查图像是否正确加载
if img is None:
print("无法加载图像,请检查文件路径和文件完整性")
else:
# 获取图像数量
num_images = 1
# 调用去噪函数
dst = denoise(img, h, hForColor, templateWindowSize, searchWindowSize)
resized_img = resize_image(img, 25)
resized_dst = resize_image(dst, 25)
# 获取当前时间戳
timestamp = int(time.time())
# 生成保存去噪后的图像的文件名
output_filename = f'denoised_{h}_{hForColor}_{templateWindowSize}_{searchWindowSize}_{timestamp}.jpg'
# 构建保存路径
output_path_var = f'{output_path_var}/{output_filename}'
# 保存去噪后的图像
cv2.imwrite(output_path_var, dst)
print(f"去噪后的图像已保存到: {output_path_var}")
# 显示原始图像和去噪后的图像
cv2.imshow("Original image", resized_img)
cv2.imshow("Denoised image", resized_dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 调用main函数
main()