from __future__ import print_function from builtins import input from builtins import range import pyfftw # See https://github.com/pyFFTW/pyFFTW/issues/40 import numpy as np from sporco import util from sporco import plot plot.config_notebook_plotting() import sporco.metric as sm import sporco.linalg as sl from sporco.admm import cbpdn def pad(x, n=8): if x.ndim == 2: return np.pad(x, n, mode='symmetric') else: return np.pad(x, ((n, n), (n, n), (0, 0)), mode='symmetric') def crop(x, n=8): return x[n:-n, n:-n] img = util.ExampleImages().image('monarch.png', zoom=0.5, scaled=True, idxexp=np.s_[:, 160:672]) np.random.seed(12345) imgn = util.spnoise(img, 0.33) D0 = util.convdicts()['RGB:8x8x3x64'] Di = np.zeros(D0.shape[0:2] + (3, 3)) np.fill_diagonal(Di[0, 0], 1.0) D = np.concatenate((Di, Di, D0), axis=3) lmbda = 2.8e-2 mu = 3e-1 w1 = np.ones((1, 1, 1, 1, D.shape[-1])) w1[..., 0:3] = 0.33 w1[..., 3:6] = 0.0 wg = np.zeros((D.shape[-1])) wg[..., 3:6] = 1.0 opt = cbpdn.ConvBPDNGradReg.Options({'Verbose': True, 'MaxMainIter': 100, 'RelStopTol': 5e-3, 'AuxVarObj': False, 'L1Weight': w1, 'GradWeight': wg}) b = cbpdn.ConvBPDNGradReg(D, pad(imgn), lmbda, mu, opt, dimK=0) X = b.solve() imgdp = b.reconstruct().squeeze() - X[..., 0, 0:3].squeeze() imgd = crop(imgdp) imglp = X[..., 0, 3:6].squeeze() print("ConvBPDNGradReg solve time: %5.2f s" % b.timer.elapsed('solve')) print("Noisy image PSNR: %5.2f dB" % sm.psnr(img, imgn)) print("Denoised image PSNR: %5.2f dB" % sm.psnr(img, imgd)) fig, ax = plot.subplots(nrows=1, ncols=3, figsize=(21, 7)) fig.suptitle('Method 1 Results') plot.imview(img, ax=ax[0], title='Reference', fig=fig) plot.imview(imgn, ax=ax[1], title='Noisy', fig=fig) plot.imview(imgd, ax=ax[2], title='CSC Result', fig=fig) fig.show() class ConvRepL1L1(cbpdn.ConvBPDNMaskDcpl): def ystep(self): AXU = self.AX + self.U Y0 = sl.shrink1(self.block_sep0(AXU) - self.S, (1.0/self.rho)*self.W) Y1 = sl.shrink1(self.block_sep1(AXU), (self.lmbda/self.rho)*self.wl1) self.Y = self.block_cat(Y0, Y1) super(cbpdn.ConvBPDNMaskDcpl, self).ystep() def obfn_g0(self, Y0): return np.sum(np.abs(self.W * self.obfn_g0var())) opt = ConvRepL1L1.Options({'Verbose': True, 'MaxMainIter': 200, 'RelStopTol': 5e-3, 'AuxVarObj': False, 'rho': 1e1, 'RelaxParam': 1.8}) lmbda = 3.0e0 b = ConvRepL1L1(D, pad(imgn) - imglp, lmbda, opt=opt, dimK=0) X = b.solve() imgdp = b.reconstruct().squeeze() + imglp imgd = crop(imgdp) print("ConvRepL1L1 solve time: %5.2f s" % b.timer.elapsed('solve')) print("Noisy image PSNR: %5.2f dB" % sm.psnr(img, imgn)) print("Denoised image PSNR: %5.2f dB" % sm.psnr(img, imgd)) fig, ax = plot.subplots(nrows=1, ncols=3, figsize=(21, 7)) fig.suptitle('Method 2 Results') plot.imview(img, ax=ax[0], title='Reference', fig=fig) plot.imview(imgn, ax=ax[1], title='Noisy', fig=fig) plot.imview(imgd, ax=ax[2], title='CSC Result', fig=fig) fig.show()