将光谱数据图片转换成数值格式

2024-08-20 19:52

本文主要是介绍将光谱数据图片转换成数值格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 任务
  • 所需工具
  • 步骤一:安装必要的Python库
  • 步骤二:图像OCR识别
  • 步骤三:提取光谱数值并存储
  • 完整代码

任务

现测量收集到一批目标色彩样本的光谱响应数据截图(图片保存在spectrum_screenshots文件夹内,截图样例见图1)。其中,一个样本的光数据是从波长360纳米(nm)到750纳米分别测量得到的对应光强度值(实数)。
图1所示光谱数据为:7.319(360nm),7.339(370nm),6.860(380nm),…,80.(750nm);Checksum值(所有波长上光谱强度值的和)为790.337。
要求:将486张光谱数据图片转成数值格式
在这里插入图片描述

所需工具

Python: 编程语言
cnocr: 一个中文OCR工具,用于从图片中提取文本
PIL (Python Imaging Library): 用于打开和处理图片
openpyxl: 用于在Excel中创建和编辑工作表

步骤一:安装必要的Python库

在开始之前,确保你已经安装了所有必要的Python库。你可以通过以下命令安装这些库:

pip install cnocr pillow openpyxl

步骤二:图像OCR识别

我们将使用cnocr库从光谱数据图片中提取文本。由于OCR提取出的文本格式可能不一致,我们需要对其进行清理和格式化。以下是处理这些文本的代码:

import os
import re
import cnocr
from PIL import Image
from openpyxl import Workbookdef remove_spaces_around_decimal(input_str):result = []l=len(input_str)for i in range(1,l-1):if input_str[i] == ' ' and input_str[i-1]=='.':continueif input_str[i] == ' ' and input_str[i + 1] == '.':continueif input_str[i] == '.' and input_str[i + 1] == '.':continueif (input_str[i]!='.' and input_str[i]!=' 'and(input_str[i]<'0' or input_str[i]>'9'))and input_str[i + 1] == '.':continueif (input_str[i]!='.' and input_str[i]!=' 'and(input_str[i]<'0' or input_str[i]>'9'))and input_str[i - 1] == '.':continueresult.append(input_str[i])return ''.join(result)

这个函数主要用来清理OCR识别出的文本,去除多余的空格和不必要的字符,确保后续的正则表达式能准确提取数值。

步骤三:提取光谱数值并存储

我们将光谱数据图片文件夹中的每张图片转换为对应的数值格式,并将其保存到Excel文件中。以下是实现这一任务的完整代码:

def extract_float_numbers_from_images(directory):# 初始化 cnocrocr = cnocr.CnOcr()# 创建一个 Excel 工作簿wb = Workbook()ws = wb.active# 添加列标题columns = ["Filename", "360nm", "370nm", "380nm", "390nm", "400nm", "410nm", "420nm", "430nm","440nm","450nm", "460nm", "470nm", "480nm","490nm", "500nm", "510nm", "520nm", "530nm", "540nm","550nm", "560nm", "570nm", "580nm", "590nm", "600nm", "610nm", "620nm","630nm", "640nm", "650nm", "660nm", "670nm", "680nm", "690nm", "700nm", "710nm", "720nm", "730nm", "740nm", "750nm", "Checksum"]ws.append(columns)# 使用正则表达式匹配文件名中的数字部分pattern = r'\d+'# 遍历指定目录下的所有文件for filename in os.listdir(directory):# 仅处理 JPEG 格式的文件if filename.endswith(".jpg"):# 从文件名中提取数字部分match = re.match(pattern, filename)if match:file_number = match.group()file_path = os.path.join(directory, filename)# 使用 cnocr 提取文本text = ocr.ocr(Image.open(file_path))# 合并提取的文本extracted_text = ''for line in text:if 'text' in line:extracted_text += (line['text']+' ')extracted_text = remove_spaces_around_decimal(extracted_text)# 使用正则表达式匹配浮点数的模式float_numbers = re.findall(r'\d+\.\d+', extracted_text)# 创建一个列表,用于存储每行的数据row_data = [filename] + float_numbers# 如果提取的浮点数数量少于所需的列数,则补充空白while len(row_data) < len(columns):row_data.append("")# 将文件名和提取的浮点数写入 Excel 表格ws.append(row_data)# 保存 Excel 文件excel_filename = "extracted_float_numbers.xlsx"wb.save(excel_filename)print(f"Float numbers extracted from images and saved to {excel_filename}")

