本文目录导读:

我来介绍使用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')
使用建议
- 高斯模糊:最常用,效果自然,适合一般图像平滑
- 均值模糊:计算简单,但可能会损失细节
- 中值滤波:特别适合去除椒盐噪声
- 自定义核:可以实现特殊的模糊效果
选择哪种方法取决于你的具体应用场景和需求。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播