如何用TensorFlow为X光图像特定/随机位置添加非高斯随机值噪声
X光图像非高斯噪声实现与数组操作验证
一、非高斯随机噪声的实现方法
针对X光图像的噪声需求,这里提供几种实用的非高斯噪声实现方案,包含随机位置和特定位置的添加逻辑:
1. 均匀分布噪声
这种噪声的取值在指定区间内均匀分布,干扰效果比高斯噪声更“均匀”,不会集中在均值附近。
import numpy as np def add_uniform_noise(img_arr, low=-0.1, high=0.1): noisy_arr = img_arr.copy() # 生成和图像同形状的均匀噪声 noise = np.random.uniform(low, high, size=img_arr.shape) noisy_arr += noise # 截断到0-1的合法像素范围 return np.clip(noisy_arr, 0, 1)
2. 椒盐噪声(脉冲噪声)
模拟传感器突发故障产生的白点(盐)和黑点(椒)干扰,视觉上是离散的点状噪声,适合模拟真实成像的异常点。
def add_salt_pepper_noise(img_arr, salt_p=0.01, pepper_p=0.01): noisy_arr = img_arr.copy() # 随机生成盐噪声(置为1) salt_mask = np.random.random(img_arr.shape) < salt_p noisy_arr[salt_mask] = 1.0 # 随机生成椒噪声(置为0) pepper_mask = np.random.random(img_arr.shape) < pepper_p noisy_arr[pepper_mask] = 0.0 return noisy_arr
3. 泊松噪声
完全贴合X光成像的光子计数特性,是真实场景中常见的噪声类型,干扰效果更符合实际医疗图像的噪声分布。
def add_poisson_noise(img_arr): # 泊松噪声需要基于整数生成,先把0-1的浮点值转成0-255的整数 scaled_arr = np.floor(img_arr * 255).astype(np.uint16) noisy_scaled = np.random.poisson(scaled_arr) # 转换回0-1范围并截断 return np.clip(noisy_scaled / 255.0, 0, 1)
4. 特定位置添加噪声
如果需要在指定区域(比如肺部、骨骼区域)加噪声,只需先准备一个和图像同尺寸的布尔掩码(mask,True表示目标区域),然后仅对掩码覆盖的区域添加噪声:
def add_noise_to_target_region(img_arr, mask): noisy_arr = img_arr.copy() # 这里用均匀噪声举例,也可以替换成上面的其他噪声类型 noise = np.random.uniform(-0.1, 0.1, size=img_arr.shape) # 仅对掩码区域施加噪声 noisy_arr[mask] += noise[mask] return np.clip(noisy_arr, 0, 1)
二、数组复制后直接加数值的正确性
你复制数组后直接添加数值的思路是对的,但要注意两个关键细节:
- 数据类型:确保你的数组是浮点型(比如
float32/float64),如果是从uint8转过来的0-1数组,只要转换时用了浮点除法(比如img_arr = img / 255.0)就没问题,避免整数类型的溢出问题。 - 范围截断:添加噪声后数值很可能超出0-1的合法像素范围,必须用
np.clip()把值限制在0到1之间,否则后续保存图像或输入模型时会出现错误。
正确的操作示例:
# 假设img_arr是已转换的0-1浮点数组 img_copy = img_arr.copy() # 复制数组,避免修改原始数据 noise = np.random.uniform(-0.1, 0.1, size=img_arr.shape) img_copy += noise img_copy = np.clip(img_copy, 0.0, 1.0) # 必须做截断处理
内容的提问来源于stack exchange,提问作者a-eng
相关产品推荐
相关产品推荐

