import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
from datetime import datetime
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'FangSong']
plt.rcParams['axes.unicode_minus'] = False
# 读取图像
image_path = r'D:\python\PythonProject\picture.png'
original_image = cv2.imread(image_path)
if original_image is None:
raise FileNotFoundError("无法加载图像,请检查路径")
# 创建输出目录
output_dir = "processed_images"
os.makedirs(output_dir, exist_ok=True)
# 图像处理流程
gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY) # 灰度化
hist = cv2.calcHist([gray_image], [0], None, [256], [0, 256]) # 直方图
# ----------------------------
# 明显的高斯噪声(增强对比)
# ----------------------------
def add_strong_gaussian_noise(img):
"""添加明显的高斯噪声"""
noise = np.random.normal(0, 40, img.shape).astype(np.float32) # 较强噪声
noisy_img = img.astype(np.float32) + noise
return np.clip(noisy_img, 0, 255).astype(np.uint8)
noisy_image = add_strong_gaussian_noise(original_image)
# ----------------------------
# 均值滤波(适中强度)
# ----------------------------
denoised_image = cv2.blur(noisy_image, (7, 7)) # 使用7x7核,平衡效果
# ----------------------------
# 单独保存每张图像
# ----------------------------
def save_individual_image(image, filename, title=None, cmap=None):
"""保存单个图像"""
plt.figure(figsize=(8, 6))
plt.imshow(image, cmap=cmap)
if title:
plt.title(title, fontsize=16)
plt.axis('off')
plt.tight_layout()
filepath = os.path.join(output_dir, filename)
plt.savefig(filepath, dpi=150, bbox_inches='tight')
plt.close()
print(f"✅ 已保存: {filepath}")
# 1. 原始图像
save_individual_image(
cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB),
"1_original_image.png",
"原始图像"
)
# 2. 灰度图像
save_individual_image(
gray_image,
"2_gray_image.png",
"灰度图像",
cmap='gray'
)
# 3. 灰度直方图
plt.figure(figsize=(8, 6))
plt.plot(hist, color='black')
plt.fill_between(np.arange(256), hist.ravel(), color='gray', alpha=0.3)
plt.title('灰度直方图', fontsize=16)
plt.xlabel('像素值')
plt.ylabel('频率')
plt.grid(alpha=0.2)
plt.xlim([0, 255])
plt.tight_layout()
hist_filepath = os.path.join(output_dir, "3_histogram.png")
plt.savefig(hist_filepath, dpi=150, bbox_inches='tight')
plt.close()
print(f"✅ 已保存: {hist_filepath}")
# 4. 带噪声图像
save_individual_image(
cv2.cvtColor(noisy_image, cv2.COLOR_BGR2RGB),
"4_noisy_image.png",
"带高斯噪声图像"
)
# 5. 均值滤波降噪图
save_individual_image(
cv2.cvtColor(denoised_image, cv2.COLOR_BGR2RGB),
"5_denoised_mean_filter.png",
"均值滤波降噪图"
)
# ----------------------------
# 最终汇总图(正确顺序)
# ----------------------------
plt.figure(figsize=(18, 10))
# 1. 原图
plt.subplot(2, 3, 1)
plt.imshow(cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB))
plt.title('1. 原始图像')
plt.axis('off')
# 2. 灰度图
plt.subplot(2, 3, 2)
plt.imshow(gray_image, cmap='gray')
plt.title('2. 灰度图像')
plt.axis('off')
# 3. 灰度直方图
plt.subplot(2, 3, 3)
plt.plot(hist, color='black')
plt.fill_between(np.arange(256), hist.ravel(), color='gray', alpha=0.3)
plt.title('3. 灰度直方图')
plt.xlabel('像素值')
plt.ylabel('频率')
plt.grid(alpha=0.2)
plt.xlim([0, 255])
# 4. 噪声图像
plt.subplot(2, 3, 4)
plt.imshow(cv2.cvtColor(noisy_image, cv2.COLOR_BGR2RGB))
plt.title('4. 高斯噪声图像\n(σ=40)')
plt.axis('off')
# 5. 均值滤波
plt.subplot(2, 3, 5)
plt.imshow(cv2.cvtColor(denoised_image, cv2.COLOR_BGR2RGB))
plt.title('5. 均值滤波降噪\n(7×7核)')
plt.axis('off')
# 6. 信息区域
plt.subplot(2, 3, 6)
plt.axis('off')
info_text = [
f"输入文件: {os.path.basename(image_path)}",
f"图像尺寸: {original_image.shape[1]}×{original_image.shape[0]}",
f"噪声强度: σ=40",
f"滤波参数: 7×7均值滤波",
f"处理时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
]
plt.text(0.1, 0.5, "\n".join(info_text), fontsize=11, va='center')
plt.tight_layout(pad=3.0)
# 保存汇总图
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
summary_filename = f"final_summary_{timestamp}.png"
plt.savefig(summary_filename, dpi=150, bbox_inches='tight')
print(f"✅ 已保存最终汇总图: {os.path.abspath(summary_filename)}")
plt.show()
print(f"\n📁 所有图像已保存到目录: {os.path.abspath(output_dir)}")
效果不是很好。