如何在Python中实现带像素级随机偏移的Delta函数网格卷积?
实现带随机像素内偏移的规则网格高斯分布
原代码通过卷积规则网格的Dirac delta函数与高斯核,生成了峰值精确位于像素中心的规则网格高斯分布。现在需要调整实现,让每个高斯的峰值在对应网格像素内左下角到中心之间均匀随机分布,同时整体保持规则网格的宏观形态。
实现思路
核心思路是不再依赖离散delta的卷积,而是直接为每个规则网格点生成带随机偏移的高斯核,并叠加到图像上:
- 保持原有的16像素间隔规则网格布局,确保远距离观察的规则性;
- 为每个网格点的高斯峰值在对应像素的左下角到中心区域内生成均匀随机偏移;
- 生成对应偏移的高斯核并叠加到图像的对应位置。
Python代码实现
import numpy as np # 基础参数配置 img_size = 2048 # 图像尺寸 grid_step = 16 # 网格间隔像素数 grid_start = 8 # 网格起始像素位置 kernel_size = 15 # 高斯核尺寸 sigma = 1.0 # 高斯标准差,与原代码一致 # 生成高斯核模板(相对于峰值位置的坐标) x_kernel, y_kernel = np.meshgrid(np.linspace(-2, 2, kernel_size), np.linspace(-2, 2, kernel_size)) gauss_template = np.exp(-(x_kernel**2 + y_kernel**2)/(2 * sigma**2)) # 创建空图像容器 image = np.zeros((img_size, img_size), dtype=np.float32) # 获取所有规则网格点的像素索引 grid_x = np.arange(grid_start, img_size, grid_step) grid_y = np.arange(grid_start, img_size, grid_step) # 遍历每个网格点,添加带随机偏移的高斯 for x0 in grid_x: for y0 in grid_y: # 生成[0, 0.5]范围内的随机偏移,对应像素左下角到中心区域 dx = np.random.uniform(0, 0.5) dy = np.random.uniform(0, 0.5) # 计算高斯峰值的连续坐标 peak_x = x0 + dx peak_y = y0 + dy # 转换核的坐标到图像像素索引 pixel_x = np.round(peak_x + x_kernel).astype(int) pixel_y = np.round(peak_y + y_kernel).astype(int) # 过滤超出图像边界的核点 valid_mask = (pixel_x >= 0) & (pixel_x < img_size) & (pixel_y >= 0) & (pixel_y < img_size) valid_x = pixel_x[valid_mask] valid_y = pixel_y[valid_mask] valid_gauss_vals = gauss_template[valid_mask] # 将高斯值叠加到图像上 image[valid_y, valid_x] += valid_gauss_vals
关键细节说明
- 偏移范围控制:
dx和dy取[0, 0.5],确保峰值落在对应像素的左下角((x0, y0))到中心((x0+0.5, y0+0.5))之间,且每个位置的概率均匀相等。若需要整个像素内随机偏移,只需将范围改为[0, 1.0]。 - 宏观规则性保障:网格点的间隔保持16像素不变,远距离观察时,像素内的随机偏移会被视觉平均,整体仍呈现完美的规则网格形态。
- 核坐标转换:通过将高斯核的相对坐标与峰值的连续坐标相加,再取整得到图像像素索引,确保偏移后的高斯核准确叠加到对应位置。
内容的提问来源于stack exchange,提问作者Alex van Houten
相关产品推荐
相关产品推荐

