手动定义一个3*3的高斯核,并使用2D卷积将其应用于data/rain.jpeg的每个像素,以模糊图像
时间: 2024-11-17 17:28:04 浏览: 14
手动定义一个3x3的高斯核并进行2D卷积的确涉及到一些基础的数值计算。首先,我们需要生成一个标准的3x3高斯核,其权重会根据高斯分布衰减。这里是一个基本步骤:
1. **定义高斯核**:
```python
import numpy as np
# 定义高斯函数
def gaussian(x, mu=0, sigmasq=1):
return np.exp(-(x - mu)**2 / (2 * sigmasq))
# 给定标准差,计算对应的高斯核大小和步长
sigma = 1 # 这里假设标准差为1
kernel_size = round(6 * sigma) # 一般选择6倍标准差作为核大小
stride = 1 # 卷积步长为1,即相邻像素相接
# 生成3x3的高斯核
width, height = kernel_size, kernel_size
center_x, center_y = width // 2, height // 2
gaussian_matrix = [[gaussian(y - center_y, sigma=sigma) for y in range(height)] for x in range(width)]
```
2. **加载和预处理图像**:
```python
from PIL import Image
import matplotlib.pyplot as plt
import io
# 加载图片
image = Image.open('data/rain.jpeg')
image_data = np.array(image).astype(np.float32) / 255 # 转换为灰度并归一化
# 对角线元素初始化为零,因为高斯核是对称的
for i in range(kernel_size):
for j in range(kernel_size):
if i != j:
gaussian_matrix[i][j] = 0
gaussian_matrix[kernel_size // 2][kernel_size // 2] = 1 # 中心点置为1
# 使用2D卷积
blurred_image = np.zeros_like(image_data)
for i in range(0, image_data.shape[0], stride):
for j in range(0, image_data.shape[1], stride):
patch = image_data[i:i+kernel_size, j:j+kernel_size]
blurred_image[i:i+kernel_size, j:j+kernel_size] += np.dot(gaussian_matrix, patch.flatten())
```
3. **显示原始和模糊图像**:
```python
plt.subplot(1, 2, 1), plt.imshow(image_data, cmap='gray'), plt.title('Original')
plt.subplot(1, 2, 2), plt.imshow(blurred_image, cmap='gray'), plt.title('Blurred')
plt.show()
```
请注意,这个过程可能比使用OpenCV慢,而且由于没有优化,对于大尺寸图像可能会有性能问题。
阅读全文