映像
重要
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 数据帧创建过程中对图像文件进行解码,增加数据大小,并引入限制:
- 保存数据帧:若要将数据帧保存到 Delta 表中以方便访问,则应保存原始字节(而不是已解码的数据)以节省磁盘空间。
- 随机选择分区:随机选择已解码的图像数据会占用较多的磁盘空间和网络带宽,这会导致随机选择的速度变慢。 应尽量延迟对图像的解码。
- 选择其他解码方法:图像数据源使用 javax 的 Image IO 库对图像进行解码,这会阻止你选择其他图像解码库以提高性能或实现自定义解码逻辑。
使用二进制文件数据源加载图像数据并仅根据需要进行解码,可以避免这些限制。