使用python+opencv解析图像和文本数据

1. 创建虚拟环境

新建文件夹, 并在文件夹中创建虚拟环境,可以使用Vscode打开文件夹, 然后在终端中输入以下命令:

python -m venv venv

2. 激活虚拟环境

在终端中输入以下命令:

venv\Scripts\activate

3. 安装依赖

在终端中输入以下命令:

pip install opencv-python
pip install matplotlib Pillow

4. 使用opencv获取图像信息

import cv2
import numpy
import numpy as np
import pylab
import PIL.Image as Image
import matplotlib.pyplot as pltimgfile = input("请输入图片名:")
txtfile = input("请输入存储文本文件名:")img = cv2.imread(imgfile, cv2.IMREAD_COLOR)print("图像的形状,返回一个图像的(行数,列数,通道数):", img.shape)
print("图像的像素数目:", img.size)
print("图像的数据类型:", img.dtype)print("img:",img[0][0][1])

代码解释

  1. 导入库

    • import cv2: 导入 OpenCV 库,用于计算机视觉任务。
    • import numpy: 导入 NumPy 库,支持大规模的多维数组和矩阵运算。
    • import numpy as np: 将 NumPy 库重命名为 np,以便后续使用。
    • import pylab: 导入 pylab(通常用于绘图),不过在这段代码中并未使用。
    • import PIL.Image as Image: 导入 PIL 库的 Image 模块,用于处理图像,尽管在这段代码中并未使用。
    • import matplotlib.pyplot as plt: 导入 Matplotlib 库,用于绘图,但在这段代码中也未被使用。

    matplotlibPillow 是 Python 中常用的两个库,分别用于数据可视化和图像处理。

  2. 用户输入

    • imgfile = input("请输入图片名:"): 提示用户输入要读取的图片文件名。
    • txtfile = input("请输入存储文本文件名:"): 提示用户输入要保存像素数据的文本文件名。
  3. 读取图像

    • img = cv2.imread(imgfile, cv2.IMREAD_COLOR): 使用 OpenCV 读取指定的图像文件,cv2.IMREAD_COLOR 表示以彩色模式读取图像。
  4. 输出图像信息

    • img.shape: 返回图像的形状,包含行数(高度)、列数(宽度)和通道数(通常为 3,表示 RGB)。
    • img.size: 返回图像的总像素数。
    • img.dtype: 返回图像的数据类型(如 uint8)。

扩展

  1. matplotlib:

    • 用途: matplotlib 是一个强大的数据可视化库,用于创建静态、动态和交互式图表和图形。它支持多种图形类型,包括折线图、散点图、柱状图、饼图等。
    • 功能:
      • 绘制高质量的图形。
      • 自定义图形的外观(颜色、样式、标签等)。
      • 支持多种输出格式(如 PNG、PDF、SVG 等)。
      • 可以与 NumPy 和 Pandas 等其他库结合使用,方便数据分析。
  2. Pillow:

    • 用途: Pillow 是 Python Imaging Library (PIL) 的一个分支,主要用于图像处理。它提供了丰富的功能来打开、操作和保存图像文件。
    • 功能:
      • 支持多种图像格式(如 JPEG、PNG、GIF 等)。
      • 提供图像的基本操作(如剪裁、缩放、旋转、滤镜等)。
      • 可以创建新的图像和进行图形绘制(如添加文本、图形等)。
      • 方便处理图像的颜色模式(如 RGB、RGBA、灰度等)。

matplotlib 主要用于数据可视化,而 Pillow 则专注于图像处理,它们在数据分析和图像处理领域各自发挥着重要的作用。

总结

这段代码主要用于读取图像的基本信息,包括图像的形状、像素数目和数据类型。它使用 OpenCV 库来读取图像,并输出这些信息。请注意,在实际应用中,可能还需要进行其他图像处理操作,如调整大小、裁剪、转换颜色空间等。

5. 将图像数据写入文本

fname = open(txtfile, 'w')Xlenth = img.shape[1]  
Ylenth = img.shape[0]  
k = 3  for i in range(Ylenth):for j in range(Xlenth):for h in range(k):fname.write(str(img[i][j][h]) + ' ')
fname.close()

