def toImage(self, array, origin=""): """ Converts an array with metadata to a two-dimensional image. :param array 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 """ 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") 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])
def toImage(array, path="", ocvType=16): length = np.prod(array.shape) data = bytearray( array.astype(dtype=np.int8)[:, :, (2, 1, 0)].reshape(length)) height = array.shape[0] width = array.shape[1] # Creating new Row with _create_row(), because Row(name = value, ... ) orders fields by name, # which conflicts with expected ImageSchema order when the new DataFrame is created by UDF return _create_row(ImageFields, [path, height, width, ocvType, data])
def toImage(self, array: np.ndarray, origin: str = "") -> Row: """ Converts an array with metadata to a two-dimensional image. Parameters ---------- array : :class:`numpy.ndarray` The array to convert to image. origin : str Path to the image, optional. Returns ------- :class:`Row` that is a two dimensional image. .. versionadded:: 2.3.0 """ 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])
def toImage(self, array, origin=""): """ 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 """ 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])
def toImage(array, path = "", ocvType = 16): """ Converts a one-dimensional array to a 2 dimensional image Args: array (array): path (str): ocvType (int): Returns: object: 2 dimensional image """ length = np.prod(array.shape) data = bytearray(array.astype(dtype=np.int8)[:,:,(2,1,0)].reshape(length)) height = array.shape[0] width = array.shape[1] # Creating new Row with _create_row(), because Row(name = value, ... ) orders fields by name, # which conflicts with expected ImageSchema order when the new DataFrame is created by UDF return _create_row(ImageFields, [path, height, width, ocvType, data])
def toImage(array, path="", mode=16): """ Converts a one-dimensional array to a 2 dimensional image Args: array (array): path (str): ocvType (int): Returns: object: 2 dimensional image """ length = np.prod(array.shape) data = bytearray(array.astype(dtype=np.int8)[:, :, (2, 1, 0)].reshape(length)) height = array.shape[0] width = array.shape[1] # Creating new Row with _create_row(), because Row(name = value, ... ) orders fields by name, # which conflicts with expected ImageSchema order when the new DataFrame is created by UDF return _create_row(ImageFields, [path, height, width, 3, mode, data])
def toImage(self, array, origin=""): """ 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 """ 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 %s" % str(array.shape)) height, width, nChannels = array.shape dtype = array.dtype if not dtype in self._numpyToOcvMap: raise ValueError( "Unexpected/unsupported array data type '%s', currently only supported formats are %s" % (str(array.dtype), str(self._numpyToOcvMap.keys()))) ocvName = "CV_%sC%d" % (self._numpyToOcvMap[dtype], nChannels) ocvType = self.ocvTypeByName(ocvName) # 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. data = bytearray(array.tobytes()) # 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, ocvType.mode, data])