Градиентный спуск для удаления размытости изображения

#python #algorithm #optimization #computer-vision #convolution

#python #алгоритм #оптимизация #компьютерное зрение #свертка

Вопрос:

У меня возникли проблемы с реализацией алгоритма градиентного спуска для решения проблемы оптимизации размытия изображения.

Вот моя начальная функция оптимизации:

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

Где g — размытое изображение, u — четкое изображение, k — ядро размытия 2×2, а лямбда — термин регуляризации.

Я установил градиент и попытался реализовать его с другими параметрами. Однако мое изображение становится только более размытым. Вот мой код.

 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()
  

Пожалуйста, помогите мне понять правильный способ реализации этого. Любая помощь будет высоко оценена.

Ответ №1:

это не решит всю вашу проблему, но вы можете начать с правильных значений k , вы, вероятно, имели в виду использовать 0.5 вместо 0/5. А затем посмотрите на граничные условия.

Ответ №2:

Видя, что размер (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 или их максимальному значению, и соответствующим образом обновите grad , вы увидите, что вы действительно можете выполнить итерацию по диапазону (30) как для i, так и для j . Это должно решить проблему.

Комментарии:

1. Спасибо за ваш ответ. Я попробую это. В настоящее время я также пытаюсь понять следующее решение, которое работает для меня с некоторыми небольшими изменениями. Чего я не понимаю, так это функции градиента, scipy.ndimage.convolve требует двух параметров, как показано в функции потерь. Считаете ли вы, что следующая функция градиента неверна? потеря определения (изображение): возвращает np.sum(свертка (изображение, ядро) — размытое изображение) градиент определения (изображение): возвращает свертку (свертка (изображение, ядро) — размытое изображение) для _ в диапазоне (maxit): размыто -= скорость обучения * градиент (изображение)