【问题标题】:Gradient descent for image deblurring图像去模糊的梯度下降
【发布时间】:2020-11-05 01:04:41
【问题描述】:

我在实施梯度下降算法来解决图像去模糊的优化问题时遇到了麻烦。

这是我的初始优化函数:

E[u] = |g - u*k|^2 + λ

其中 g 是模糊图像,u 是清晰图像,k 是 2x2 模糊核,lambda 是正则化项。

我找到了渐变并尝试使用不同的参数来实现它。但是,我的图像只会变得更模糊。这是我的代码。

grad = np.zeros((30,30))
cur_img = blur(sample_image)
g = blur(sample_image)
rate = 0.01
max_iters = 2000
iters = 0

while  iters < max_iters:
    prev_img = cur_img

    for i in range(28):
        for j in range(28):
            # Calculate gradient
            grad[i,j] = prev_img[i,j] + 0/5*prev_img[i-1,j-1] + 0/5*prev_img[i+1,j+1] - g[i-1,j-1]-g[i,j]
    # Gradient Descent
    cur_img = cur_img - rate * grad
    iters = iters+1

plt.imshow(cur_img, cmap ="gray")
plt.show()

请帮助我了解实现这一点的正确方法。任何帮助将不胜感激。

【问题讨论】:

    标签: python algorithm optimization computer-vision convolution


    【解决方案1】:

    这不会解决您的整个问题,但您可能想从正确的 k 值开始,您可能打算使用 0.5 而不是 0/5。 然后看看边界条件。

    【讨论】:

      【解决方案2】:

      看到 size(grad) = (30,30) 我假设 size(g) = (29,29)。现在图像需要与 grad 具有相同的尺寸,因此,您需要以不同的方式对其进行初始化。例如。使用

      i_max, j_max, *_ = g.shape
      cur_img = np.zeros((i_max+1,j_max+1))
      for i in range(i_max):
          for j in range(j_max):
              cur_img[i,j] = g[i,j]
      

      当前图像将有两个未更新的边界。您可以将它们保留为 0 或使用其他边界条件。

      如果您随后在迭代中处理边界条件,即检查 i 和 j 是否为 0 或它们的最大值并相应地更新 grad,您将看到您实际上可以在 range(30) 上迭代 i和 j。这应该可以解决问题。

      【讨论】:

      • 感谢您的回答。我会试试看。我目前也在尝试了解以下解决方案,该解决方案适用于我的一些小改动。我不明白的是梯度函数,scipy.ndimage.convolve 需要两个参数,如损失函数所示。你认为下面的梯度函数是错误的吗? def loss(image): return np.sum(convolve(image, kernel) - blurred_image) def gradient(image): return convolve(convolve(image, kernel) - blurred_image) for _ in range(maxit): deblurred -= learning_rate *渐变(图像)
      猜你喜欢
      • 1970-01-01
      • 2016-06-13
      • 2019-05-13
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多