import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
image_path = "C:/Users/Lenovo/Desktop/11.jpg"
def load_image(image_path):
img_bgr = cv2.imread(image_path)
if img_bgr is None:
raise FileNotFoundError(f"无法找到图片: {image_path}")
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
return img_bgr, img_rgb
# 添加高斯噪声
def add_gaussian_noise(image, mean=0, var=0.001):
image = np.array(image / 255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape)
noisy_image = image + noise
noisy_image = np.clip(noisy_image, 0, 1)
noisy_image = np.uint8(noisy_image * 255)
return noisy_image
# 添加椒盐噪声
def add_salt_pepper_noise(image, prob=0.02):
output = np.zeros(image.shape, np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = np.random.random()
if rdn < prob:
output[i][j] = 0 # 椒噪声
elif rdn > thres:
output[i][j] = 255 # 盐噪声
else:
output[i][j] = image[i][j]
return output
# 显示噪声对比
def show_noise_comparison(original, gaussian_noisy, salt_pepper_noisy):
plt.figure(figsize=(15, 5))
plt.subplot(131)
plt.imshow(original)
plt.title('原始图像')
plt.axis('off')
plt.subplot(132)
plt.imshow(gaussian_noisy)
plt.title('高斯噪声图像')
plt.axis('off')
plt.subplot(133)
plt.imshow(salt_pepper_noisy)
plt.title('椒盐噪声图像')
plt.axis('off')
plt.tight_layout()
plt.show()
# 滤波处理与显示(使用OpenCV窗口和滑动条)
def filter_demo(image, noise_type="gaussian"):
# 创建窗口
cv2.namedWindow('滤波效果对比', cv2.WINDOW_NORMAL)
cv2.resizeWindow('滤波效果对比', 900, 600)
# 初始核大小(必须为奇数)
initial_kernel_size = 3
# 定义滑动条回调函数
def update_kernel_size(val):
# 确保核大小为奇数且至少为3
kernel_size = val if val % 2 == 1 else val + 1
if kernel_size < 3:
kernel_size = 3
# 应用三种滤波方法
mean_blur = cv2.blur(image, (kernel_size, kernel_size))
median_blur = cv2.medianBlur(image, kernel_size)
gaussian_blur = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
# 在图像上显示当前核大小
mean_blur_text = cv2.putText(mean_blur.copy(), f'均值滤波, 核大小: {kernel_size}',
(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
median_blur_text = cv2.putText(median_blur.copy(), f'中值滤波, 核大小: {kernel_size}',
(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
gaussian_blur_text = cv2.putText(gaussian_blur.copy(), f'高斯滤波, 核大小: {kernel_size}',
(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
# 组合图像以便同时显示
top_row = np.hstack((mean_blur_text, median_blur_text))
bottom_row = np.hstack((gaussian_blur_text,
cv2.putText(image.copy(), f'{noise_type}噪声原图',
(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)))
combined = np.vstack((top_row, bottom_row))
# 显示组合图像
cv2.imshow('滤波效果对比', combined)
# 创建滑动条
cv2.createTrackbar('核大小', '滤波效果对比', initial_kernel_size, 31, update_kernel_size)
# 初始化显示
update_kernel_size(initial_kernel_size)
# 等待操作
print("请调整滑动条观察不同核大小的滤波效果,按ESC键退出")
while True:
key = cv2.waitKey(1) & 0xFF
if key == 27: # ESC键退出
break
cv2.destroyAllWindows()
def main():
img_bgr, img_rgb = load_image('C:/Users/Lenovo/Desktop/11.jpg') # 替换为实际图片路径
# 添加两种噪声
gaussian_noisy_bgr = add_gaussian_noise(img_bgr)
salt_pepper_noisy_bgr = add_salt_pepper_noise(img_bgr)
# 转换为RGB用于matplotlib显示
gaussian_noisy_rgb = cv2.cvtColor(gaussian_noisy_bgr, cv2.COLOR_BGR2RGB)
salt_pepper_noisy_rgb = cv2.cvtColor(salt_pepper_noisy_bgr, cv2.COLOR_BGR2RGB)
# 显示噪声对比
show_noise_comparison(img_rgb, gaussian_noisy_rgb, salt_pepper_noisy_rgb)
# 选择高斯噪声图像进行滤波演示(也可以改为椒盐噪声)
filter_demo(gaussian_noisy_bgr, "高斯")
# 如果想测试椒盐噪声,取消下面一行的注释
# filter_demo(salt_pepper_noisy_bgr, "椒盐")
if __name__ == "__main__":
main()
根据上面代码完善下面的要求
数据准备:读取一张清晰的图片,使用np.random.normal给图片添加高斯噪声,使用np.random给图片添加椒盐噪声,观察这两种噪声;
2. 任意选择一种噪声的图像,分别使用均值滤波(cv2.blur),中值滤波 (cv2.medianBlur)和高斯滤波(cv2.GaussianBlur)对图像进行滤波处理;
3. 使用cv2.createTrackbar()创建一个滑动条(Trackbar),用于动态调整滤波核的大小。用户拖动滑块时,程序实时更新滤波效果,即时显示当前核大小下的滤波结果图像。