作为最终设计项目的一部分,我们必须设计一个Gibbs采样器以对图像进行去噪。我们选择使用Metropolis算法代替常规的Gibbs采样器。该算法的概图如下,所有像素均为0-255灰度值。另外,我们使用简单的平滑度先验分布。
main()
get input image as img
originalImg = img
for k = 1 to 1000
beta = 3/log(1+k)
initialEnergy = energy(img,originalImg)
for i = 0 to imageRows
for j = 0 to imageCols
img[i][j] = metropolisSample(beta,originalImg,img,initialEnergy,i,j)
energy(img,originalImg)
for i = 1 to imageRows
for j = 1 to imageCols
ans += (img[i][j] - originalImg[i][j])^2 / (255*255)
ans += (img[i][j] - image[i][j+1])^2 / (255*255)
ans += (img[i][j] - image[i][j-1])^2 / (255*255)
ans += (img[i][j] - image[i+1][j])^2 / (255*255)
ans += (img[i][j] - image[i-1][j])^2 / (255*255)
return ans
metropolisSample(beta,originalImg,img,initialEnergy,i,j)
imageCopy = img
imageCopy[i][j] = random int between 0 and 255
newEnergy = energy(imageCopy,originalImg)
if (newEnergy < initialEnergy)
initialEnergy = newEnergy
return imageCopy[i][j]
else
rand = random float between 0 and 1
prob = exp(-(1/beta) * (newEnergy - initialEnergy))
if rand < prob
initialEnergy = newEnergy
return imageCopy[i][j]
else
return img[i][j]
这几乎是程序的要旨。我的问题是在计算概率的步骤中
prob = exp(-(1/beta) * (newEnergy - initialEnergy))
能量的差异如此之大,以至于概率几乎总是为零。缓解这种情况的正确方法是什么?我们还尝试了Gibbs抽样方法,但是遇到了类似的问题。 Gibbs采样器代码如下。而不是使用metropolisSample,我们使用gibbsSample代替
gibbsSample(beta,originalImg,img,initialEnergy,i,j)
imageCopy = img
sum = 0
for k = 0 to 255
imageCopy[i][j] = k
energies[k] = energy(imageCopy,originalImg)
prob[k] = exp(-(1/beta) * energies[k])
sum += prob[k]
for k = 0 to 255
prob[k] / sum
for k = 1 to 255
prob[k] = prob[k-1] + prob[k] //Convert our PDF to a CDF
rand = random float between 0 and 1
k = 0
while (1)
if (rand < prob[k])
break
k++
initialEnergy = energy[k]
return k
我们在实现过程中也遇到了类似的问题。当我们计算
prob[k] = exp(-(1/beta) * energies[k])
我们的能量是如此之大,以至于我们的机率全部变为零。从理论上讲,这不应该成为问题,因为我们将它们加起来然后除以和,但是浮点数表示还不够准确。什么是解决此问题的好方法?
最佳答案
我对您的具体问题一无所知,但是我的第一反应是扩大精力。您的像素在0..255的范围内,这是任意的。如果像素是介于零和一之间的分数,则结果将有很大的不同。
如果能量单位为像素^ 2,请尝试将能量除以256 ^ 2。否则,请尝试除以256。
同样,假设数据是完全随机的,则可能有很高的能量,实际上应该没有很高的概率。
我对您问题的了解不足,可能导致无用的答案。如果是这样,请忽略它。