从零开始学 OpenCV:Python 图像处理核心操作实战

从零开始学 OpenCV:Python 图像处理核心操作实战

计算机视觉是人工智能领域的重要分支,而 OpenCV 则是处理图像和视频数据的利器。本文将基于 Python 版本的 OpenCV,从最基础的图像读取、显示,到视频处理、色彩通道操作、图像修改与缩放,手把手带你掌握计算机视觉的核心基础操作。

首先安装OpenCV的核心包和拓展包:

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

opencv-python==3.4.18.65:OpenCV 的核心功能包,包含图像读取、处理、视频操作等基础功能,满足你之前代码中所有图像处理需求;

opencv-contrib-python==3.4.18.65:OpenCV 的扩展包,包含一些额外的高级功能(如特征检测、人脸识别等),且必须与核心包版本完全一致;

一、图像的基础读写与属性查看

1. 读取与显示图像

OpenCV 是计算机视觉领域最常用的库之一,它默认以 BGR 色彩模式读取图像(而非我们熟知的 RGB)。核心的图像读写显示操作仅需几行代码即可完成:

import cv2 import numpy as np # 读取图片(BGR格式) img = cv2.imread('img1.jpeg') # 显示图片:参数为窗口名称、图像数据 cv2.imshow('tupian', img) # 等待按键输入:0表示永久显示,返回按键ASCII码 key = cv2.waitKey(0) # 关闭所有窗口,释放内存 cv2.destroyAllWindows() 

2. 查看图像核心属性

读取图像后,我们可以通过 numpy 数组的属性查看图像的关键信息,这对后续处理至关重要:

# 图像形状:(高度, 宽度, 通道数) print('图像形状:', img.shape) # 数据类型:通常为uint8(0-255像素值) print('图像数据类型:', img.dtype) # 总像素数:高度×宽度×通道数 print('图像总像素数:', img.size) 

运行结果:

3. 读取灰度图

很多场景下我们需要处理灰度图像(单通道),只需在读取时指定参数:

import cv2 import numpy as np # 以灰度模式读取图像 gray_img = cv2.imread('img1.jpeg', cv2.IMREAD_GRAYSCALE) cv2.imshow('xx', gray_img) cv2.waitKey(0) cv2.destroyAllWindows() # 灰度图属性:仅(高度, 宽度),无通道数 print('灰度图形状:', gray_img.shape) # 保存处理后的图像 cv2.imwrite('img1_GRAY.jpeg', gray_img) 

运行结果:

二、视频文件的读取与处理

OpenCV 不仅能处理静态图像,还能轻松读取视频文件并逐帧处理:

import cv2 import numpy as np # 打开视频文件(参数为0可调用摄像头) video_capture = cv2.VideoCapture('video1.mp4') # 检查视频是否成功打开 if not video_capture.isOpened(): print('无法打开视频文件') exit() # 循环读取视频帧 while True: # ret:是否成功读取帧;frame:帧数据 ret, frame = video_capture.read() if not ret: # 读取完毕则退出循环 break # 将帧转为灰度图 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('Video', gray_frame) # 按下ESC键(ASCII码27)退出,60ms/帧控制播放速度 if cv2.waitKey(60) == 27: break # 释放视频资源 video_capture.release() cv2.destroyAllWindows() 

运行结果:

三、ROI 与色彩通道操作

1. 提取感兴趣区域(ROI)

ROI(Region of Interest)是图像中我们关注的特定区域,通过 numpy 数组切片即可快速提取:

import cv2 import numpy as np img = cv2.imread('img1.jpeg') # 提取ROI:[行范围, 列范围] → 对应[高度范围, 宽度范围] roi = img[30:230, 100:300] cv2.imshow('yuantu', img) cv2.imshow('qiepian', roi) cv2.waitKey(0) cv2.destroyAllWindows() 

运行结果:

2. 色彩通道的拆分与合并

OpenCV 读取的图像是 BGR 格式,我们可以拆分单个通道,也可以合并通道重构图像:

(1)拆分通道
import cv2 import numpy as np img = cv2.imread('img1.jpeg') # 方法1:数组切片 b_channel = img[:, :, 0] # 蓝色通道 g_channel = img[:, :, 1] # 绿色通道 r_channel = img[:, :, 2] # 红色通道 # 方法2:cv2.split(效率稍低) b, g, r = cv2.split(img) # 注意:单独显示单通道为灰度图(仅亮度信息) cv2.imshow('b', b) cv2.imshow('g', g) cv2.imshow('r', r) cv2.waitKey(0) cv2.destroyAllWindows() 

运行结果:

(2)显示单通道彩色效果

若想直观看到单通道的彩色效果,需将其他通道置 0:

import cv2 import numpy as np img = cv2.imread('img1.jpeg') # 复制原图像,避免修改原图 img_blue = img.copy() # 绿色通道置0 img_blue[:, :, 1] = 0 # 红色通道置0 img_blue[:, :, 2] = 0 cv2.imshow('result2', img_blue) cv2.waitKey(0) cv2.destroyAllWindows() 

运行结果:

(3)合并通道
# 合并BGR通道,重构原图像 merged_img = cv2.merge((b, g, r)) cv2.imshow('result3', merged_img) cv2.waitKey(0) cv2.destroyAllWindows() 

运行结果:

四、图像修改与缩放

1. 图像像素修改

我们可以直接通过数组赋值修改图像像素,实现如 “马赛克” 等效果:

import cv2 import numpy as np img = cv2.imread('img1.jpeg') # 对指定区域赋值随机像素(马赛克效果) img[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3)) cv2.imshow('masike', img) cv2.waitKey(0) cv2.destroyAllWindows() # 图像拼接:将img1的区域替换到img2中 img1 = cv2.imread('img1.jpeg') img2 = cv2.imread('img2.jpeg') # 注意:替换区域尺寸需匹配 img2[200:350, 200:350] = img1[50:200, 100:250] cv2.imshow('b', img1) cv2.imshow('a', img2) cv2.waitKey(0) cv2.destroyAllWindows() 

