如何估计具有散斑噪声的图像的标准偏差?
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...
我正在使用我在网上找到的这个功能,为研究目的的图像添加散斑噪声:
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...