如何估计具有散斑噪声的图像的标准偏差?

How to estimate standard deviation in images with speckle noise?

我正在使用我在网上找到的这个功能,为研究目的的图像添加散斑噪声:

def add_speckle(k,theta,img):
  
  gauss = np.random.gamma(k, theta, img.size)
  gauss = gauss.reshape(img.shape[0], img.shape[1], img.shape[2]).astype('uint8')
  noise = img + img * gauss 
  return noise

我的问题是我想 estimate/define 我添加的散斑噪声作为标准偏差 (sigma) 参数,我发现的这个函数取决于伽马分布或 random.gamma()这取决于 k,theta(shape,scale) 参数,您可以在下面的 gamma pdf 方程中看到:

据我所知,方差可以在伽马分布中计算如下:

所以标准偏差或西格玛相当于:

我想添加依赖于 sigma 的散斑噪声,所以我说应该有一种方法可以从我们进行输入的 k、theta(shape,scale) 来估计 sigma,所以 speckle_adding () 函数看起来像这样:

def add_speckle(sigma,img):

已编辑:评论中的答案:

def add_speckle(sigma,mean,img):

  theta = sigma ** 2 / mean
  k = mean / theta
  gauss = np.random.gamma(k,theta,img.size)
  gauss = gauss.reshape(img.shape[0],img.shape[1],img.shape[2]).astype('uint8')
  noise = img + img * gauss 
  print("k=",k)
  print("theta=",theta)
  return noise
  img = cv2.imread('/content/Hand.jpeg')
cv2.imwrite('speckle12.jpg',add_speckle(8,3,img))

谢谢先生的帮助,但我真的明白为什么每次我改变均值时 k,theta 值都会改变,而 sigma 是恒定的,我认为它不能改变??

正如您所注意到的 sigma = k ** 0.5 * theta,如果只给出 sigma,则 gamma 分布中的参数有无限可能(例如,如果 sigma 为 1,(k, theta) 可以是 (1,1)(4, 0.5) 等等)。

如果你真的想生成以统计推断为输入的散斑,我建议你添加mean作为第二个输入,这样就可以计算出所需的(k, theta)

伽玛分布的一阶矩(即平均值)就是 k * theta

示例:

def add_speckle(mean, sigma, img):
    # find theta
    theta = sigma ** 2 / mean
    k = mean / theta
    
    # your code proceeds...