本文目录导读:

我来介绍使用Scipy进行图像模糊的几种方法:
基本设置和导入库
import numpy as np
from scipy import ndimage, signal
from scipy.ndimage import gaussian_filter, uniform_filter
import matplotlib.pyplot as plt
from PIL import Image
# 读取图像
image = Image.open('example.jpg')
image_array = np.array(image)
# 如果是彩色图像,转换为灰度
if len(image_array.shape) == 3:
gray_image = np.mean(image_array, axis=2)
else:
gray_image = image_array
高斯模糊
def gaussian_blur(image, sigma=2):
"""
高斯模糊
参数:
image: 输入图像
sigma: 标准差,越大越模糊
"""
# 对每个通道进行模糊
if len(image.shape) == 3:
blurred = np.zeros_like(image, dtype=float)
for i in range(3): # RGB通道
blurred[:,:,i] = gaussian_filter(image[:,:,i], sigma=sigma)
else:
blurred = gaussian_filter(image, sigma=sigma)
return blurred.astype(np.uint8)
# 使用示例
blurred_gaussian = gaussian_blur(image_array, sigma=3)
均值模糊(平均滤波)
def mean_blur(image, size=5):
"""
均值模糊
参数:
image: 输入图像
size: 滤波核大小
"""
if len(image.shape) == 3:
blurred = np.zeros_like(image, dtype=float)
for i in range(3):
blurred[:,:,i] = uniform_filter(image[:,:,i], size=size)
else:
blurred = uniform_filter(image, size=size)
return blurred.astype(np.uint8)
# 使用示例
blurred_mean = mean_blur(image_array, size=5)
中值滤波
def median_blur(image, size=3):
"""
中值模糊 - 对椒盐噪声效果好
参数:
image: 输入图像
size: 滤波窗口大小
"""
if len(image.shape) == 3:
blurred = np.zeros_like(image)
for i in range(3):
blurred[:,:,i] = ndimage.median_filter(image[:,:,i], size=size)
else:
blurred = ndimage.median_filter(image, size=size)
return blurred
# 使用示例
blurred_median = median_blur(image_array, size=3)
自定义核卷积模糊
def custom_kernel_blur(image, kernel_size=5):
"""
使用自定义核进行卷积模糊
"""
# 创建平均核
kernel = np.ones((kernel_size, kernel_size)) / (kernel_size * kernel_size)
if len(image.shape) == 3:
blurred = np.zeros_like(image, dtype=float)
for i in range(3):
blurred[:,:,i] = signal.convolve2d(image[:,:,i], kernel, mode='same', boundary='symm')
else:
blurred = signal.convolve2d(image, kernel, mode='same', boundary='symm')
return blurred.astype(np.uint8)
# 使用示例
blurred_custom = custom_kernel_blur(image_array, kernel_size=7)
高斯核自定义实现
def create_gaussian_kernel(size, sigma=1):
"""
创建高斯核
参数:
size: 核大小
sigma: 标准差
"""
kernel = np.zeros((size, size))
center = size // 2
for i in range(size):
for j in range(size):
x = i - center
y = j - center
kernel[i, j] = np.exp(-(x**2 + y**2) / (2 * sigma**2))
kernel = kernel / np.sum(kernel)
return kernel
def gaussian_blur_custom(image, kernel_size=5, sigma=1.5):
"""
使用自定义高斯核模糊
"""
kernel = create_gaussian_kernel(kernel_size, sigma)
if len(image.shape) == 3:
blurred = np.zeros_like(image, dtype=float)
for i in range(3):
blurred[:,:,i] = signal.convolve2d(image[:,:,i], kernel, mode='same', boundary='symm')
else:
blurred = signal.convolve2d(image, kernel, mode='same', boundary='symm')
return blurred.astype(np.uint8)
# 使用示例
blurred_gaussian_custom = gaussian_blur_custom(image_array, kernel_size=5, sigma=2)
完整示例和可视化
def compare_blur_methods(image_path):
"""
比较不同模糊方法的效果
"""
# 读取图像
img = Image.open(image_path)
img_array = np.array(img)
# 应用不同的模糊方法
methods = {
'Original': img_array,
'Gaussian (sigma=2)': gaussian_blur(img_array, sigma=2),
'Gaussian (sigma=5)': gaussian_blur(img_array, sigma=5),
'Mean (size=5)': mean_blur(img_array, size=5),
'Median (size=3)': median_blur(img_array, size=3)
}
# 显示结果
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
axes = axes.ravel()
for idx, (name, blurred_img) in enumerate(methods.items()):
axes[idx].imshow(blurred_img, cmap='gray' if len(blurred_img.shape) == 2 else None)
axes[idx].set_title(name)
axes[idx].axis('off')
plt.tight_layout()
plt.show()
# 使用示例
compare_blur_methods('example.jpg')
高级应用:不同sigma值的效果
def gaussian_blur_demo(image_path):
"""
演示不同sigma值的效果
"""
img = Image.open(image_path)
img_array = np.array(img)
sigma_values = [0.5, 1, 2, 4, 8]
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
axes[0, 0].imshow(img_array)
axes[0, 0].set_title('Original')
axes[0, 0].axis('off')
for idx, sigma in enumerate(sigma_values):
row = (idx + 1) // 3
col = (idx + 1) % 3
blurred = gaussian_blur(img_array, sigma=sigma)
axes[row, col].imshow(blurred)
axes[row, col].set_title(f'σ = {sigma}')
axes[row, col].axis('off')
plt.tight_layout()
plt.show()
# 使用示例
gaussian_blur_demo('example.jpg')
使用建议
- 高斯模糊:最常用,效果自然,适合一般图像平滑
- 均值模糊:计算简单,但可能会损失细节
- 中值滤波:特别适合去除椒盐噪声
- 自定义核:可以实现特殊的模糊效果
选择哪种方法取决于你的具体应用场景和需求。