spark2.4开始支持image图片数据源操作!!

2024-06-15 22:32

本文主要是介绍spark2.4开始支持image图片数据源操作!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

相关知识

色彩理论之颜色模式:
https://www.colortell.com/1463.html

java.awt.Color介绍:
https://www.cnblogs.com/21summer/p/9309435.html

javax.imageio.ImageIO:
https://blog.csdn.net/tanga842428/article/details/78573354

https://docs.oracle.com/javase/7/docs/api/javax/imageio/package-summary.html

使用例子

val spark = SparkSession.builder().appName("Spark SQL basic example").master("local").getOrCreate()val dataFrame = spark.read.format("image").option("dropInvalid", true).load("data/images/partitioned")dataFrame.printSchema()dataFrame.select(col("cls"),col("date"),col("image.origin"),col("image.height"),col("image.width"),col("image.nChannels"),col("image.mode")).show(false)

在这里插入图片描述
当前支持的参数只有一个:dropInvalid:是否从结果中删除无效的图片

暂不支持图片数据源写到文件中。

上述代码运行结果如下:
cls 和date都是根据分区读取出来的,图片的格式只有一个字段就是image,但是image是一个嵌套的类型。

从这里面我们可以灵活使用分区字段,比如放到机器学习中,我们可以当作 label,不同图片存放在不同的label下面,可以将其归类。

在这里插入图片描述
dropInvalid参数设置为false的输出结果:
在这里插入图片描述

例子分析

format(“image”)

上述代码展示了使用sparksession读写image数据源的例子,下面我们具体分析。format参数是image意味着会去找到DataSourceRegister 的子类,重写了shortName为image的具体实现类。下面的代码即使所要使用的类,ImageFileFormat 集成了FileFormat实现了 DataSourceRegister 接口。

private[image] class ImageFileFormat extends FileFormat with DataSourceRegister {override def inferSchema(sparkSession: SparkSession,options: Map[String, String],files: Seq[FileStatus]): Option[StructType] = Some(ImageSchema.imageSchema)override def shortName(): String = "image"......
}

图片数据的schema

那么我们来看一下image数据格式是什么,上面代码中重写了inferSchema方法,我们可以看到调用了ImageSchema.imageSchema,我们看看具体实现:

//我们会发现读取image图片后dataframe只有单一的一列,名字是image,而image对应的列的类型就是columnSchema
val imageSchema = StructType(StructField("image", columnSchema, true) :: Nil)//那么columnSchema是什么呢?其实很明显dataframe虽然只有一列名字叫做image,但是它的类型却是嵌套类型val columnSchema = StructType(StructField("origin", StringType, true) ::StructField("height", IntegerType, false) ::StructField("width", IntegerType, false) ::StructField("nChannels", IntegerType, false) ::// OpenCV-compatible type: CV_8UC3 in most casesStructField("mode", IntegerType, false) ::// Bytes in OpenCV-compatible order: row-wise BGR in most casesStructField("data", BinaryType, false) :: Nil)

对于image列对应的schema类型其实就是Row(String, Int, Int, Int, Int, Array[Byte])
image中每一列字段解释:

  • origin :图片路径
  • height:图片高度
  • width:图片宽度
  • nChannerls:图片通道数量
  • mode:openCV兼容的类型
  • data:以openCV兼容的方式排列,大多数情况下按行排列BGR

打印出来的schema信息:

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)|-- cls: string (nullable = true)|-- date: string (nullable = true)

mode字段取值:openCV支持的类型:

CV_<bit_depth>(S|U|F)C<number_of_channels>

  val ocvTypes: Map[String, Int] = Map(undefinedImageType -> -1,"CV_8U" -> 0, "CV_8UC1" -> 0, "CV_8UC3" -> 16, "CV_8UC4" -> 24)
 1--bit_depth---比特数---代表8bite,16bites,32bites,64bites---举个例子吧--比如说,如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位--所以它对应的就是CV_82--S|U|F--S--代表---signed int---有符号整形U--代表--unsigned int--无符号整形F--代表--float---------单精度浮点型3--C<number_of_channels>----代表---一张图片的通道数,比如:1--灰度图片--grayImg---是--单通道图像2--RGB彩色图像---------是--3通道图像3--带Alph通道的RGB图像--是--4通道图像

颜色的通道:

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

例子举例说明

//简单例子
//isGray是判断是否是灰度图像的
val (nChannels, mode) = if (isGray) {(1, ocvTypes("CV_8UC1"))} else if (hasAlpha) {(4, ocvTypes("CV_8UC4"))} else {(3, ocvTypes("CV_8UC3"))}

我们简单看一个灰度图像例子:下面的图像是我们所读路径下的一个图片,具体路径如下
data/images/partitioned/cls=multichannel/date=2018-02/grayscale.jpg
在这里插入图片描述

对应的输出如下:

字段如下:
|cls         |date   |origin     |height   |width   |nChannels      |mode|分别对应如下:
multichannel
2018-02
file:///Users/hehuiyuan/ideawarehouse/DebugCode/data/images/partitioned/cls=multichannel/date=2018-02/grayscale.jpg     
215   
300 
1        
0   

这篇关于spark2.4开始支持image图片数据源操作!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064760

相关文章

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指