OpenCV 学习笔记:图像处理基础与实践
本文最后更新于15 天前,其中的信息可能已经过时,如有错误请发送邮件到 sunrisetsn@gmail.com

〇 前言

此文章是对于在ASCII-Generator项目(后简称为“本项目”)中所使用到的核心代码库以及在此之上的知识点来进行总结,以此能更有深刻的体会以及在未来若能用到时还能提醒自己是什么、怎么弄以及如何去弄的三大关键。

以下文章部分内容为ChatGPT生成,请好好斟酌

一 OpenCV是什么

OpenCV(Open Source Computer Vision Library)是一个开源、跨平台的计算机视觉与图像处理库,最初由英特尔于1999年发起,目前由社区维护。它支持 Windows、Linux、macOS、Android、iOS 等平台,并提供 C++、Python、Java、JavaScript、MATLAB 等多语言接口,广泛应用于图像处理、视频分析、机器学习与深度学习等领域。

本项目采用 Python 版本的 OpenCV,通过对图像进行读取、灰度化、增强以及缩放处理,为后续 ASCII 字符映射提供预处理数据。

二 如何配置OpenCV

2.1 OpenCV 环境配置

本项目使用 Python 作为开发语言,通过 pip 安装 OpenCV。

安装命令如下:

pip install opencv-python

项目中导入 OpenCV 的方式为:

import cv2

其中 cv2 为 OpenCV 在 Python 中的标准模块名称,后续所有图像处理操作均通过该模块完成。

2.2 OpenCV的基本数据结构

OpenCV 读取的图像本质上是一个 NumPy ndarray 数组。

例如:

img = cv2.imread("image.png")

得到的数据可以表示为:

(height, width, channel)

其中:

  • height:图像高度
  • width:图像宽度
  • channel:颜色通道数

彩色图像一般包含三个通道(BGR),灰度图像仅包含一个通道,因此灰度图的数组维度通常表示为:

(height, width)

这种数据结构使得 OpenCV 可以方便地与 NumPy 配合完成各种矩阵运算,提高图像处理效率。

三 OpenCV核心知识点

3.1 图像读取

图像处理的第一步是读取图像文件。

OpenCV 提供了 cv2.imread() 函数读取图片:

img = cv2.imread(image_path)

该函数返回一个三维数组,其中默认采用 BGR 颜色空间,而不是常见的 RGB 颜色空间。

3.2 颜色空间转换

ASCII 字符画只需要像素亮度信息,因此首先需要将彩色图像转换为灰度图像。

OpenCV 提供了颜色空间转换函数:

gray = cv2.cvtColor(
    img,
    cv2.COLOR_BGR2GRAY
)

其中:

  • BGR:彩色图
  • Gray:灰度图

灰度值范围为:0~255

其中:

  • 0 表示黑色
  • 255 表示白色

灰度值越大,后续映射到的 ASCII 字符越”空”;灰度值越小,则映射到越”密集”的字符。

3.3 图像增强

直接转换得到的灰度图层次较弱,因此需要进行简单的图像增强。

本项目采用:

gray = cv2.convertScaleAbs(
    gray,
    alpha=1.1,
    beta=-20
)

其中:

  • alpha:控制图像对比度
  • beta:控制图像亮度

其数学表达式为:

newPixel = alpha × oldPixel + beta

通过适当提高对比度,可以使字符画细节更加明显。

3.4 Gamma 校正

Gamma 校正属于非线性图像增强方法。

计算公式如下:

Output = Input^γ

本项目实现方式为:

gray = ((gray / 255) ** gamma) * 255
gray = gray.astype("uint8")

其中:

  • γ > 1:图像变暗
  • γ < 1:图像变亮

Gamma 校正能够进一步优化图像层次,使字符映射效果更加自然。

3.5 图像缩放

为了减少计算量,同时控制 ASCII 输出尺寸,需要对图片进行缩放。

OpenCV 提供:

cv2.resize()

本项目实现如下:

gray = cv2.resize(
    gray,
    (ASCII_WIDTH, new_height),
    interpolation=cv2.INTER_AREA
)

其中:

INTER_AREA 为面积插值算法,在缩小图片时能够较好地保留图像细节,因此适合作为本项目的缩放算法。

3.6 图像尺寸获取

OpenCV 可以通过:

height, width = gray.shape

获取灰度图尺寸。

若为彩色图像,则可获取:

height, width, channel = img.shape

图像尺寸信息主要用于后续缩放比例计算。

3.7 像素遍历

图像处理过程中,需要逐个访问图像中的每一个像素。

本项目采用二维遍历方式:

for row in gray:
    for pixel in row:

每个像素的灰度值均参与 ASCII 字符映射,因此像素遍历是整个字符画生成算法的重要基础。

3.8 流程图

原始图像

cv2.imread()(读取图片)

cv2.cvtColor()(灰度化处理)

cv2.convertScaleAbs()(亮度与对比度调整)

Gamma Correction(Gamma 校正)

cv2.resize()(图像缩放)

获取灰度矩阵

ASCII 字符映射

生成字符画

整个流程中,OpenCV 并不直接负责生成 ASCII 字符,而是完成图像预处理任务,为后续字符映射和图像渲染提供高质量的数据输入。

其中,各模块所承担的主要功能如下:

OpenCV 模块主要作用
cv2.imread()读取原始图像
cv2.cvtColor()将彩色图像转换为灰度图像
cv2.convertScaleAbs()调整图像亮度与对比度,提高字符层次
Gamma Correction优化图像整体明暗关系
cv2.resize()调整图像尺寸,减少计算量并适配 ASCII 输出

四 总结

本章介绍了 OpenCV 在 ASCII Generator 项目中的应用过程,包括 OpenCV 的基本概念、开发环境配置、图像数据结构以及图像读取、颜色空间转换、图像增强、图像缩放等核心知识点。

在本项目中,OpenCV 主要承担图像预处理任务,其作用是将原始图像转换为适合 ASCII 字符映射的灰度矩阵。经过图像增强、Gamma 校正以及尺寸缩放后,不仅提高了字符画的整体质量,同时也降低了后续字符映射阶段的计算量,为 PNG 渲染和彩色 ASCII 的实现奠定了基础。

可以认为,OpenCV 是整个 ASCII Generator 的图像处理核心,也是后续字符生成算法能够正常工作的前提。

参考文献

[1] Bradski G, Kaehler A. Learning OpenCV: Computer Vision with the OpenCV Library[M]. Sebastopol: O’Reilly Media, 2008.

[2] OpenCV Team. OpenCV Documentation[EB/OL]. https://docs.opencv.org/, 2026.

[3] OpenCV Team. OpenCV-Python Tutorials[EB/OL]. https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html, 2026.

[4] NumPy Developers. NumPy Documentation[EB/OL]. https://numpy.org/doc/, 2026.

[5] Python Software Foundation. Python 3 Documentation[EB/OL]. https://docs.python.org/3/, 2026.

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