这段代码的目的是将图像数据写入一个文本文件。下面是代码的逐行解释:

  1. 打开文件:

    fname = open(txtfile, 'w')
    

    这行代码打开一个名为 txtfile 的文本文件,并以写入模式 ('w') 打开。如果文件不存在,将会创建一个新文件。

  2. 获取图像的维度:

    Xlenth = img.shape[1]  
    Ylenth = img.shape[0]  
    k = 3  
    

    这里使用 img.shape 来获取图像的维度。img.shape[1] 返回图像的宽度(X方向的长度),img.shape[0] 返回图像的高度(Y方向的长度)。变量 k 被设置为 3,通常表示图像的颜色通道数(例如,RGB图像有红、绿、蓝三个通道)。

  3. 嵌套循环遍历图像数据:

    for i in range(Ylenth):for j in range(Xlenth):for h in range(k):
    

    这部分代码使用三个嵌套的循环来遍历图像的每一个像素和对应的颜色通道:

    • 外层循环 for i 遍历每一行(高度)。
    • 中间循环 for j 遍历每一列(宽度)。
    • 内层循环 for h 遍历每个像素的颜色通道(红、绿、蓝)。
  4. 写入像素值:

    fname.write(str(img[i][j][h]) + ' ')
    

    这行代码将当前像素在第 i 行、第 j 列的第 h 个颜色通道的值(通常是一个整数,表示颜色的强度)转换为字符串,并写入文件。每个值后面跟一个空格,以便在读取时区分不同的值。

  5. 关闭文件:

    fname.close()
    

    最后,关闭文件以确保所有数据都被写入,并释放系统资源。

总结

这段代码的功能是将图像的每个像素的RGB值按行写入到一个文本文件中,每个值之间用空格分隔。这种格式可以方便后续的数据处理或分析。

6. 从文本中读取图像数据

blist = []
split_char = ' '
with open(txtfile, 'r') as bf:blist = [b.strip().split(split_char) for b in bf]array_len = Ylenth * Xlenth * 3
print("blist:", (blist[0][array_len - 1]))for i in range(1):for j in range(array_len - 1):blist[i][j] = int(blist[i][j])new_blist = np.zeros((img.shape)).astype("uint8")
i = 0
for j in range(Ylenth):for k in range(Xlenth):for l in range(3):new_blist[j][k][l] = blist[0][i]i = i + 1if (i >= array_len):breakprint("new_blist:", (new_blist[0][0][1]))# # 因为ov的存储图像的方式是BGR顺序,所以要将其转变成RGB输出的话才能得到正确的图像B = new_blist[:, :, 0]
G = new_blist[:, :, 1]
R = new_blist[:, :, 2]src_new = np.zeros((img.shape)).astype("uint8")
src_new[:, :, 0] = R
src_new[:, :, 1] = G
src_new[:, :, 2] = Btlist = numpy.array(src_new)

这段代码的功能是从一个文本文件中读取数据,处理这些数据,然后将其转换为一个图像数组。下面是代码的逐步解释:

  1. 初始化和读取文件:

    blist = []
    split_char = ' '
    with open(txtfile, 'r') as bf:blist = [b.strip().split(split_char) for b in bf]
    
    • blist 是一个空列表,用于存储从文件中读取的数据。
    • split_char 定义了分隔符,默认为空格。
    • 通过 with open(...) 打开一个名为 txtfile 的文本文件,逐行读取文件内容,去掉每行的空白字符,然后按 split_char 分隔。最终,每行的数据以列表形式存储在 blist 中。
  2. 计算数组长度:

    array_len = Ylenth * Xlenth * 3
    print("blist:", (blist[0][array_len - 1]))
    
    • array_len 计算图像数据的总长度,假设图像的高度为 Ylenth,宽度为 Xlenth,且每个像素有三个颜色通道(RGB)。
    • 打印 blist 中的某个值,通常是为了调试。
  3. 数据转换:

    for i in range(1):for j in range(array_len - 1):blist[i][j] = int(blist[i][j])
    
    • blist 中的字符串数据转换为整数,通常表示像素的颜色值。
  4. 创建新数组:

    new_blist = np.zeros((img.shape)).astype("uint8")
    i = 0
    for j in range(Ylenth):for k in range(Xlenth):for l in range(3):new_blist[j][k][l] = blist[0][i]i = i + 1if (i >= array_len):break
    
    • 创建一个新的零数组 new_blist,其形状与原图像 img 相同,数据类型为无符号8位整数。
    • 使用三个嵌套循环遍历图像的每个像素。在每个像素的 RGB 通道中填充对应的颜色值。
  5. 打印新数组的值:

    print("new_blist:", (new_blist[0][0][1]))
    
    • 打印 new_blist 中的某个值,通常是为了验证数据是否正确。
  6. 分离颜色通道:

    B = new_blist[:, :, 0]
    G = new_blist[:, :, 1]
    R = new_blist[:, :, 2]
    
    • new_blist 中的颜色通道分离到单独的变量 B(蓝色)、G(绿色)和 R(红色)。
  7. 创建新的图像数组:

    src_new = np.zeros((img.shape)).astype("uint8")
    src_new[:, :, 0] = R
    src_new[:, :, 1] = G
    src_new[:, :, 2] = B
    
    • 创建一个新的零数组 src_new,并将分离的颜色通道按顺序填回去,注意颜色的顺序是 R、G、B。
  8. 最终输出:

    tlist = numpy.array(src_new)
    
    • 最后,将 src_new 转换为 NumPy 数组,赋值给 tlist,这通常是为了后续的图像处理或显示。

