Esempio n. 1
0
    def create_mask(self, u0):
        st = self.st

        rows = u0.shape[0]
        cols = u0.shape[1]

        kk = numpy.arange(0, rows)
        jj = numpy.arange(0, cols)

        kk = CsSolver.appendmat(kk, cols)
        jj = CsSolver.appendmat(jj, rows).T
        st["mask"] = numpy.ones((rows, cols), dtype=numpy.float32)

        # add circular mask
        sp_rat = (rows ** 2 + cols ** 2) * 1.0

        #         for jj in numpy.arange(0,cols):
        #             for kk in numpy.arange(0,rows):
        #                 if ( (kk-rows/2.0)**2+(jj-cols/2.0)**2 )/sp_rat > 1.0/8.0:
        #                     st['mask'][kk,jj] = 0.0

        if numpy.size(u0.shape) > 2:
            for pp in range(2, numpy.size(u0.shape)):
                st["mask"] = CsSolver.appendmat(st["mask"], u0.shape[pp])

        return st
Esempio n. 2
0
    def create_mask(self, u0):
        st = self.st

        rows = u0.shape[0]
        cols = u0.shape[1]

        kk = numpy.arange(0, rows)
        jj = numpy.arange(0, cols)

        kk = CsSolver.appendmat(kk, cols)
        jj = CsSolver.appendmat(jj, rows).T
        st['mask'] = numpy.ones((rows, cols), dtype=numpy.float32)

        #add circular mask
        sp_rat = (rows**2 + cols**2) * 1.0

        #         for jj in numpy.arange(0,cols):
        #             for kk in numpy.arange(0,rows):
        #                 if ( (kk-rows/2.0)**2+(jj-cols/2.0)**2 )/sp_rat > 1.0/8.0:
        #                     st['mask'][kk,jj] = 0.0

        if numpy.size(u0.shape) > 2:
            for pp in range(2, numpy.size(u0.shape)):
                st['mask'] = CsSolver.appendmat(st['mask'], u0.shape[pp])

        return st
Esempio n. 3
0
    def solve(self):  # main function of solver

        u0 = numpy.empty((self.f.dim_x, self.st['Nd'][0], self.st['Nd'][1], 4))

        tse = self.f.tse

        tse = CsSolver.appendmat(tse, u0.shape[2])
        tse = numpy.transpose(tse, (0, 1, 3, 2))

        print('tse.shape', tse.shape)

        #===============================================================================
        # mask
        #===============================================================================
        self.st = self.create_mask(u0)
        print('mask.shape', self.st['mask'].shape)

        #        for jj in range(0,16):
        #            matplotlib.pyplot.subplot(4,4,jj)
        #            matplotlib.pyplot.imshow(self.st['mask'][...,jj,0].real)
        #        matplotlib.pyplot.show()

        #===============================================================================

        #estimate sensitivity maps by divided by rms images
        self.st = self.make_sense(
            self.f.tse)  # setting up sense map in st['sensemap']

        self.st['sensemap'] = CsSolver.appendmat(self.st['sensemap'],
                                                 u0.shape[2])
        self.st['sensemap'] = numpy.transpose(self.st['sensemap'],
                                              (0, 1, 3, 2))

        #self.st['sensemap'] =self.st['sensemap'] * self.st['mask']
        print('self.sense.shape', self.st['sensemap'].shape)

        #        for jj in range(0,16):
        #            matplotlib.pyplot.subplot(4,4,jj)
        #            matplotlib.pyplot.imshow(numpy.abs(self.st['sensemap'][...,jj,0]))
        #        matplotlib.pyplot.show()

        self.st['senseflag'] = 1  # turn-on sense, to get sensemap

        (u, uf) = self.kernel(self.f.f, self.st, self.mu, self.LMBD,
                              self.gamma, self.nInner, self.nBreg)
        self.u = u
