コード例 #1
0
ファイル: demo_image.py プロジェクト: syarra/nlpy
 def setsolver(self):
     n = self.n
     op = SimpleLinearOperator(
         n,
         n,
         lambda u: np.asarray(u * self.K)[0],
         matvec_transp=lambda u: np.asarray(u * self.K.T)[0],
         symmetric=False,
     )
     self.solver = LSQRFramework(op)
コード例 #2
0
ファイル: demo_image.py プロジェクト: syarra/nlpy
class Image1D:
    def __init__(self, n=80, sig=0.05, err=2, **kwargs):
        self.n = n  # Number of grid points
        self.sig = float(sig)  # Gaussian kernel width
        self.err = float(err) / 100  # Percent error in data

        # Setup grid
        h = 1.0 / n
        z = np.arange(h / 2, 1 - h / 2 + h, h)

        # Compute nxn matrix K = convolution with Gaussian kernel
        gaussKernel = 1 / sqrt(np.pi) / self.sig * np.exp(-(z - h / 2) ** 2 / self.sig ** 2)
        self.K = h * np.matrix(toeplitz(gaussKernel))

        # Setup true solution, blurred and noisy data
        trueimg = 0.75 * np.where((0.1 < z) & (z < 0.25), 1, 0)
        trueimg += 0.25 * np.where((0.3 < z) & (z < 0.32), 1, 0)
        trueimg += np.where((0.5 < z) & (z < 1), 1, 0) * np.sin(2 * np.pi * z) ** 4
        blurred = self.K * np.asmatrix(trueimg).T
        blurred = np.asarray(blurred.T)[0]  # np.matrix messes up your data
        noise = self.err * np.linalg.norm(blurred) * np.random.random(n) / sqrt(n)
        self.data = blurred + noise
        self.z = z
        self.trueimg = trueimg
        self.blurred = blurred
        self.setsolver()

    def setsolver(self):
        n = self.n
        op = SimpleLinearOperator(
            n,
            n,
            lambda u: np.asarray(u * self.K)[0],
            matvec_transp=lambda u: np.asarray(u * self.K.T)[0],
            symmetric=False,
        )
        self.solver = LSQRFramework(op)

    def deblur(self, **kwargs):
        "Deblur image with specified solver"
        self.solver.solve(self.data, **kwargs)
        return self.solver.x