code: def clone(self, pixeltype=None):
          
          if pixeltype is None:
              pixeltype = self.pixeltype
  
          if pixeltype not in _supported_ptypes:
              raise ValueError('Pixeltype %s not supported. Supported types are %s' % (pixeltype, _supported_ptypes))
  
          if self.has_components and (not self.is_rgb):
              comp_imgs = utils.split_channels(self)
              comp_imgs_cloned = [comp_img.clone(pixeltype) for comp_img in comp_imgs]
              return utils.merge_channels(comp_imgs_cloned)
          else:
              p1_short = utils.short_ptype(self.pixeltype)
              p2_short = utils.short_ptype(pixeltype)
              ndim = self.dimension
              fn_suffix = '%s%i%s%i' % (p1_short,ndim,p2_short,ndim)
              libfn = utils.get_lib_fn('antsImageClone%s'%fn_suffix)
              pointer_cloned = libfn(self.pointer)
              return ANTsImage(pixeltype=pixeltype, 
                              dimension=self.dimension, 
                              components=self.components, 
                              is_rgb=self.is_rgb,
                              pointer=pointer_cloned)
docs: Create a copy of the given ANTsImage with the same data and info, possibly with
          a different data type for the image data. Only supports casting to
          uint8 (unsigned char), uint32 (unsigned int), float32 (float), and float64 (double)
  
          Arguments
          ---------
          dtype: string (optional)
              if None, the dtype will be the same as the cloned ANTsImage. Otherwise,
              the data will be cast to this type. This can be a numpy type or an ITK
              type.
              Options:
                  'unsigned char' or 'uint8',
                  'unsigned int' or 'uint32',
                  'float' or 'float32',
                  'double' or 'float64'
  
          Returns
          -------
          ANTsImage