Compartir a través de


Imagen

Importante

Databricks recomienda usar el origen de datos archivo binario para cargar datos de imagen en el elemento DataFrame de Spark como bytes sin procesar. Vea Solución de referencia para aplicaciones de imagen para conocer el flujo de trabajo recomendado para controlar datos de imagen.

El origen de datos de imagen abstrae de los detalles de las representaciones de imagen y proporciona una API estándar para cargar datos de imagen. Para leer archivos de imagen, especifique el origen de datos format como image.

df = spark.read.format("image").load("<path-to-image-data>")

Existen API similares para Scala, Java y R.

Puede importar una estructura de directorios anidada (por ejemplo, usar una ruta de acceso como /path/to/dir/) y puede usar la detección de particiones mediante la especificación de una ruta de acceso con un directorio de partición (es decir, una ruta de acceso como /path/to/dir/date=2018-01-02/category=automobile).

Estructura de imagen

Los archivos de imagen se cargan como DataFrame que contiene una sola columna de tipo struct denominada image con los campos siguientes:

image: struct containing all the image data
  |-- origin: string representing the source URI
  |-- height: integer, image height in pixels
  |-- width: integer, image width in pixels
  |-- nChannels
  |-- mode
  |-- data

donde los campos son:

  • nChannels: número de canales de color. Los valores típicos son 1 para las imágenes de escala de grises, 3 para las imágenes en color (por ejemplo, RGB) y 4 para las imágenes en color con canal alfa.

  • mode: marca de entero que indica cómo interpretar el campo de datos. Especifica el tipo de datos y el orden del canal en el que se almacenan los datos. Se espera (aunque no se aplica) que el valor del campo se asigne a uno de los tipos de OpenCV que se muestran en la tabla siguiente. Los tipos de OpenCV se definen para 1, 2, 3 o 4 canales y varios tipos de datos para los valores de píxel. El orden del canal especifica el orden en que se almacenan los colores. Por ejemplo, si tiene una imagen típica de tres canales con componentes rojo, azul y verde, hay seis posibles ordenaciones. La mayoría de las bibliotecas usan RGB o BGR. Se espera que los tipos de OpenCV de tres (cuatro) canales estén en orden BGR(A).

    Asignación de tipo a números en OpenCV (tipos de datos x número de canales)

    Tipo C1 C2 C3 C4
    CV_8U 0 8 16 24
    CV_8S 1 9 17 25
    CV_16U 2 10 18 26
    CV_16S 3 11 19 27
    CV_32U 4 12 20 28
    CV_32S 5 13 21 29
    CV_64F 6 14 22 30
  • data: datos de imagen almacenados en un formato binario. Los datos de imagen se representan como una matriz tridimensional con la forma de dimensión (alto, ancho, n canales) y valores de matriz de tipo t especificados por el campo de modo. La matriz se almacena por orden de fila principal.

Visualización de datos de imagen

La función display de Databricks admite la visualización de datos de imagen. Vea Imágenes.

Ejemplo de cuaderno: lectura y escritura de datos en archivos de imagen

En el cuaderno siguiente se muestra cómo leer y escribir datos en archivos de imagen.

Cuaderno de origen de datos de imágenes

Obtener el cuaderno

Limitaciones del origen de datos de imagen

El origen de datos de imágenes descodifica los archivos de imagen durante la creación del elemento DataFrame de Spark, aumenta el tamaño de los datos e incorpora limitaciones en los escenarios siguientes:

  1. Conservación de DataFrame: si quiere conservar el elemento DataFrame en una tabla Delta para facilitar el acceso, debe conservar los bytes sin procesar en lugar de los datos descodificados para ahorrar espacio en disco.
  2. Orden aleatorio de las particiones: el orden aleatorio de los datos de imagen descodificados necesita más espacio en disco y ancho de banda, lo que da lugar a un orden aleatorio más lento. Debe retrasar la decodificación de la imagen tanto como sea posible.
  3. Elección de otro método de descodificación: el origen de datos de imágenes usa la biblioteca de E/S de imagen de javax para descodificar la imagen, lo que no permite elegir otras bibliotecas de descodificación de imágenes para mejorar el rendimiento o implementar lógica de descodificación personalizada.

Estas limitaciones se pueden evitar mediante el origen de datos archivo binario para cargar datos de imagen y descodificar solo cuando sea necesario.