Esempio n. 4
0
    def solve(self):  # main function of solver

        u0 = numpy.empty((self.f.dim_x, self.st["Nd"][0], self.st["Nd"][1], 4))

        tse = self.f.tse

        tse = CsSolver.appendmat(tse, u0.shape[2])
        tse = numpy.transpose(tse, (0, 1, 3, 2))

        print("tse.shape", tse.shape)

        # ===============================================================================
        # mask
        # ===============================================================================
        self.st = self.create_mask(u0)
        print("mask.shape", self.st["mask"].shape)

        #        for jj in range(0,16):
        #            matplotlib.pyplot.subplot(4,4,jj)
        #            matplotlib.pyplot.imshow(self.st['mask'][...,jj,0].real)
        #        matplotlib.pyplot.show()

        # ===============================================================================

        # estimate sensitivity maps by divided by rms images
        self.st = self.make_sense(self.f.tse)  # setting up sense map in st['sensemap']

        self.st["sensemap"] = CsSolver.appendmat(self.st["sensemap"], u0.shape[2])
        self.st["sensemap"] = numpy.transpose(self.st["sensemap"], (0, 1, 3, 2))

        # self.st['sensemap'] =self.st['sensemap'] * self.st['mask']
        print("self.sense.shape", self.st["sensemap"].shape)

        #        for jj in range(0,16):
        #            matplotlib.pyplot.subplot(4,4,jj)
        #            matplotlib.pyplot.imshow(numpy.abs(self.st['sensemap'][...,jj,0]))
        #        matplotlib.pyplot.show()

        self.st["senseflag"] = 1  # turn-on sense, to get sensemap

        (u, uf) = self.kernel(self.f.f, self.st, self.mu, self.LMBD, self.gamma, self.nInner, self.nBreg)
        self.u = u
