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

news2024/11/16 12:40:23

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 plt

imgfile = 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 库,用于绘图,但在这段代码中也未被使用。
  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)。

总结

这段代码主要用于读取图像的基本信息,包括图像的形状、像素数目和数据类型。它使用 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 + 1
            if (i >= array_len):
                break

print("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] = B

tlist = 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 + 1
                if (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.coloradmin.cn/o/2105595.html

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

相关文章

docker pull命令拉取镜像失败的解决方案

docker pull命令拉取镜像失败的解决方案 一、执行docker pull命令,拉取镜像失败 报错信息:error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/51/5107333e08a87b836d48f…

第86集《大佛顶首楞严经》

《大佛顶如来密因修正了义诸菩萨万行首楞严经》。监院法师慈悲,诸位法师,诸位同学,阿弥陀佛! 请大家打开讲义188面 我们这一科讲到,辛三、盗戒。透过大乘的理观跟事修,所谓大乘的戒法来对治偷盗的行为跟偷…

EasyExcel单行或多行表头的简单Excel导出

一般Excel不需要复杂的数据格式导出,只是在表头上略有区别,下面展示单行和多行表头Excel导出 1、单行表头 例如:Excel表头只有单行,那就只需要使用注解ExcelProperty即可实现 ① 添加依赖 首先,在 pom.xml 中添加 E…

zhidianyun01/基于 ThinkPHP+Mysql 的智慧园区+智慧园区管理系统+园区物业管理系统+园区物业管理系统源码

园区物业管理系统园区管理系统园区管理园区物业物业管理系统园区物业管理系统源码 软件架构 ThinkPHPMysql 源码合作 提供完整源代码 软件界面展示

imap发送邮件:如何配置IMAP服务器发邮件?

imap发送邮件的设置教程?如何使用IMAP服务发送邮件? IMAP发送邮件作为一种高效的邮件管理方式,允许用户在多个设备上同步邮件,极大地提升了工作效率。AokSend将详细介绍如何配置IMAP服务器以实现邮件的发送。 imap发送邮件&…

Linux入门攻坚——31、rpc概念及nfs和samba

NFS:Network File System 传统意义上,文件系统在内核中实现 RPC:函数调用(远程主机上的函数),Remote Procedure Call protocol 一部分功能由本地程序完成 另一部分功能由远程主机上的 NFS本质…

通过FFmpeg和URL查看流的编码格式

FFmpeg下载后会有三个执行文件,跳转到FFmpeg所在文件夹 查看视频流URL地址的编码格式命令: // 在下载ffmpeg的文件夹中执行如下命令,可查看流的编码格式,这里的测试流是H264编码ffprobe http://devimages.apple.com/iphone/sample…

CSS学习13

CSS例子 学成网 需要使用的图片&#xff1a; 代码&#xff1a; <html><head><style>/*CSS初始化*/* { /*清除内外边框*/padding: 0;margin: 0;}ul {list-style: none; /*清除列表样式*/}.clearfix:before,.clearfix:after { /*清除浮动*/content: &qu…

C++11(1)

目录 前言 小故事 C11优势 统一的列表初始化 1.{}初始化 2. std::initializer_list 声明 1.auto 2.decltype 3.nullptr 前言 小故事 1998 年是 C 标准委员会成立的第一年&#xff0c;本来计划以后每 5 年视实际需要更新一次标准&#xff0c; C 国际 标准委员会在研究…

如何使用ChatGPT撰写研究计划书?AI写作全攻略

大家好&#xff0c;感谢关注。我是七哥&#xff0c;一个在高校里不务正业&#xff0c;折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥&#xff08;yida985&#xff09;交流&#xff0c;多多交流&#xff0c;相互成就&#xff0c;共同进步&a…

从安卓开发到AI产品经理——我的AI绘画之旅

大家好&#xff0c;我是一名有着多年安卓开发经验的程序员。在日复一日的编码生活中&#xff0c;我对AI行业产生了浓厚的兴趣。于是&#xff0c;我决定转行成为一名AI产品经理。在这个过程中&#xff0c;我通过学习AI绘画工具初步了解了AI行业&#xff0c;下面我将分享我的学习…

Apache DolphinScheduler在Cisco Webex的应用与优化实践

引言 我叫李庆旺&#xff0c;是Cisco Webex的一名软件工程师&#xff0c;同时也是Apache DolphinScheduler&#xff08;以下简称DS&#xff09;的Committer。 在过去的两年里&#xff0c;公司基于Apache DolphinScheduler进行了多项持续改进和创新&#xff0c;以更好地适应我们…

Docker 的安装

讲解下在 Linux 下如何安装 Docker ‍ 官网 Docker 官网&#xff1a;https://www.docker.com Docker Hub 官网&#xff1a; https://hub.docker.com &#xff08;有很多 Docker 镜像的仓库&#xff0c;可能得魔法上网&#xff09; 对于 Docker 初学者&#xff0c;可以从官…

SSH免密登录(Mac版)

1、查看ssh版本确保已安装 ssh -V 2、生成密钥对 ssh-keygen &#xff08;我之前安装过了所以选no&#xff09; 3、将公钥追加到需要设置免密登录的服务器上 使用ssh-copy-id命令进行追加ssh-copy-id -i id_rsa.pub useridip ( userid 和 ip 需要对应换成自己的)

opencv --- 人脸识别、人脸比对

opencv — 人脸比对 1、opencv安装参考: windows: windows 环境下安装OpenCV For Java linux:linux — CentOS 7 环境下编译安装OpenCV For Java 进入到opencv的安装目录: 进入到build\java 目录 2、准备文件 # 1. 特征分类器:windows 和 linux 中的配置文件都一样…

计算机网络:http协议

计算机网络&#xff1a;http协议 一、本文内容与前置知识点1. 本文内容2. 前置知识点 二、HTTP协议工作简介1. 特点2. 传输时间分析3. http报文结构 三、HTTP版本迭代1. HTTP1.0和HTTP1.1主要区别2. HTTP1.1和HTTP2主要区别3. HTTPS与HTTP的主要区别 四、参考文献 一、本文内容…

如何操作可以有效的防止其他人修改Excel文件?

工作中&#xff0c;我们经常遇到同一份表格可能需要好多人共同去完成&#xff0c;但是当你整理好数据发给别的同事的时候&#xff0c;等表格再回来的时候&#xff0c;你可能发现你之前设置的资料格式内容等都被修改了&#xff0c;遇到这种情况时&#xff0c;如何操作可以有效的…

Codeforces Round 970 (Div. 3)(A~H)

​​​​​题目链接​​​​​​​​​​​​​​​​​​​​​ A 当 a 为奇数的时候&#xff0c;无论如何配对都无法将最后一个 1 减去&#xff1b; 当 a 为偶数的时候&#xff0c;b 也偶数&#xff0c;自然可以内部通过加减操作变成 0&#xff1b;当 b 为奇数的时候&#…

观察者设计模式详解

观察者设计模式详解 文章目录 观察者设计模式详解一、定义二、观察者模式的结构三、特点四、应用场景五、实现 一、定义 **观察者设计模式&#xff08;Observer Pattern&#xff09;**是一种行为设计模式&#xff0c;也叫做 “发布-订阅模式”&#xff0c; 它定义了一种一对多…

ArcGIS的8个“合并”功能要分清——矢量:编辑器合并,复制粘贴,工具合并、追加、联合——栅格:镶嵌、镶嵌至新栅

​​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 今天来看看ArcGIS中的几个涉及“合并”功能的用法。 对矢量&#xff1a; 包括编辑器中的合…