从零开始学习:深度学习(基础入门版)(1天)
(一) opencv和opencv-contrib的安装
(1.1)在桌面地底部的搜索栏,搜索命令提示符,点击并打开命令提示符
(1.2)依次输入命令并按回车:pip install opencv-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple和pip install opencv-contrib-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple
(二)在pycharm软件中,用python语言,opencv库实现以下功能
此代码主要完成以下任务:
- 读取并显示一张本地图片
- 交互式控制窗口行为
- 输出图像的基础元信息
完整执行流程:
添加了逐行详细注释的完整代码及预期输出示例:
# ✅ 1. 导入必要的库
import cv2 # OpenCV库用于图像处理与计算机视觉任务
import numpy as np # NumPy库用于高效处理多维数组(图像本质是数组)# 📁 2. 读取本地图像文件
a = cv2.imread('1.jpg') # 从当前工作目录读取名为'1.jpg'的图像文件
# ▶️ 成功时返回一个NumPy数组(形状=[高度, 宽度, 通道数]),失败返回None# 🖥️ 3. 显示图像窗口
cv2.imshow('tu', a) # 创建名为'tu'的窗口并显示图像a
# ⚠️ 注意:此语句不会自动暂停,需配合waitKey()才能看到效果# ⏸️ 4. 等待用户按键输入
b = cv2.waitKey(0) # 阻塞程序执行,直到用户按下任意键
# 🔑 参数0表示无限期等待,返回值为按下的键对应的ASCII码(本例未使用该值)# ✖️ 5. 关闭所有OpenCV窗口
cv2.destroyAllWindows() # 释放所有创建的GUI窗口资源# 📝 6-8. 输出图像元信息
print("图像形状(shape):", a.shape) # 输出数组维度:[高, 宽, 通道数]
print("图像数据类型(dtype):", a.dtype) # 输出像素的数据类型(通常为uint8)
print("图像大小(size):", a.size) # 输出总像素数(高×宽×通道数)
图像形状(shape): (480, 640, 3)
图像数据类型(dtype): uint8
图像大小(size): 921600
此代码主要完成以下任务:
- 灰度化处理与保存
- 图像区域裁剪与可视化对比
- 图像元信息输出
- 多窗口交互式显示
完整执行流程:
添加了逐行详细注释的完整代码及预期输出示例:
# -*- coding: utf-8 -*-
import cv2 # 导入OpenCV库,用于图像处理与计算机视觉任务# ==================== 第一阶段:灰度化处理 & 基础信息输出 ====================
# 📷 1. 以灰度模式读取图像
b = cv2.imread(filename=r'./1.jpg', flags=cv2.IMREAD_GRAYSCALE) # ✅ 关键参数:flags=cv2.IMREAD_GRAYSCALE
# ↳ 功能:将输入图像转换为单通道灰度图(而非默认的BGR三通道)
# ↳ 返回值:NumPy数组,形状为 [高度, 宽度](二维数组)# 🖥️ 2. 显示灰度图像窗口
cv2.imshow(winname='zz', mat=b) # 创建名为 'zz' 的窗口并显示灰度图 b
# ↳ 注意:此语句不会自动暂停,需配合 waitKey() 才能看到效果# ⏸️ 3. 等待用户按键(防止窗口一闪而过)
a = cv2.waitKey(0) # 阻塞程序执行,直到用户按下任意键
# ↳ 参数 0 表示无限期等待,返回值为按下的键对应的 ASCII 码(本例未使用该值)# ✖️ 4. 关闭所有OpenCV窗口
cv2.destroyAllWindows() # 释放所有创建的GUI窗口资源# 📝 5-7. 输出灰度图的元信息
print("图像形状(shape):", b.shape) # 输出数组维度:[高度, 宽度](灰度图为二维)
print("图像数据类型(dtype):", b.dtype) # 输出像素的数据类型(通常为 uint8)
print("图像大小(size):", b.size) # 输出总像素数(高度 × 宽度)# 💾 8. 保存灰度图到文件
cv2.imwrite(filename='timg98_GRAY.jpg', img=b) # 将灰度图 b 保存为新文件
# ↳ 注意:若文件已存在会被覆盖# ==================== 第二阶段:图像裁剪 & 双窗口对比 ====================
# 📁 9. 重新读取原始彩色图像(未指定 flags 参数,默认按 BGR 三通道读取)
a = cv2.imread(r'./1.jpg') # 返回 BGR 三通道图像(形状为 [高度, 宽度, 3])# ✂️ 10. 裁剪图像区域(基于NumPy数组切片)
b = a[30:230, 100:300] # 选取矩形区域:纵向 30~230px,横向 100~300px
# ↳ Python切片规则:起始位置包含,终止位置不包含 → 实际裁剪尺寸:高=200px (230-30),宽=200px (300-100)# 🖥️ 11-12. 同时显示原图与裁剪结果
cv2.imshow(winname='yuantu', mat=a) # 窗口标题 "yuantu"(原图)
cv2.imshow(winname='qiepian', mat=b) # 窗口标题 "qiepian"(裁剪片段)# ⏸️ 13. 等待用户按键(保持双窗口可见)
cv2.waitKey(0) # 阻塞程序执行,直到用户按下任意键# ✖️ 14. 关闭所有OpenCV窗口
cv2.destroyAllWindows() # 释放所有创建的GUI窗口资源
图像形状(shape): (480, 640) # 灰度图形状(高 x 宽)
图像数据类型(dtype): uint8 # 像素类型(0~255 的无符号整数)
图像大小(size): 307200 # 总像素数 = 480 × 640
此代码主要完成以下任务:
实时获取摄像头视频流 → 转灰度 → 显示画面
完整执行流程:
打开摄像头:通过
cv2.VideoCapture(0)
打开默认摄像头(编号0通常是笔记本内置摄像头)检查摄像头是否成功打开:如果失败,打印“无法打开视频文件”并退出程序
实时读取视频帧:在一个无限循环中,逐帧读取摄像头画面
将彩色画面转为灰度:使用
cv2.cvtColor
把每一帧从彩色(BGR)转换成灰度图像实时显示灰度画面:通过
cv2.imshow
在一个名为“Video”的窗口中显示灰度画面按 ESC 键退出:如果用户按下键盘上的 ESC 键(ASCII码27),则跳出循环
释放资源:关闭摄像头并销毁所有 OpenCV 窗口,避免资源泄露
总结:这段代码会打开你的摄像头,把实时画面变成黑白色,并持续显示,直到你按下 ESC 键退出
添加了逐行详细注释的完整代码及预期输出示例:
import cv2 # 导入 OpenCV 库
video_capture = cv2.VideoCapture(0) # 打开默认摄像头(设备索引 0)
if not video_capture.isOpened(): # 检查摄像头是否成功打开print("无法打开视频文件") # 若打开失败,打印提示信息exit() # 退出程序
while True: # 无限循环,持续读取摄像头画面ret, frame = video_capture.read() # 读取一帧:ret 表示是否成功,frame 为图像数据if not ret: # 如果读取失败(无画面)break # 跳出循环frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将彩色帧转换为灰度图像cv2.imshow('Video', frame) # 在名为 'Video' 的窗口中显示当前帧if cv2.waitKey(1) == 27: # 等待 1 毫秒;若用户按下 ESC(ASCII 27),则跳出循环break
video_capture.release() # 释放摄像头资源
cv2.destroyAllWindows() # 关闭所有由 OpenCV 创建的窗口
额外扩充:
cv2.VideoCapture('aiweier.mp4')
→ 初始化视频捕获对象isOpened()
→ 校验文件可读性while True
+read()
→ 逐帧读取视频流cvtColor(..., COLOR_BGR2GRAY)
→ 实时转灰度图imshow()
+waitKey(1)
→ 动态显示画面 & 响应键盘事件release()
/destroyAllWindows()
→ 资源清理import cv2 # 导入 OpenCV 库,用于视频和图像处理# 创建 VideoCapture 对象,打开名为 'aiweier.mp4' 的视频文件 video_capture = cv2.VideoCapture('aiweier.mp4')# 检查视频文件是否成功打开 if not video_capture.isOpened():print("无法打开视频文件") # 如果无法打开,输出错误提示exit() # 退出程序# 无限循环,用于逐帧读取和显示视频 while True:# 从视频中读取下一帧ret, frame = video_capture.read()# 如果读取失败(如到达视频末尾),则跳出循环if not ret:break# 将当前帧从 BGR 彩色图像转换为灰度图像frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 在名为 'Video' 的窗口中显示当前帧cv2.imshow('Video', frame)# 等待键盘输入,等待时间为 1 毫秒# 如果按下 ESC 键(ASCII 码为 27),则跳出循环if cv2.waitKey(1) == 27:break# 释放 VideoCapture 对象,关闭视频文件 video_capture.release()# 销毁所有 OpenCV 创建的窗口 cv2.destroyAllWindows()
代码中去除以下代码,代码运行结果为彩色图片
# 将当前帧从 BGR 彩色图像转换为灰度图像frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
此代码主要完成以下任务:
从彩色图像中分离并可视化其蓝(B)、绿(G)、红(R)三个独立颜色通道
颜色空间特性
- OpenCV 默认使用 BGR 而非 RGB 顺序存储颜色图像,因此:
img[:, :, 0]
→ 蓝色通道img[:, :, 1]
→ 绿色通道img[:, :, 2]
→ 红色通道
- OpenCV 默认使用 BGR 而非 RGB 顺序存储颜色图像,因此:
单通道显示原理
- 每个颜色通道本质上是一个二维矩阵(高度×宽度),值范围通常为
0-255
- 当用
imshow()
显示单通道时,OpenCV 自动将其解释为 8位灰度图像,其中:0
= 纯黑 → 该颜色成分完全缺失255
= 纯白 → 该颜色成分达到最大强度
- 每个颜色通道本质上是一个二维矩阵(高度×宽度),值范围通常为
两种通道分离方式对比
- 切片法 (
img[:, :, n]
):直观高效,适合少量通道提取 cv2.split()
:返回包含所有通道的列表,适用于批量处理多通道场景
- 切片法 (
完整执行流程:
添加了逐行详细注释的完整代码及预期输出示例:
import cv2
# 1. 读取图像(默认 BGR 顺序)
img = cv2.imread('1.jpg')
if img is None:raise FileNotFoundError('图像加载失败,请检查路径')
# 2. 方法一:直接切片提取单个通道
b_ch = img[:, :, 0] # 蓝色通道
g_ch = img[:, :, 1] # 绿色通道
r_ch = img[:, :, 2] # 红色通道
# 3. 方法二:用 cv2.split 一次拆出三个通道
# b_ch, g_ch, r_ch = cv2.split(img)
# 4. 分别显示三个通道(单通道图像默认以灰度形式呈现)
cv2.imshow('Blue channel', b_ch)
cv2.imshow('Green channel', g_ch)
cv2.imshow('Red channel', r_ch)
# 5. 等待按键(0 表示无限等待,或给足够大的毫秒数)
cv2.waitKey(0)
# 6. 关闭所有窗口
cv2.destroyAllWindows()
此代码主要完成以下任务:
从输入图像中提取并突出显示蓝色通道的信息
完整执行流程:
添加了逐行详细注释的完整代码及预期输出示例:
# -*- coding: utf-8 -*-
"""
功能:读取一张彩色图,只保留蓝色通道,其余通道置 0,并显示结果
"""# 1. 导入库
import cv2
import numpy as np # 预留,方便后续扩展# 2. 读取原始图像(默认 BGR 顺序)
img = cv2.imread('1.jpg') # 在当前工作目录下查找 1.jpg
if img is None: # 读取失败时 img 为 Noneraise FileNotFoundError('图像加载失败,请检查 1.jpg 是否存在及路径是否正确')# 3. 复制一份,避免修改原图
img_blue = img.copy() # 得到与原图同尺寸、同内容的备份# 4. 只保留蓝色通道:将绿色、红色通道全部置 0
# OpenCV 中 BGR 顺序:0-蓝色(B),1-绿色(G),2-红色(R)
img_blue[:, :, 1] = 0 # 绿色通道全部设为 0
img_blue[:, :, 2] = 0 # 红色通道全部设为 0
# 此时 img_blue 中仅 B 通道有值,其余两通道为 0,整体呈蓝色调# 5. 显示结果
cv2.imshow('Blue-only color image', img_blue) # 创建一个窗口并显示处理后的图像
cv2.waitKey(0) # 无限等待,直到键盘任意按键
cv2.destroyAllWindows() # 销毁所有已创建的窗口
此代码主要完成以下任务:
演示如何使用 OpenCV 分离图像的 BGR 三通道并重新合并回原始彩色图像
完整执行流程:
步骤 | 代码行 | 作用(一句话说明) |
---|---|---|
1 | import cv2 | 引入 OpenCV 库,准备图像处理 |
2 | img = cv2.imread('1.jpg') | 把当前目录里的 1.jpg 读进内存,得到 BGR 彩色矩阵 |
3 | if img is None: | 若文件不存在或读取失败,立即报错并终止程序 |
4 | b, g, r = cv2.split(img) | 把彩色图拆成 3 张灰度图:蓝通道、绿通道、红通道 |
5 | merged = cv2.merge((b, g, r)) | 把这三张灰度图按 B-G-R 顺序重新合并成一张与原图相同的彩色图 |
6 | cv2.imshow('Merged BGR', merged) | 打开窗口,标题为 Merged BGR ,显示合并后的彩色图 |
7 | cv2.waitKey(0) | 暂停程序,等待用户按任意键 |
8 | cv2.destroyAllWindows() | 关闭所有 OpenCV 窗口,释放资源,程序结束 |
添加了逐行详细注释的完整代码及预期输出示例:
import cv2 # 导入 OpenCV 库,用于图像读写与显示# 1. 读取图像(默认 BGR 顺序)
img = cv2.imread('1.jpg') # 从当前工作目录加载 '1.jpg',返回三维 BGR 数组
if img is None: # 检查是否加载成功raise FileNotFoundError('图片路径错误或文件不存在') # 若失败,立即抛出异常并终止程序# 2. 分离 BGR 三通道
b, g, r = cv2.split(img) # 把 BGR 图像拆成 3 个单通道数组:b(蓝)、g(绿)、r(红)# 等价于 b = img[:, :, 0]; g = img[:, :, 1]; r = img[:, :, 2]# 3. 重新合并三通道,得到与原图一致的彩色图
merged = cv2.merge((b, g, r)) # 把 b、g、r 三个二维数组按顺序叠成一幅新的三通道彩色图# 也可写成 cv2.merge([b, g, r])# 4. 显示结果
cv2.imshow('Merged BGR', merged) # 创建名为 'Merged BGR' 的窗口并展示合并后的彩色图
cv2.waitKey(0) # 无限等待键盘事件;按任意键后继续
cv2.destroyAllWindows() # 销毁所有已打开的 OpenCV 窗口,释放资源
此代码主要完成以下任务:
对一张图片的局部区域进行随机着色并显示结果
完整执行流程:
步骤 | 代码行 | 作用说明 |
---|---|---|
1 | import cv2 | 导入 OpenCV 库,用于图像读写与显示 |
2 | import numpy as np | 导入 NumPy 库,方便生成随机数组并进行矩阵操作 |
3 | a = cv2.imread('1.jpg') | 读取磁盘文件 1.jpg ,将其加载为 NumPy 数组并存入变量 a |
4 | a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3)) | 在 a 的指定区域(行 100–199、列 200–299)上覆盖随机彩色像素,实现打码/马赛克效果 |
5 | cv2.imshow('masaike', a) | 新建名为 masaike 的窗口,并在其中显示处理后的图像 a |
6 | cv2.waitKey(1000000) | 等待键盘事件,最长约 1000 秒;期间窗口保持显示 |
7 | cv2.destroyAllWindows() | 关闭所有由 OpenCV 创建的窗口,释放资源 |
添加了逐行详细注释的完整代码及预期输出示例:
import cv2 # 导入 OpenCV 库,用于图像的读取、显示与保存
import numpy as np # 导入 NumPy 库,用于高效的数组操作与随机数生成# 1. 从当前目录读取图像文件 1.jpg,返回一个三维的 BGR 图像数组
a = cv2.imread('1.jpg')# 2. 在图像 a 的指定区域(行 100~199,列 200~299)上覆盖随机彩色像素块
# np.random.randint(0, 256, (100, 100, 3)) 生成形状为 (100, 100, 3) 的随机整数矩阵,
# 每个元素取值范围 [0, 255],对应 BGR 三通道,实现“马赛克”或“打码”效果
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))# 3. 创建一个名为 'masaike' 的窗口,并在其中显示处理后的图像 a
cv2.imshow('masaike', a)# 4. 等待键盘事件,最长等待 1 000 000 毫秒(≈ 1000 秒)
# 期间窗口保持显示,按任意键可提前结束等待
cv2.waitKey(1000000)# 5. 销毁所有由 OpenCV 创建的窗口,释放资源
cv2.destroyAllWindows()
此代码主要完成以下任务:
将一张图片(1.jpg
)的特定区域复制到另一张图片(mimi.jpg
)的指定位置,并同步显示两张图片的效果
完整执行流程:
步骤 | 代码 | 作用说明 |
---|---|---|
1 | import cv2 | 载入 OpenCV 库,提供图像读写与显示功能 |
2 | a = cv2.imread('1.jpg') | 读取图像文件 1.jpg 并存储到变量 a |
3 | b = cv2.imread('mimi.jpg') | 读取图像文件 mimi.jpg 并存储到变量 b |
4 | b[200:350, 200:350] = a[50:200, 100:250] | 将 a 中第 50–199 行、100–249 列的像素区域复制到 b 的第 200–349 行、200–349 列,实现区域替换;要求两块区域尺寸一致(150×150) |
5 | cv2.imshow('b', b) | 创建名为 b 的窗口并显示处理后的图像 b |
6 | cv2.imshow('a', a) | 创建名为 a 的窗口并显示原始图像 a ,方便对比查看 |
7 | cv2.waitKey(100000) | 等待键盘事件,最长约 100 秒;按任意键可提前结束 |
8 | cv2.destroyAllWindows() | 关闭所有 OpenCV 创建的窗口,释放资源 |
添加了逐行详细注释的完整代码及预期输出示例:
import cv2 # 1. 导入 OpenCV 库,用于图像读写与显示# 2. 读取两张图片
a = cv2.imread('1.jpg') # 读取 1.jpg,存入变量 a(原始图像)
b = cv2.imread('mimi.jpg') # 读取 mimi.jpg,存入变量 b(目标图像)# 3. 区域复制:将 a 中第 50~199 行、100~249 列的 150×150 像素区域
# 覆盖到 b 中第 200~349 行、200~349 列的位置
# 注意:源区域与目标区域尺寸必须一致(都是 150×150)
b[200:350, 200:350] = a[50:200, 100:250]# 4. 显示处理后的结果
cv2.imshow('b', b) # 创建名为 "b" 的窗口,显示替换后的图像 b
cv2.imshow('a', a) # 创建名为 "a" 的窗口,显示原始图像 a,便于对比cv2.waitKey(100000) # 5. 等待键盘事件,最长约 100 秒;按任意键可提前退出
cv2.destroyAllWindows() # 6. 关闭所有 OpenCV 创建的窗口,释放资源
此代码主要完成以下任务:
主要演示了 OpenCV 中两种不同的图像缩放方法,并通过窗口对比展示原始图像与缩放后的效果
完整执行流程:
1.读取原始图像 → 2. 尝试两种缩放方式 → 3. 打印原始图像尺寸 → 4. 双窗口对比显示 → 5. 持久化展示结果
步骤 | 代码 | 作用说明 |
---|---|---|
1 | import cv2 | 导入 OpenCV 库,提供图像读写与显示功能 |
2 | a = cv2.imread('1.jpg') | 读取文件 1.jpg,将其加载为 NumPy 数组并存入变量 a |
3 | b = cv2.imread('mimi.jpg') | 读取文件 mimi.jpg,将其加载为 NumPy 数组并存入变量 b |
4 | b[200:350, 200:350] = a[50:200, 100:250] | 将 a 中第 50–199 行、100–249 列的 150×150 像素区域复制到 b 的第 200–349 行、200–349 列,实现区域替换(要求两区域尺寸一致) |
5 | cv2.imshow('b', b) | 创建名为 “b” 的窗口,显示经过替换处理后的图像 b |
6 | cv2.imshow('a', a) | 创建名为 “a” 的窗口,显示原始图像 a ,方便与结果对比 |
7 | cv2.waitKey(100000) | 等待键盘事件,最长约 100 秒;按任意键可提前结束等待 |
8 | cv2.destroyAllWindows() | 关闭所有由 OpenCV 创建的窗口,释放资源 |
添加了逐行详细注释的完整代码及预期输出示例:
import cv2 # 1. 导入 OpenCV 库,用于图像处理与显示# 2. 读取图像文件 mimi.jpg,返回三维 BGR 数组
a = cv2.imread('mimi.jpg')# 3. 第一次缩放:强制把图像调整为指定尺寸
# dsize=(200, 600) 表示输出图像宽度 200 像素,高度 600 像素
# 注意:此行计算出的 a_new 会被下一行覆盖,实际不会生效
a_new = cv2.resize(a, dsize=(200, 600)) # 宽、高# 4. 第二次缩放:按相对比例缩放
# dsize=None 表示不使用绝对尺寸,而是根据 fx、fy 进行缩放
# fx=1.5 → 宽度放大为原来的 1.5 倍
# fy=0.5 → 高度缩小为原来的 0.5 倍
a_new = cv2.resize(a, dsize=None, fx=1.5, fy=0.5)# 5. 打印原图 a 的形状(行数=高,列数=宽,第 3 维=通道数 BGR)
print(a.shape) # 高、宽、通道数# 6. 分别显示原图和缩放后的图像
cv2.imshow('a', a) # 显示原图
cv2.imshow('a_new', a_new) # 显示缩放后的图像# 7. 等待键盘事件,最长约 100 秒;按任意键可提前退出
cv2.waitKey(100000)# 8. 关闭所有 OpenCV 创建的窗口,释放资源
cv2.destroyAllWindows()