运行结果:

2. 图像缩放

cv2.resize是调整图像大小的核心函数,支持指定尺寸或缩放比例两种方式:

import cv2 import numpy as np a = cv2.imread('img1.jpeg') # 方式1:指定目标尺寸(宽, 高) a_new = cv2.resize(a, (300, 200)) # 方式2:指定缩放比例(fx:x轴缩放系数,fy:y轴缩放系数) # a_new = cv2.resize(a,None,fx=1.5,fy=0.5) cv2.imshow('a', a) cv2.imshow('a_new', a_new) cv2.waitKey(0) cv2.destroyAllWindows()

运行结果:

五、总结

本文基于 OpenCV-Python,梳理了计算机视觉入门的核心操作,核心要点如下:

  1. OpenCV 默认以 BGR 格式读取图像,可通过参数读取灰度图,读写显示需配合与窗口管理imread/imshow/imwrite函数;
  2. 视频处理本质是逐帧读取与处理,需注意循环终止条件和资源释放;
  3. 图像的 ROI 提取、色彩通道拆分 / 合并、像素修改、缩放均基于 numpy 数组操作,是 OpenCV 处理的核心逻辑;
  4. 单通道显示为灰度图,若需彩色效果需将其他通道置 0,通道合并需按 BGR 顺序。

这些基础操作是计算机视觉进阶(如目标检测、图像分割、特征提取)的基石,掌握后可结合实际场景灵活扩展,比如实现图像水印、视频特效、人脸马赛克等功能。

Read more

用 Codex + GitHub Spec-Kit 做一次“规格驱动开发”实战

用 Codex + GitHub Spec-Kit 做一次“规格驱动开发”实战

* 用 Codex + GitHub Spec-Kit 做一次“规格驱动开发”实战 * 1) 初始化:把 spec-kit 工作区真正建起来(多种方式) * 方式 A:uvx 一次性运行(推荐) * 方式 B:uv tool install(全局安装 specify) * 方式 C:pipx 安装(Python 工具常用法) * 2) 初始化后,正确的目录结构长什么样( * 3) 在 Codex 里跑 speckit:统一输入规则(非常重要) * 4) 标准流水线:Constitution → Spec → Plan → Tasks → Implement * Step 1:

By Ne0inhk
VSCode Github Copilot使用OpenAI兼容的自定义模型方法

VSCode Github Copilot使用OpenAI兼容的自定义模型方法

背景 VSCode 1.105.0发布了,但是用户最期待的Copilot功能却没更新!!! (Github Copilot Chat 中使用OpenAI兼容的自定义模型。) 🔥官方也关闭了Issue,并且做了回复,并表示未来也不会更新这个功能: “实际上,这个功能在可预见的未来只面向内部人员开放,作为一种“高级”实验功能。是否实现特定模型提供者的功能,我们交由扩展作者自行决定。仅限内部人员使用可以让我们快速推进,并提供一种可能并非始终百分之百完善,但能够持续改进并快速修复 bug 的体验。如果这个功能对你很重要,我建议切换到内部版本 insider。” 🤗 官方解决方案:安装VSCode扩展支持 你们完全不用担心只需要在 VS Code 中安装扩展:OAI Compatible Provider for Copilot 通过任何兼容 OpenAI 的提供商驱动的 GitHub Copilot Chat,使用前沿开源大模型,如 Kimi K2、DeepSeek

By Ne0inhk
使用 VS Code 将项目代码上传到 Gitee 的完整指南

使用 VS Code 将项目代码上传到 Gitee 的完整指南

在现代软件开发流程中,版本控制是不可或缺的一环。 Gitee(码云)作为国内领先的代码托管平台,为开发者提供了稳定、快速的 Git 服务。 本文将详细介绍如何使用 Visual Studio Code(VS Code)将本地项目代码上传至 Gitee 仓库,涵盖从环境配置、初始化仓库到推送代码的完整流程。 一、准备工作 1. 安装必要工具 * Git:确保你的系统已安装 Git。 可通过终端运行 git --version  或 git -v 验证是否安装成功。 * VS Code:下载并安装 Visual Studio Code。 * Gitee 账号:前往 Gitee 官网 注册账号(如尚未注册)。 2. 安装 VS

By Ne0inhk
使用Git将代码从远程仓库拉取到本地(详细图解、简单易懂)

使用Git将代码从远程仓库拉取到本地(详细图解、简单易懂)

目录 一、前言 二、全流程 一、前言 本博客主要记录一下使用Git将代码从远程仓库拉取到本地的全流程,使用Git拉取代码在学校内多同学合作开发项目或者是实习拉取公司代码等场景都很常见,单纯记录希望对你有帮助 二、全流程 首先在你想要存放代码的位置新建一个文件夹并改名 进入刚刚创建的空文件中,右键然后点击显示更多选项 然后点击Git Bash Here 然后就会出现如图所示的命令行窗口 此时先不用管命令行窗口,找到你要远程仓库所在的平台(我这里以Gitee演示),如图点击克隆/下载按钮 HTTPS下方就是远程仓库的url地址,只要有远程仓库的url地址,只需要在刚刚的命令行窗口打上git clone在将url地址复制在后面再回车即可(Gitee下面的提示也给了,直接复制带git clone的命令就行,没有的话就自己敲git clone) 复制到命令行窗口之后,等待片刻即可 然后点开刚刚创建的文件夹就可以看到拉取下来的代码了,后续用IDEA打开该文件就可以在本地进行开发了

By Ne0inhk