Source code for monalisa.image._im_laplace_iterator

"""Port of src/image123/bmImLaplaceIterator.m."""

import numpy as np

from monalisa._mat import imsize_ints as _ims
from monalisa._mat import msize
from monalisa.image._im_reshape import im_reshape
from monalisa.image._laplace import laplace_solve, offsets


[docs] def im_laplace_iterator(imStart, m, nIter, omp_flag=None, nBlockPerThread=None): """``nIter`` (rounded up to even) Jacobi iterations of the discrete Laplace equation, keeping the voxels where ``m`` is true at their initial value. Real and imaginary parts are solved separately, in single precision.""" argSize = msize(imStart) imStart, imDim, imSize = _ims(im_reshape(imStart, nargout=3)) shape = imSize if imDim > 1 else (imSize[0],) off = offsets(shape[:imDim]) mflat = np.ravel(np.asarray(m, dtype=bool), order="F") def solve(part): flat = np.ascontiguousarray(np.ravel(np.asarray(part, dtype=np.float32), order="F")) return laplace_solve(flat, mflat, int(nIter), off) imStart = np.asarray(imStart) if np.iscomplexobj(imStart): out = (solve(imStart.real) + 1j * solve(imStart.imag)).astype(np.complex64) else: out = solve(imStart) return np.reshape(out, argSize, order="F")