使用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.rhkb.cn/news/416765.html

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

相关文章

《JavaEE进阶》----7.<SpringMVC实践项目:【登录页面的验证】>

这篇文章详细的讲解了一个 简单的登录网页的前端代码和后端代码的构造 使用了JavaScript中的ajax来进行前后端的交互 一、前端代码 登录页面代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>登录…

CSS解析:盒模型

在网页上实现元素布局涉及很多技术。在复杂网站上&#xff0c;可能会用到浮动元素、绝对定位元素以及其他各种大小的元素&#xff0c;甚至也会使用较新的CSS特性&#xff0c;比如Flexbox或者网格布局。 在此之前我们要打好基础&#xff0c;深刻理解浏览器是如何设置元素的大小…

【卷起来】VUE3.0教程-04-表单输入绑定

Hello&#xff0c;各位老铁&#xff0c;今天我们继续给大家讲解VUE3.0教程&#xff0c;本期我们讲述一下VUE中的表单输入绑定&#xff0c;在实际开发过程中&#xff0c;表单的输入是我们常见的功能&#xff0c;那么我们接下来看看&#xff0c;VUE是如何处理的。 各位看官&…

JVM面试(五)垃圾回收机制和算法

概述 了解Java虚拟机的垃圾回收机制&#xff08;Garbage Collection&#xff0c;简称GC&#xff09;&#xff0c;我们也要像其作者John McCarthy一样&#xff0c;思考一下三个问题&#xff1a; 哪些内存需要回收&#xff1f;什么时候回收&#xff1f;如何回收&#xff1f; 虽…

51单片机-DS1302(RTC时钟显示,代码内改变,内设的24年9月5日,上午11:12:00)

一、DS1302时序及命令字 两个操作&#xff1a;写操作和读操作 写操作&#xff1a; &#xff08;由我们单片机一个控制引脚控制DS1302的IO口写入&#xff09;首先就是通过时序图把我们的命令字写入&#xff0c;命令字是控制我们对应要写入的年月日&#xff0c;时分秒等配置的关…

vue3安装sass时报错:Embedded Dart Sass couldn‘t find the embedded compiler executable

vue3安装sass&#xff1a; npm install sass --save-dev 引用 <template><div class"c1"><h1>hello</h1></div> </template> <style lang"scss">.c1{background-color:red;h1{color:yellow;}} </style>报…

2.门锁_STM32_舵机设备实现

概述 需求来源&#xff1a; 门锁的开启和关闭&#xff0c;就是电机来控制。这里不进行实际门锁机械结构的设计&#xff0c;选择用舵机或者电机转动一定的角度&#xff0c;就代表门锁开启。 舵机开发整体思路&#xff1a; 使用STM32裸机开发舵机&#xff0c;使得舵机可以实现…

spring boot 项目 prometheus 自定义指标收集区分应用环境集群实例ip,使用 grafana 查询--方法耗时分位数指标

spring boot 项目 prometheus 自定义指标收集 auth author JellyfishMIX - github / blog.jellyfishmix.comLICENSE LICENSE-2.0 说明 网上有很多 promehteus 和 grafana 配置&#xff0c;本文不再重复&#xff0c;只介绍自定义部分。目前只介绍了分位数指标的收集和查询&a…

公认最好的跑步耳机,精选五款热门骨传导运动耳机分享

跑步时候总想来点音乐伴随&#xff0c;但是带着有线耳机太局限&#xff0c;带无线耳机又总担心掉落&#xff0c;左右为难&#xff0c;想要挑选一款运动时带着舒服的耳机真的有点难。最近发现骨传导耳机作为一种创新的音频设备&#xff0c;与传统耳机不同&#xff0c;通过将声音…

如何建立有效的沟通和协作机制来开展DFMEA工作?

在当今复杂多变的工业环境中&#xff0c;DFMEA&#xff08;设计失效模式与影响分析&#xff0c;Design Failure Mode and Effects Analysis&#xff09;作为质量管理体系中的一项关键工具&#xff0c;对于预防产品设计和开发过程中潜在的失效模式具有不可估量的价值。有效的DFM…

超声波眼镜清洗机买哪款?2024超声波眼镜清洗机推荐

超声波清洗机正逐渐成为广受欢迎的清洁解决方案&#xff0c;它以高效、深入且细腻的清洁效果&#xff0c;以及操作上的简易性&#xff0c;赢得了消费者的广泛喜爱。不过&#xff0c;市面上琳琅满目的品牌、多样化的型号及波动的价格区间&#xff0c;确实给消费者挑选时带来了不…

uniapp和vue3中使用vConsole在H5中开启移动端调试

uniapp和vue3中使用vConsole在H5中开启移动端调试 1. 安装vconsole npm install vconsole --save2. 在main.js中全局引入 重新启动项目即可

【js逆向专题】8.webpack打包

本教程仅供学习交流使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;请各学员自觉遵守相关法律法规。小节目标: 熟悉 webpack打包原理熟悉 webpack打包方式了解 webpack多模块打包 一. webpack打包 概念: webpack 是…

传递给 LEFT 或 SUBSTRING 函数的长度参数无效

我的Sql语句&#xff1a;select left(long,charindex(‘’,Long)-1) from Site 会报错&#xff0c; 错误信息是&#xff1a;传递给 LEFT 或 SUBSTRING 函数的长度参数无效。 如果我把Sql语句这样写加了一个where条件&#xff0c;即&#xff1a; select left(long,charindex(‘…

金属三通管液压成形液压机比例阀放大器

金属三通管液压成形液压机比例阀配套BEUEC比例放大器适用于紫铜、青铜、不锈钢、铝合金、复合材料的三通管、四通管、T型管、Y型管、L型管的一次液压胀形成形&#xff0c;更适用于石油化工、热能、新能源、医疗、环保、卫浴、五金等行业的各种金属中空零件和复杂曲面的管件的生…

信也持续构建集群容器化改造之路

1. 前言 随着应用构建需求增加以及新构建场景引入&#xff0c;公司对构建系统的扩展性、稳定性要求日益提高。多语言构建&#xff08;如Golang、Java、Python、Node.js 等&#xff09;所依赖的环境&#xff0c;部署在同一台物理机上时&#xff0c;使构建机环境维护困难&#xf…

解决SecoClient接收返回码超时

解决SecoClient接收返回码超时_secoclient接收返回码错误win11-CSDN博客 新的SVDDrv.sys有需要的&#xff0c;https://download.csdn.net/download/shuoshuo_12345/89715503下载即可。

【maven】阿里云和apache仓库配置

阿里云公共仓库的配置看起来有多种类型的仓库: 配置指南 我的maven是idea 自带的:D:\Program Files\JetBrains\IntelliJ IDEA 2022.3.1\plugins\maven\lib\maven3\</

人工智能造福公众:未来一片光明

作者&#xff1a;来自 Elastic Peter Dutton 我们如何衡量人工智能对政府的影响&#xff1f;毫无疑问&#xff0c;人工智能将为运营流程和决策带来的好处已被广泛讨论 —— 从自动化工作流程到节省成本再到减少重复工作。 但对于以服务公众为目标的组织来说&#xff0c;人工智…

基于微信的热门景点推荐小程序的设计与实现(论文+源码)_kaic

摘 要 近些年来互联网迅速发展人们生活水平也稳步提升&#xff0c;人们也越来越热衷于旅游来提高生活品质。互联网的应用与发展也使得人们获取旅游信息的方法也更加丰富&#xff0c;以前的景点推荐系统现在已经不足以满足用户的要求了&#xff0c;也不能满足不同用户自身的个…