Python 图像去模糊的梯度下降法

Python 图像去模糊的梯度下降法,python,algorithm,optimization,computer-vision,convolution,Python,Algorithm,Optimization,Computer Vision,Convolution,我在实现梯度下降算法以解决图像去模糊的优化问题时遇到问题 以下是我的初始优化功能: 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

我在实现梯度下降算法以解决图像去模糊的优化问题时遇到问题

以下是我的初始优化功能:

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()
grad=np.零((30,30))
cur\u img=模糊(采样图像)
g=模糊(样本图像)
比率=0.01
最大值=2000
iters=0
而国际热核实验反应器<最大国际热核实验反应器:
上一个img=当前img
对于范围(28)内的i:
对于范围(28)内的j:
#计算梯度
梯度[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]
#梯度下降
cur_img=cur_img-速率*梯度
国际热核实验堆=国际热核实验堆+1
plt.imshow(cur_img,cmap=“灰色”)
plt.show()

请帮助我理解正确的实施方法。非常感谢您的帮助。

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

这不会解决整个问题,但您可能希望从正确的k值开始,您可能打算使用0.5而不是0/5。 然后看看边界条件。看到这个尺寸(grad)=(30,30),我假设这个尺寸(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或处于其最大值,并相应地更新梯度,您将看到实际上可以迭代i和j的范围(30)。这应该可以解决问题。

看到大小(grad)=(30,30),我假设大小(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或处于其最大值,并相应地更新梯度,您将看到实际上可以迭代i和j的范围(30)。这应该可以解决问题。

谢谢您的回答。我会试试看。我目前也在尝试理解下面的解决方案,它对我来说只需要一些小的改动。我不理解的是梯度函数,scipy.ndimage.convalve需要两个参数,如损失函数所示。你认为下面的梯度函数是错误的吗?def丢失(图像):返回np.sum(卷积(图像,内核)-模糊图像)def梯度(图像):返回卷积(卷积(图像,内核)-模糊图像)范围内(最大值):去模糊-=学习速率*梯度(图像)谢谢您的回答。我会试试看。我目前也在尝试理解下面的解决方案,它对我来说只需要一些小的改动。我不理解的是梯度函数,scipy.ndimage.convalve需要两个参数,如损失函数所示。你认为下面的梯度函数是错误的吗?def丢失(图像):返回np.sum(卷积(图像,内核)-模糊图像)def梯度(图像):返回卷积(卷积(图像,内核)-模糊图像)范围内(最大值):去模糊-=学习速率*梯度(图像)