Share via


Image

Importante

O Databricks recomenda que você use a fonte de dados de arquivo binário para carregar dados de imagem no Spark DataFrame como bytes brutos. Consulte Solução de referência para aplicativos de imagem para o fluxo de trabalho recomendado para lidar com dados de imagem.

A fonte de dados de imagem abstrai dos detalhes das representações de imagem e fornece uma API padrão para carregar dados de imagem. Para ler arquivos de imagem, especifique a fonte format de dados como image.

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

Existem APIs semelhantes para Scala, Java e R.

Você pode importar uma estrutura de diretório aninhada (por exemplo, usar um caminho como ) e pode usar a descoberta de partição especificando um caminho com um diretório de partição (ou seja, um caminho como /path/to/dir//path/to/dir/date=2018-01-02/category=automobile).

Estrutura da imagem

Os arquivos de imagem são carregados como um DataFrame contendo uma única coluna do tipo struct chamada image com os seguintes campos:

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

onde os campos são:

  • nChannels: O número de canais de cor. Os valores típicos são 1 para imagens em tons de cinza, 3 para imagens coloridas (por exemplo, RGB) e 4 para imagens coloridas com canal alfa.

  • mode: Sinalizador inteiro que indica como interpretar o campo de dados. Ele especifica o tipo de dados e a ordem do canal em que os dados são armazenados. O valor do campo é esperado (mas não imposto) para mapear para um dos tipos de OpenCV exibidos na tabela a seguir. Os tipos OpenCV são definidos para 1, 2, 3 ou 4 canais e vários tipos de dados para os valores de pixel. Ordem do canal especifica a ordem em que as cores são armazenadas. Por exemplo, se você tiver uma imagem típica de três canais com componentes vermelhos, azuis e verdes, há seis pedidos possíveis. A maioria das bibliotecas usa RGB ou BGR. Espera-se que três (quatro) tipos de canais OpenCV estejam na ordem BGR(A).

    Mapa do tipo para números no OpenCV (tipos de dados x número de canais)

    Type C1 C2 C3 C4
    CV_8U 0 8 16 24
    CV_8S 5 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: Dados de imagem armazenados em formato binário. Os dados de imagem são representados como uma matriz de 3 dimensões com a forma de dimensão (altura, largura, nChannels) e valores de matriz do tipo t especificados pelo campo de modo. A matriz é armazenada em ordem de linha principal.

Exibir dados de imagem

A função Databricks suporta a exibição de dados de display imagem. Veja Imagens.

Exemplo de bloco de notas: ler e escrever dados em ficheiros de imagem

O bloco de anotações a seguir mostra como ler e gravar dados em arquivos de imagem.

Bloco de anotações de fonte de dados de imagem

Obter o bloco de notas

Limitações da fonte de dados de imagem

A fonte de dados de imagem decodifica os arquivos de imagem durante a criação do Spark DataFrame, aumenta o tamanho dos dados e introduz limitações nos seguintes cenários:

  1. Persistindo o DataFrame: Se você quiser persistir o DataFrame em uma tabela Delta para facilitar o acesso, você deve persistir os bytes brutos em vez dos dados decodificados para economizar espaço em disco.
  2. Embaralhar as partições: embaralhar os dados de imagem decodificados leva mais espaço em disco e largura de banda de rede, o que resulta em embaralhamento mais lento. Você deve atrasar a decodificação da imagem tanto quanto possível.
  3. Escolhendo outro método de decodificação: A fonte de dados de imagem usa a biblioteca de E/S de imagem do javax para decodificar a imagem, o que impede que você escolha outras bibliotecas de decodificação de imagem para um melhor desempenho ou implemente uma lógica de decodificação personalizada.

Essas limitações podem ser evitadas usando a fonte de dados de arquivo binário para carregar dados de imagem e decodificar somente conforme necessário.