Python案例如何用Scipy做图像模糊

wen python案例 2

本文目录导读:

Python案例如何用Scipy做图像模糊

  1. 基本设置和导入库
  2. 高斯模糊
  3. 均值模糊(平均滤波)
  4. 中值滤波
  5. 自定义核卷积模糊
  6. 高斯核自定义实现
  7. 完整示例和可视化
  8. 高级应用:不同sigma值的效果
  9. 使用建议

我来介绍使用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')

使用建议

  1. 高斯模糊:最常用,效果自然,适合一般图像平滑
  2. 均值模糊:计算简单,但可能会损失细节
  3. 中值滤波:特别适合去除椒盐噪声
  4. 自定义核:可以实现特殊的模糊效果

选择哪种方法取决于你的具体应用场景和需求。

抱歉,评论功能暂时关闭!