运行程序
将代码保存为一个Python脚本文件,并在命令行中运行:

python your_script_name.py

效果:
在这里插入图片描述

利用OCR技术从图片中提取光谱数据,并将其转换为数值格式存储在Excel中。这种方法可以用于各种场景下的数据提取和处理。

完整代码

import os
import re
import cnocr
from PIL import Image
from openpyxl import Workbook#由于使用cnocr识别出的字符串存在很多格式上的问题
#我在多次写入表格查看以及输出对照数据之后,写了一个处理这些错误格式的函数,经过函数处理之后得到的字符串基本上都可以完美的经过正则表达式的处理得到41个浮点数
def remove_spaces_around_decimal(input_str):result = []l=len(input_str)for i in range(1,l-1):if input_str[i] == ' ' and input_str[i-1]=='.':continueif input_str[i] == ' ' and input_str[i + 1] == '.':continueif input_str[i] == '.' and input_str[i + 1] == '.':continueif (input_str[i]!='.' and input_str[i]!=' 'and(input_str[i]<'0' or input_str[i]>'9'))and input_str[i + 1] == '.':continueif (input_str[i]!='.' and input_str[i]!=' 'and(input_str[i]<'0' or input_str[i]>'9'))and input_str[i - 1] == '.':continueresult.append(input_str[i])return ''.join(result)
def extract_float_numbers_from_images(directory):# 初始化 cnocrocr = cnocr.CnOcr()# 创建一个 Excel 工作簿wb = Workbook()ws = wb.active# 添加列标题columns = ["Filename", "360nm", "370nm", "380nm", "390nm", "400nm", "410nm", "420nm", "430nm","440nm","450nm", "460nm", "470nm", "480nm","490nm", "500nm", "510nm", "520nm", "530nm", "540nm","550nm", "560nm", "570nm", "580nm", "590nm", "600nm", "610nm", "620nm","630nm", "640nm", "650nm", "660nm", "670nm", "680nm", "690nm", "700nm", "710nm", "720nm", "730nm", "740nm", "750nm", "Checksum"]ws.append(columns)# 使用正则表达式匹配文件名中的数字部分pattern = r'\d+'# 遍历指定目录下的所有文件for filename in os.listdir(directory):# 仅处理 JPEG 格式的文件if filename.endswith(".jpg"):# 从文件名中提取数字部分match = re.match(pattern, filename)if match:file_number = match.group()file_path = os.path.join(directory, filename)# 使用 cnocr 提取文本text = ocr.ocr(Image.open(file_path))# 合并提取的文本extracted_text = ''for line in text:if 'text' in line:extracted_text += (line['text']+' ')extracted_text = remove_spaces_around_decimal(extracted_text)# 使用正则表达式匹配浮点数的模式float_numbers = re.findall(r'\d+\.\d+', extracted_text)# 创建一个列表,用于存储每行的数据row_data = [filename] + float_numbers# 如果提取的浮点数数量少于所需的列数,则补充空白while len(row_data) < len(columns):row_data.append("")# 将文件名和提取的浮点数写入 Excel 表格ws.append(row_data)# 保存 Excel 文件excel_filename = "extracted_float_numbers.xlsx"wb.save(excel_filename)print(f"Float numbers extracted from images and saved to {excel_filename}")# 调用函数并传入图片所在的目录路径
extract_float_numbers_from_images(r'G:\spectrum_screenshots')

这篇关于将光谱数据图片转换成数值格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

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

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

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

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

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