Beispiel #1
0
def primal_energy_tvl1(x, img_obs, clambda):
    """

    :param x: numpy array, [MxN]
    :param img_obs: numpy array [MxN], observed image
    :param clambda: float, lambda parameter
    :return: float, primal ROF energy
    """
    energy_reg = norm1(forward_gradient(x)).sum()
    energy_data_term = clambda * np.abs(x - img_obs).sum()
    return energy_reg + energy_data_term
Beispiel #2
0
def primal_energy_tvl1(x, img_obs, clambda):
    """

    :param x: pytorch Variables, [MxN]
    :param img_obs: pytorch Variables [MxN], observed image
    :param clambda: float, lambda parameter
    :return: float, primal ROF energy
    """
    energy_reg = torch.sum(
        torch.norm(forward_gradient(x, torch.cuda.FloatTensor), 1))
    energy_data_term = torch.sum(clambda * torch.abs(x - img_obs))
    return energy_reg + energy_data_term
Beispiel #3
0
    def test_adjoint_operator(self):
        Y = 200
        X = 100
        x = 1 + Variable(torch.randn((1, Y, X)).type(torch.FloatTensor))
        y_l = Variable(torch.randn((2, Y + 1, X + 1)).type(torch.FloatTensor))

        y_l[0, 1:, 1:-1] = 1 + torch.randn((1, Y, X - 1))
        y_l[1, 1:-1, 1:] = 1 + torch.randn((1, Y - 1, X))
        y = y_l[:, 1:, 1:]
        # Compute gradient and divergence
        gx = forward_gradient(x)
        dy = backward_divergence(y)

        check = abs((y.data.numpy()[:] * gx.data.numpy()[:]).sum() + (dy.data.numpy()[:]*x.data.numpy()[:]).sum())
        print(check)
        self.assertTrue(check < 1e-4)
Beispiel #4
0
    x_tilde = x
    h, w = img_ref.shape
    y = np.zeros((h, w, 2))

    p_nrg = primal_energy_rof(x, img_obs, lambda_rof)
    print "Primal Energy = ", p_nrg
    d_nrg = dual_energy_rof(y, img_obs)
    print "Dual Energy = ", d_nrg

    # Solve ROF
    primal = np.zeros((max_it, ))
    dual = np.zeros((max_it, ))
    gap = np.zeros((max_it, ))
    primal[0] = p_nrg
    dual[0] = d_nrg
    y = forward_gradient(x)
    for it in range(max_it):
        # Dual update
        y = y + sigma * forward_gradient(x_tilde)
        y = proximal_linf_ball(y, 1.0)
        # Primal update
        x_old = x
        x = (x + tau * backward_divergence(y) +
             lambda_rof * tau * img_obs) / (1.0 + lambda_rof * tau)
        # Smoothing
        x_tilde = x + theta * (x - x_old)

        # Compute energies
        primal[it] = primal_energy_rof(x_tilde, img_obs, sigma)
        dual[it] = dual_energy_rof(y, img_obs)
        gap[it] = primal[it] - dual[it]