这段代码的整体目的是从文本文件中读取图像数据,并将其转换为可用于图像处理的 NumPy 数组。

7. 显示图像

plt.figure()
plt.imshow(tlist)
plt.axis('on')  
pylab.show()cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()cv2.imwrite('output_image.png', img)

这段代码涉及到使用 Python 的 Matplotlib 和 OpenCV 库来处理和显示图像。以下是每一行代码的详细解释:

  1. plt.figure():

    • 这行代码创建一个新的图形窗口。plt 是 Matplotlib 库的一个常用别名,用于绘图和显示图像。
  2. plt.imshow(tlist):

    • 这行代码用来显示图像。tlist 应该是一个包含图像数据的数组(例如,二维或三维的 NumPy 数组)。imshow 函数会将这个数组作为图像进行渲染。
  3. plt.axis('on'):

    • 这行代码设置坐标轴的显示状态为“开启”。默认情况下,坐标轴可能是关闭的,调用这个函数后,图像的坐标轴将会显示出来。
  4. pylab.show():

    • 这行代码会显示所有打开的图形窗口。pylab 是 Matplotlib 的一个模块,提供了一个类似于 MATLAB 的接口。调用 show() 会暂停程序的执行,直到所有的图形窗口关闭。
  5. cv2.imshow('image', img):

    • 这行代码使用 OpenCV 库显示图像。imshow 函数的第一个参数是窗口名称(在这里是 'image'),第二个参数是要显示的图像数据(img)。这会在一个新的窗口中弹出显示该图像。
  6. cv2.waitKey(0):

    • 这行代码等待用户按下任意键。0 表示无限期等待,直到用户按下键盘上的任意键。这个函数是必要的,以便保持图像窗口打开。
  7. cv2.destroyAllWindows():

    • 这行代码关闭所有由 OpenCV 创建的窗口。它确保在程序结束时,所有图像窗口都被正确关闭,释放系统资源。
  8. cv2.imwrite('output_image.png', img):

    • 这行代码将图像数据(img)保存到文件中,文件名为 'output_image.png'。如果文件已经存在,将会被覆盖。

这段代码组合了 Matplotlib 和 OpenCV 的功能,允许用户在图形窗口中查看图像,同时也可以使用 OpenCV 的功能来显示和保存图像。

8. 效果实现

py main.py

根据提示输入图片名和存储文本文件名,将图片数据解析到文本

在这里插入图片描述

图片数据解析成功,获取到了图像的基本信息,并解析到了了文本文件中

在这里插入图片描述

随后我们将文本文件中的数据解析到图像中,并显示了出来

在这里插入图片描述

稍后使用opencv弹出图像

在这里插入图片描述

随后我们将解析到的图像保存到了本地

可以使用其他图片再次测试

在这里插入图片描述

在这里插入图片描述

以上就是使用python+opencv解析图像和文本数据的全部流程了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/53304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习示例2-多输入多输出的神经网络模型

一、代码示例 from tensorflow import keras from tensorflow.keras import layers import numpy as np# 定义 多输入 多输出的模型 vocabulary_size = 1000 num_tags = 100 num_departments = 4title = keras.Input(shape=(vocabulary_size,), name = "title") tex…

kali——msfconsole的使用

目录 前言 msfconsole的使用基础 启动mfsconsole 各种辅助模块的使用 端口扫描模块(portscan) 查看端口扫描的模块 使用模块 查看所需设置 手动设置 执行 退出 各种漏洞模块的使用 nmap扫描主机漏洞 查看漏洞模块 使用漏洞模块 查看所需设…

Prometheus通过node_exporter监控Node节点,Node节点的详细指标解读

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)1.9-1.10

