code: def gray2rgba(image, alpha=None, *, channel_axis=-1):
      """Create a RGBA representation of a gray-level image.
  
      Parameters
      ----------
      image : array_like
          Input image.
      alpha : array_like, optional
          Alpha channel of the output image. It may be a scalar or an
          array that can be broadcast to ``image``. If not specified it is
          set to the maximum limit corresponding to the ``image`` dtype.
      channel_axis : int, optional
          This parameter indicates which axis of the output array will correspond
          to channels.
  
          .. versionadded:: 0.19
             ``channel_axis`` was added in 0.19.
  
      Returns
      -------
      rgba : ndarray
          RGBA image. A new dimension of length 4 is added to input
          image shape.
      """
  
      arr = np.asarray(image)
  
      alpha_min, alpha_max = dtype_limits(arr, clip_negative=False)
  
      if alpha is None:
          alpha = alpha_max
  
      if not np.can_cast(alpha, arr.dtype):
          warn(
              f"alpha cannot be safely cast to image dtype {arr.dtype.name}",
              stacklevel=2,
          )
      if np.isscalar(alpha):
          alpha = np.full(arr.shape, alpha, dtype=arr.dtype)
      elif alpha.shape != arr.shape:
          raise ValueError("alpha.shape must match image.shape")
      rgba = np.stack((arr,) * 3 + (alpha,), axis=channel_axis)
      return rgba
  
imports: from warnings import warn
  import numpy
  from scipy import linalg
  from .._shared.utils import _supported_float_type, channel_as_last_axis, identity, reshape_nd, slice_at_axis
  from ..util import dtype, dtype_limits
label_desc: Use image node_id 14 for calling a global function with example usage: gray2rgba(image, alpha) and returns: rgba