Spark2.4开始支持内置的图片数据源读取器,可以直接读取图片的数据。
val df = spark.read.format("image").load("/opt/pic/")
目录可以还可以是/path/to/dir/**和分区目录。
Image Schema
读取的数据会生成一个DF,该DF就一列列名字叫做 image。但是其实他是个嵌套数据结构,具体结构如下
root|-- image: struct (nullable = true)| |-- origin: string (nullable = true)| |-- height: integer (nullable = true)| |-- width: integer (nullable = true)| |-- nChannels: integer (nullable = true)| |-- mode: integer (nullable = true)| |-- data: binary (nullable = true)
orgin:代表图片的路径。
nChannels:颜色通道的数量。对于灰度图像,典型值为1,对于彩色图像(例如,RGB),典型值为3,对于具有alpha通道的彩色图像,典型值为4。
mode:整数标志,提供有关如何解释数据字段的信息。它指定数据存储的数据类型和通道顺序。希望(但不强制)字段的值映射到下面显示的OpenCV类型之一。OpenCV类型定义为1,2,3或4个通道,并为像素值定义了几种数据类型。通道顺序指定颜色的存储顺序。例如,如果有一个包含红色,蓝色和绿色组件的典型三通道图像,则有六种可能的排序。大多数库使用RGB或BGR。希望三(4)个通道OpenCV类型为BGR(A)顺序。
OpenCV中的类型到数字的映射(数据类型x通道数)
data:以二进制格式存储的图像数据。图像数据表示为具有尺寸形状(高度,宽度,n通道)和由schema字段指定的类型t的数组值的三维阵列。该数组以row-major顺序存储。
通道顺序(channel order)
通道顺序指定存储颜色的顺序。例如,如果您有一个包含红色,蓝色和绿色组件的典型三通道图像,则有六种可能的排序。大多数库使用RGB或BGR。预计三(4)个通道OpenCV类型为BGR(A)顺序
案例
对于有监督学习,可以用label作为分区列,目前label仅仅支持数字类型。
val spark = SparkSession .builder() .appName("Spark reads pics") .master("local[2]") .getOrCreate()
val df = spark.read.format("image").load("/opt/pic")
df.printSchema()df.select(col("label"), col("image.origin"), col("image.height"), col("image.width"), col("image.nChannels"), col("image.mode")).show(1,false)
spark.stop()
关于图片处理,目前spark支持的算法并不是很多,希望后续版本继续完善吧。
数据下载地址
http://download.tensorflow.org/example_images/flower_photos.tgz
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有