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