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

1. 创建虚拟环境

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

powershell 复制代码
python -m venv venv

2. 激活虚拟环境

在终端中输入以下命令:

powershell 复制代码
venv\Scripts\activate

3. 安装依赖

在终端中输入以下命令:

powershell 复制代码
pip install opencv-python
powershell 复制代码
pip install matplotlib Pillow

4. 使用opencv获取图像信息

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

    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. 将图像数据写入文本

python 复制代码
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. 打开文件:

    python 复制代码
    fname = open(txtfile, 'w')

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

  2. 获取图像的维度:

    python 复制代码
    Xlenth = img.shape[1]  
    Ylenth = img.shape[0]  
    k = 3  

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

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

    python 复制代码
    for i in range(Ylenth):
        for j in range(Xlenth):
            for h in range(k):

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

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

    python 复制代码
    fname.write(str(img[i][j][h]) + ' ')

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

  5. 关闭文件:

    python 复制代码
    fname.close()

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

总结

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

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

python 复制代码
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. 初始化和读取文件:

    python 复制代码
    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. 计算数组长度:

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

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

    python 复制代码
    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. 打印新数组的值:

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

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

    python 复制代码
    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. 最终输出:

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

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

7. 显示图像

python 复制代码
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. 效果实现

powershell 复制代码
py main.py

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

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

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

稍后使用opencv弹出图像

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

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

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

相关推荐
工业3D_大熊5 分钟前
【虚拟仿真】CEETRON SDK在船舶流体与结构仿真中的应用解读
java·python·科技·信息可视化·c#·制造·虚拟现实
SEEONTIME14 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
Bearnaise14 分钟前
PointMamba: A Simple State Space Model for Point Cloud Analysis——点云论文阅读(10)
论文阅读·笔记·python·深度学习·机器学习·计算机视觉·3d
哇咔咔哇咔1 小时前
【科普】conda、virtualenv, venv分别是什么?它们之间有什么区别?
python·conda·virtualenv
jndingxin1 小时前
OpenCV相机标定与3D重建(1)概述
数码相机·opencv·3d
CSXB991 小时前
三十四、Python基础语法(文件操作-上)
开发语言·python·功能测试·测试工具
亚图跨际2 小时前
MATLAB和Python及R潜变量模型和降维
python·matlab·r语言·生物学·潜变量模型
IT古董2 小时前
【机器学习】决定系数(R²:Coefficient of Determination)
人工智能·python·机器学习
德育处主任Pro2 小时前
『Django』APIView基于类的用法
后端·python·django
Star Patrick2 小时前
算法训练(leetcode)二刷第十九天 | *39. 组合总和、*40. 组合总和 II、*131. 分割回文串
python·算法·leetcode