Esempio n. 5
0
    def kernel(self, f_internal, st, mu, LMBD, gamma, nInner, nBreg):
        self.st["sensemap"] = self.st["sensemap"] * self.st["mask"]
        tse = self.f.tse
        #        tse=numpy.abs(numpy.mean(self.st['sensemap'],-1))

        tse = CsSolver.appendmat(tse, self.st["Nd"][1])
        # tse=Normalize(tse)
        tse = numpy.transpose(tse, (0, 1, 3, 2))
        self.ttse = CsSolver.Normalize(tse)

        self.tse0 = CsSolver.CombineMulti(tse, -1)

        self.filter = numpy.ones(tse.shape)
        dpss = numpy.kaiser(tse.shape[1], 1.0) * 10.0
        for ppp in range(0, tse.shape[1]):
            self.filter[:, ppp, :, :] = self.filter[:, ppp, :, :] * dpss[ppp]

        print("tse.shape", tse.shape)
        #        L= numpy.size(f)/st['M']
        #        image_dim=st['Nd']+(L,)
        #
        #        if numpy.ndim(f) == 1:# preventing row vector
        #            f=numpy.reshape(f,(numpy.shape(f)[0],1),order='F')
        #        f0 = numpy.copy(f) # deep copy to prevent scope f0 to f
        ##        u = numpy.zeros(image_dim,dtype=numpy.complex64)
        f0 = numpy.copy(f_internal)
        f = numpy.copy(f_internal)

        #        u0=self.data2rho(f_internal,
        #                         self.f.dim_x,
        #                         self.st['Nd'][0],
        #                         self.st['Nd'][1],
        #                         self.f.ncoils,
        #                         self.CsTransform
        #                         ) # doing spatial transform
        u0 = self.fun1(f_internal)

        pdf = self.f.pdf
        pdf = CsSolver.appendmat(pdf, self.st["Nd"][1])
        pdf = numpy.transpose(pdf, (0, 1, 3, 2))

        #        u0 = scipy.fftpack.fftn(u0,axes=(1,))
        #        u0 = scipy.fftpack.fftshift(u0,axes=(1,))
        #        #u0[:,:,u0.shape[2]/2,:] = u0[:,:,u0.shape[2]/2,:]/pdf[:,:,u0.shape[2]/2,:]
        #        u0 = u0#/pdf
        #        u0 = scipy.fftpack.ifftshift(u0,axes=(1,))
        #        u0 = scipy.fftpack.ifftn(u0,axes=(1,))

        #        print('self.f.pdf.shape',self.f.pdf.shape)
        #        for pj in range(0,4):
        #            matplotlib.pyplot.imshow(self.f.pdf[:,:,pj].real)
        #            matplotlib.pyplot.show()

        u0 = self.fun2(u0)

        u0 = self.fun3(u0)

        u0 = u0 * self.st["sensemap"].conj()

        u0 = CsSolver.CombineMulti(u0, -1)

        # u0 = u0*self.filter

        uker = self.create_laplacian_kernel()
        uker = CsSolver.appendmat(uker, u0.shape[3])

        self.u0 = u0

        u = numpy.copy(self.tse0)

        print("u0.shape", u0.shape)

        (xx, bb, dd) = self.make_split_variables(u)

        uf = numpy.copy(u)  # only used for ISRA, written here for generality

        murf = numpy.copy(u)  # initial values
        #    #===============================================================================
        # u_stack = numpy.empty(st['Nd']+(nBreg,),dtype=numpy.complex)
        for outer in numpy.arange(0, nBreg):
            for inner in numpy.arange(0, nInner):
                # update u
                print("iterating", [inner, outer])
                # ===============================================================
                #                 update u  # simple k-space deconvolution to guess initial u
                u = self.update_u(murf, u, uker, xx, bb)

                c = numpy.max(numpy.abs(u[:]))  # Rough coefficient
                # to correct threshold of nonlinear shrink

                # ===================================================================
                # # update d
                # ===================================================================
                # ===================================================================
                # Shrinkage: remove tiny values "in somewhere sparse!"
                # dx+bx should be sparse!
                # ===================================================================
                # shrinkage
                # ===================================================================
                dd = self.update_d(u, dd)

                xx = self.shrink(dd, bb, c * 1.0 / LMBD / numpy.sqrt(numpy.prod(st["Nd"])))

                # ===============================================================
                # ===================================================================
                # # update b
                # ===================================================================

                bb = self.update_b(bb, dd, xx)

            #            if outer < nBreg: # do not update in the last loop
            (f, uf, murf, u) = self.external_update(u, f, uf, f0, u0)  # update outer Split_bregman

        u = CsSolver.Normalize(u)
        for pp in range(0, u0.shape[2]):
            matplotlib.pyplot.subplot(numpy.sqrt(u0.shape[2]) + 1, numpy.sqrt(u0.shape[2]) + 1, pp)
            matplotlib.pyplot.imshow(numpy.sum(numpy.abs(u[..., pp, :]), -1), norm=norm, interpolation="nearest")
        matplotlib.pyplot.show()
        #

        return (u, uf)