目录 第四门课 卷积神经网络(Convolutional Neural Networks)第一周 卷积神经网络(Foundations of Convolutional Neural Networks)1.9 池化层(Pooling layers)1.10 卷 积 神 经 网 络 示 例 ( …

Linux_kernel汇编驱动06

一、ARM汇编语言(GUN-gcc编译器下) 1、语句格式 {symbol} {instruction|directive|pseudo-instruction} { comment} symbol:为符号。 在ARM汇编语言中,符号必须从一行的行头开始,并且符号中不能包含空格。 在指令和伪指…

基于C++实现(MFC界面)家谱管理系统

一、题目:家谱管理系统 二、内容: 2.1 概述 2.1.1 选题原因 做此题的原因是因为可以比较方便的记录家族历代成员的情况与关系,能很好的保存家族每一代的信息,而不用人工纸质的方式来存取家谱,更便于人们保存和使用…

爬虫练习(js逆向解密)

目标 网站地址交易列表 - 福建省公共资源交易电子公共服务平台 (fj.gov.cn) 抓取内容如下: 分析 查找js代码 点击下一页翻页的时候,查看请求返回的数据,发现data数据是经过加密后得到的 通过全局搜索data,发现有两千多个结果,一个…

AI超强语音转文本SenseVoice,本地化部署教程!

文章目录 模型介绍SenseVoice在线预览链接本地化部署VsCode 远程连接 模型介绍 SenseVoice专注于高精度多语言语音识别、情感辨识和音频事件检测 多语言识别: 采用超过40万小时数据训练,支持超过50种语言,识别效果上优于Whisper模型。富文本…

跨境电商代购系统中前台基本功能介绍:帮助更快的了解跨境代购业务

前台多语言:可支持语言有中文(繁体)中文(简体)英文等。多语言使用百度翻译引擎接口实现,翻译效果与百度一致;网站语言分为两大块:1.系统后台有语言包可以编辑修改网站标题以及发布文…

WPS中JS宏使用说明(持续优化...)

前言 好久没发文章了,今天闲来无事发篇文章找找之前的码字感觉。 正文 最近在写教案,发现之前的技术又可以派上用场了。就是JS,全称JavaScript,这个语言太强大了,我发现WPS里的宏现在默认就是JS。功能选项如下图&…

MySQL数据库安装(详细)—>Mariadb的安装(day21)

该网盘链接有效期为7天,有需要评论区扣我: 通过网盘分享的文件:mariadb-10.3.7-winx64.msi 链接: https://pan.baidu.com/s/1-r_w3NuP8amhIEedmTkWsQ?pwd2ua7 提取码: 2ua7 1 双击打开安装软件 本次安装的是mariaDB,双击打开mar…

Java运行环境的下载、安装、配置与运行

一、实验目的及要求 目的:掌握如何下载java JDK软件包,如何设置Java程序的运行环境,如何编写与运行Java程序,了解Java概貌。 要求: 1、安装Java JDK软件包; 2、练习编写简单的Java Application程序并掌握…

vscode安装使用plantuml插件

使用 VSCode 插件 如果你在 Visual Studio Code 中使用 PlantUML 插件,你可以按照以下步骤生成图片: 安装 PlantUML 插件: 在 VSCode 的扩展市场中搜索并安装 PlantUML 插件。 配置插件: 打开设置,确保插件配置正确。…

Node.js发票查验接口示例、识别查验接口参数返回

财务、审计等经常与发票打交道的人员常常会遇到虚假发票、错票、重复报销等一系列问题。对于会计审计、代理记账、电子商务等发票查验量多的企业来说,成千上万张发票如果仅依赖于人工来进行核验,速度慢效率低,准确率也没保障,因此…

MySQL record

更改密码: alter user rootlocalhost identified with mysql_native_password by ‘123456’; 注意: 在命令行方式下,每条MySQL的命令都是以分号结尾的,如果不加分号,MySQL会继续等待用户输入命令,直到MyS…

kube-prometheus部署

一、自定义配置(二选一,不建议用这个) grafana-service.yml apiVersion: v1 kind: Service metadata:name: grafananamespace: kube-monitoringlabels:app: grafanacomponent: core spec:type: NodePortports:- port: 3000nodePort: 30011selector:app: grafanaco…

uniapp 懒加载、预加载、缓存机制深度解析

uniapp 懒加载、预加载、缓存机制深度解析 文章目录 uniapp 懒加载、预加载、缓存机制深度解析一、为什么要使用uniapp的懒加载、预加载和缓存机制二、如何使用uniapp的懒加载、预加载和缓存机制1. 懒加载2. 预加载3. 缓存机制 四、扩展与高级技巧1. 结合懒加载和预加载优化页面…

链表.......

从右到左 更新尾部 typedef typedef struct ListNode { int value; struct ListNode *next;(这里不能用listnode*应为还没有定义) } ListNode; #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 struct ListNode { int value; s…

开发台球助教小程序前景分析

开发台球助教小程序的前景分析可从以下维度展开探讨&#xff1a; 市场需求的增长 台球作为一项受欢迎的休闲运动&#xff0c;其爱好者群体正在扩大。随着大众对这项运动兴趣的增加&#xff0c;寻求系统化培训的需求也愈发明显。台球助教小程序正好填补了这一市场空白&#xf…

【Hadoop|HDFS篇】HDFS的Shell操作

1. 基本语法 hadoop fs 具体命令或者hadoop dfs 具体命令。 两个是完全相同的。 2. 命令大全 hadoop fs&#xff1a; Usage: hadoop fs [generic options][-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-checksum <src> ..…