code: def blobs(shape: List[int], porosity: float = 0.5, blobiness: int = 1):
      
      blobiness = sp.array(blobiness)
      shape = sp.array(shape)
      if sp.size(shape) == 1:
          shape = sp.full((3, ), int(shape))
      sigma = sp.mean(shape)/(40*blobiness)
      im = sp.random.random(shape)
      im = spim.gaussian_filter(im, sigma=sigma)
      im = norm_to_uniform(im, scale=[0, 1])
      if porosity:
          im = im < porosity
      return im
docs: Generates an image containing amorphous blobs
  
      Parameters
      ----------
      shape : list
          The size of the image to generate in [Nx, Ny, Nz] where N is the
          number of voxels
  
      porosity : float
          If specified, this will threshold the image to the specified value
          prior to returning.  If ``None`` is specified, then the scalar noise
          field is converted to a uniform distribution and returned without
          thresholding.
  
      blobiness : int or list of ints(default = 1)
          Controls the morphology of the blobs.  A higher number results in
          a larger number of small blobs.  If a list is supplied then the blobs
          are anisotropic.
  
      Returns
      -------
      image : ND-array
          A boolean array with ``True`` values denoting the pore space
  
      See Also
      --------
      norm_to_uniform