Esempio n. 6
0
    def kernel(self, f_internal, st, mu, LMBD, gamma, nInner, nBreg):
        self.st['sensemap'] = self.st['sensemap'] * self.st['mask']
        tse = self.f.tse
        #        tse=numpy.abs(numpy.mean(self.st['sensemap'],-1))

        tse = CsSolver.appendmat(tse, self.st['Nd'][1])
        #tse=Normalize(tse)
        tse = numpy.transpose(tse, (0, 1, 3, 2))
        self.ttse = CsSolver.Normalize(tse)

        self.tse0 = CsSolver.CombineMulti(tse, -1)

        self.filter = numpy.ones(tse.shape)
        dpss = numpy.kaiser(tse.shape[1], 1.0) * 10.0
        for ppp in range(0, tse.shape[1]):
            self.filter[:, ppp, :, :] = self.filter[:, ppp, :, :] * dpss[ppp]

        print('tse.shape', tse.shape)
        #        L= numpy.size(f)/st['M']
        #        image_dim=st['Nd']+(L,)
        #
        #        if numpy.ndim(f) == 1:# preventing row vector
        #            f=numpy.reshape(f,(numpy.shape(f)[0],1),order='F')
        #        f0 = numpy.copy(f) # deep copy to prevent scope f0 to f
        ##        u = numpy.zeros(image_dim,dtype=numpy.complex64)
        f0 = numpy.copy(f_internal)
        f = numpy.copy(f_internal)

        #        u0=self.data2rho(f_internal,
        #                         self.f.dim_x,
        #                         self.st['Nd'][0],
        #                         self.st['Nd'][1],
        #                         self.f.ncoils,
        #                         self.CsTransform
        #                         ) # doing spatial transform
        u0 = self.fun1(f_internal)

        pdf = self.f.pdf
        pdf = CsSolver.appendmat(pdf, self.st['Nd'][1])
        pdf = numpy.transpose(pdf, (0, 1, 3, 2))

        #        u0 = scipy.fftpack.fftn(u0,axes=(1,))
        #        u0 = scipy.fftpack.fftshift(u0,axes=(1,))
        #        #u0[:,:,u0.shape[2]/2,:] = u0[:,:,u0.shape[2]/2,:]/pdf[:,:,u0.shape[2]/2,:]
        #        u0 = u0#/pdf
        #        u0 = scipy.fftpack.ifftshift(u0,axes=(1,))
        #        u0 = scipy.fftpack.ifftn(u0,axes=(1,))

        #        print('self.f.pdf.shape',self.f.pdf.shape)
        #        for pj in range(0,4):
        #            matplotlib.pyplot.imshow(self.f.pdf[:,:,pj].real)
        #            matplotlib.pyplot.show()

        u0 = self.fun2(u0)

        u0 = self.fun3(u0)

        u0 = u0 * self.st['sensemap'].conj()

        u0 = CsSolver.CombineMulti(u0, -1)

        #u0 = u0*self.filter

        uker = self.create_laplacian_kernel()
        uker = CsSolver.appendmat(uker, u0.shape[3])

        self.u0 = u0

        u = numpy.copy(self.tse0)

        print('u0.shape', u0.shape)

        (xx, bb, dd) = self.make_split_variables(u)

        uf = numpy.copy(u)  # only used for ISRA, written here for generality

        murf = numpy.copy(u)  # initial values
        #    #===============================================================================
        #u_stack = numpy.empty(st['Nd']+(nBreg,),dtype=numpy.complex)
        for outer in numpy.arange(0, nBreg):
            for inner in numpy.arange(0, nInner):
                # update u
                print('iterating', [inner, outer])
                #===============================================================
                #                 update u  # simple k-space deconvolution to guess initial u
                u = self.update_u(murf, u, uker, xx, bb)

                c = numpy.max(numpy.abs(u[:]))  # Rough coefficient
                # to correct threshold of nonlinear shrink

                #===================================================================
                # # update d
                #===================================================================
                #===================================================================
                # Shrinkage: remove tiny values "in somewhere sparse!"
                # dx+bx should be sparse!
                #===================================================================
                # shrinkage
                #===================================================================
                dd = self.update_d(u, dd)

                xx = self.shrink(
                    dd, bb, c * 1.0 / LMBD / numpy.sqrt(numpy.prod(st['Nd'])))

                #===============================================================
                #===================================================================
                # # update b
                #===================================================================

                bb = self.update_b(bb, dd, xx)

#            if outer < nBreg: # do not update in the last loop
            (f, uf, murf,
             u) = self.external_update(u, f, uf, f0,
                                       u0)  # update outer Split_bregman

        u = CsSolver.Normalize(u)
        for pp in range(0, u0.shape[2]):
            matplotlib.pyplot.subplot(
                numpy.sqrt(u0.shape[2]) + 1,
                numpy.sqrt(u0.shape[2]) + 1, pp)
            matplotlib.pyplot.imshow(numpy.sum(numpy.abs(u[..., pp, :]), -1),
                                     norm=norm,
                                     interpolation='nearest')
        matplotlib.pyplot.show()
        #

        return (u, uf)