映像

重要

Databricks 建议使用二进制文件数据源将图像数据以原始字节形式加载到 Spark 数据帧中。 如需了解建议的用于处理图像数据的工作流,请参阅图像应用程序的参考解决方案

图像数据源从图像表示形式的详细信息中提取内容,并提供一个标准 API 来加载图像数据。 若要读取图像文件,请将数据源 format 指定为 image

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

Scala、Java 和 R 存在类似的 API。

你可以导入嵌套的目录结构(例如,使用 /path/to/dir/ 之类的路径),也可以通过指定具有分区目录的路径(即 /path/to/dir/date=2018-01-02/category=automobile 之类的路径)来使用分区发现。

图像结构

图像文件将以数据帧的形式加载,其中包含一个名为 image 的单结构类型列,该列中包含以下字段:

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

其中的字段包括:

  • nChannels:颜色通道数。 对于灰度图像,典型值为 1;对于彩色图像(例如 RGB),典型值为 3;对于具有 alpha 通道的彩色图像,典型值为 4。

  • mode:一个整数标志,指示如何解释数据字段。 它指定数据类型和存储数据的通道顺序。 该字段的值应该(此处不是指强制)映射到下表中显示的 OpenCV 类型之一。 为 1、2、3 或 4 个通道定义了 OpenCV 类型,而为像素值定义了几种数据类型。 通道顺序指定了颜色存储的顺序。 例如,如果你有一个具有红色、蓝色和绿色成分的典型三通道图像,则有六种可能的排序。 大多数库使用 RGB 或 BGR。 三(四)通道 OpenCV 类型应采用 BGR(A) 顺序。

    OpenCV 中从类型到数量的映射(数据类型 x 通道数)

    类型 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:以二进制格式存储的图像数据。 图像数据以三维数组的形式表示,其中包含维度形状(height、width、nChannels)和由模式字段指定的 t 类型数组值。 数组以行优先顺序存储。

显示图像数据

Databricks display 函数支持显示图像数据。 请参阅图像

笔记本示例:在图像文件中读取和写入数据

以下笔记本演示如何在图像文件中读取和写入数据。

图像数据源笔记本

获取笔记本

图像数据源的限制

在以下场景中,图像数据源在 Spark 数据帧创建过程中对图像文件进行解码,增加数据大小,并引入限制:

  1. 保存数据帧:若要将数据帧保存到 Delta 表中以方便访问,则应保存原始字节(而不是已解码的数据)以节省磁盘空间。
  2. 随机选择分区:随机选择已解码的图像数据会占用较多的磁盘空间和网络带宽,这会导致随机选择的速度变慢。 应尽量延迟对图像的解码。
  3. 选择其他解码方法:图像数据源使用 javax 的 Image IO 库对图像进行解码,这会阻止你选择其他图像解码库以提高性能或实现自定义解码逻辑。

使用二进制文件数据源加载图像数据并仅根据需要进行解码,可以避免这些限制。