code: def toImage(self, array, origin=""):
          
  
          if not isinstance(array, np.ndarray):
              raise TypeError(
                  "array argument should be numpy.ndarray; however, it got [%s]." % type(array))
  
          if array.ndim != 3:
              raise ValueError("Invalid array shape")
  
          height, width, nChannels = array.shape
          ocvTypes = ImageSchema.ocvTypes
          if nChannels == 1:
              mode = ocvTypes["CV_8UC1"]
          elif nChannels == 3:
              mode = ocvTypes["CV_8UC3"]
          elif nChannels == 4:
              mode = ocvTypes["CV_8UC4"]
          else:
              raise ValueError("Invalid number of channels")
  
          # Running `bytearray(numpy.array([1]))` fails in specific Python versions
          # with a specific Numpy version, for example in Python 3.6.0 and NumPy 1.13.3.
          # Here, it avoids it by converting it to bytes.
          if LooseVersion(np.__version__) >= LooseVersion('1.9'):
              data = bytearray(array.astype(dtype=np.uint8).ravel().tobytes())
          else:
              # Numpy prior to 1.9 don't have `tobytes` method.
              data = bytearray(array.astype(dtype=np.uint8).ravel())
  
          # Creating new Row with _create_row(), because Row(name = value, ... )
          # orders fields by name, which conflicts with expected schema order
          # when the new DataFrame is created by UDF
          return _create_row(self.imageFields,
                             [origin, height, width, nChannels, mode, data])
docs: Converts an array with metadata to a two-dimensional image.
  
          :param `numpy.ndarray` array: The array to convert to image.
          :param str origin: Path to the image, optional.
          :return: a :class:`Row` that is a two dimensional image.
  
          .. versionadded:: 2.3.0