OpenCV 入门教程:

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,广泛应用于图像处理、视频分析、机器学习等领域。

在 Python 中,cv2 是 OpenCV 的主要接口模块。本文将带你一步步掌握 cv2 库的安装与基本图像处理功能。


图像的本质:像素的数字矩阵

任何数字图像(如照片、截图、手写数字图片)都是由无数个微小的 “像素点”(Pixel)组成的

  • 每个像素点的数值含义

    • 对于灰度图(如代码中的手写数字),每个像素用一个 0-255 的整数表示亮度:0 代表纯黑,255 代表纯白,中间值表示不同深浅的灰色。
    • 对于彩色图(如 RGB 格式),每个像素由三个数值(R、G、B)组成,分别对应红、绿、蓝三种颜色的亮度,组合后呈现出各种颜色。

彩色图的单个像素点:[0-255,0-255,0-255]:

如:[123, 85, 34]↑    ↑   ↑B    G   R
在 OpenCV 中默认是 BGR,而不是 RGB

灰度图示例:


什么是RGB(Red, Green, Blue):

光学三原色(RGB):红、绿、蓝

通过将红色(R)、绿色(G)、蓝色(B)三种颜色以不同强度组合,形成各种颜色。

RGB颜色
25500红色
02550绿色
00255蓝色
255255255白色
000黑色
2552550黄色

百度搜索 “RGB调色板” ,我们通过调色来具体对比来看看:

将第一个像素对应的R、G、B输入调色板后得到的颜色  与  像素切片篇左上角的像素颜色  相同:

注意:这里的三个数组并不是直接 print(image) 打印出来的结果。

print打印出来的结果是

而是分离通道:(本文章第七节会教,此处有印象即可)

B = img1[:, :, 0]   # 蓝色B通道
G = img1[:, :, 1]   # 绿色G通道
R = img1[:, :, 2]   # 红色R通道

或者:
B, G, R = cv2.split(img1)

得到被分开的R、G、B的单独的颜色数据,同时数据的位置对应每个像素的位置


一、安装 OpenCV 并查看版本

安装命令

pip install opencv-python
pip install opencv-contrib-python

⚠️ 注意:opencv-contrib-python 是包含更多实验性模块和扩展功能的版本,如果你需要 SIFT、SURF 等模块,可安装:

安装完成后,可以通过如下方式验证 OpenCV 是否成功安装:

import cv2
print("OpenCV 版本:", cv2.__version__)


二、读取与显示图像(解析图像的矩阵)

完整图片(可保存):(或者直接百度搜索企鹅,在点开图片栏,应该第一个或第二个就是)

该图片的第一行的数字矩阵:

可以看到数字矩阵有1600行,3列

1600表示这个图片一行有1600个像素点

3表示每个像素点的BGR的数字组成

import cv2
img = cv2.imread("penguin.jpg")
# print(img)   #打印图片的数字矩阵(设置断点,调试时可以更直观)cv2.imshow('qie',img)
a = cv2.waitKey(5000)   # 展示5秒时间(参数为0:一直执行,需要按键关闭)
print(a)   # 如果按下按键,获取按键的ascll码值
cv2.destroyAllWindows()   # 关闭所有打开的窗口并释放所有相关内存。print("图像形状(shape):",img.shape)
print("图像数据类型(dtype)",img.dtype)
print("图像大小(size)",img.size)

说明:

  • cv2.imread():读取图像。

  • cv2.imshow():展示图像窗口。单引号‘’内为标题

  • cv2.waitKey(ms):等待键盘事件,单位为毫秒。若为 0,表示一直等待。

  • cv2.destroyAllWindows():关闭所有窗口。

  • img.shape:返回图像的尺寸 (高度, 宽度, 通道数)

结果:

图像形状(shape):(1200, 1600, 3)

数字含义
1200图像的高度(行数)= 有 1200 像素行
1600图像的宽度(列数)= 有 1600 像素列
3每个像素有 3 个通道(通常为 BGR 或 RGB)

该图像是一个 彩色图像(3通道),大小为 1600(列)×1200(行) 像素,使用的是 BGR 色彩空间(在 OpenCV 中默认是 BGR,而不是 RGB)。

图像数据类型(dtype): uint8

  • uint8无符号 8 位整数unsigned int 8)。

  • 每个像素的每个通道用一个字节(8 位)来表示。

  • 取值范围是 0 ~ 255

图像大小(size) 5760000

  • shape(1200, 1600, 3)

    • 高度(行数):1200 像素

    • 宽度(列数):1600 像素

    • 每个像素有 3 个颜色通道(B、G、R)

  • dtypeuint8(每个通道值占 1 字节)

那么:

size = 1200 × 1600 × 3 = 5760000

所以,这个图像共有 5760000 个像素值(也可以理解为字节数)。


三、图像缩放

import cv2
img = cv2.imread('penguin.jpg')
img_resize = cv2.resize(img, (400, 400))
cv2.imshow('img',img)
cv2.imshow('img_resize',img_resize)
cv2.waitKey(0)
cv2.destroyAllWindows()

说明:

  • cv2.resize() 支持调整图像分辨率,常用于适配模型或显示需求。


四、读取灰度图像并保存

读取图片时直接处理成灰度

import cv2
img = cv2.imread(r'./penguin.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('penguin_gray',img)
a = cv2.waitKey(0)
print(a)
cv2.destroyAllWindows()print("图像形状(shape):",img.shape)
print("图像数据类型(dtype)",img.dtype)
print("图像大小(size)",img.size)cv2.imwrite('penguin_gray.jpg', img) #保存灰度图片

或:

读取彩色图片后,cv2.cvtColor()进行颜色空间转换

img = cv2.imread('penguin.jpg')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

说明:

  • 使用 cv2.IMREAD_GRAYSCALE 可将图像读取为灰度格式。

  • cv2.cvtColor() 进行颜色空间转换。

  • cv2.imwrite() 用于保存图像。


五、图像裁剪

import cv2
img1 = cv2.imread('penguin.jpg')
img2 = img1[150:350,500:700]
cv2.imshow('penguin',img1)
cv2.imshow('penguin_head',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

说明:

  • 图像裁剪可通过 NumPy 的数组切片完成。


六、读取视频文件或摄像头

import cv2
video_capture = cv2.VideoCapture('video1.mp4')   # 若参数为0,则为摄像头
if not video_capture.isOpened():print("无法打开")exit()
while True:ret, frame = video_capture.read()if not ret:breakframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)cv2.imshow('Video', frame)if cv2.waitKey(1) == 27:    # 数字为每一帧的间隔break
video_capture.release()
cv2.destroyAllWindows()
摄像头读帧:video_capture = cv2.VideoCapture(0)

说明:

  • cv2.VideoCapture() 可打开视频文件或0摄像头。

  • video_capture.isOpened():检查摄像头是否成功打开,返回True(成功)或False(失败)。

  • cv2.cvtColor() 进行颜色空间转换。

  • ret, frame = video_capture.read()

    • video_capture.read():从摄像头读取一帧图像。
    • 返回两个值:ret是布尔值(True表示读取成功,False表示失败,如摄像头断开);frame是读取到的图像帧(numpy 数组格式)。


七、分离与合并颜色通道

分离通道指的是将一个三通道彩色图像拆成 三个单通道灰度图

所以每个图只表示一个颜色成分的强度(所有颜色都由红蓝绿三原色组成)

import cv2
img1 = cv2.imread('penguin.jpg')
# =====分离颜色通道=====
# 两种分离方式:
# B = img1[:, :, 0]   # 蓝色B通道
# G = img1[:, :, 1]   # 绿色G通道
# R = img1[:, :, 2]   # 红色R通道
B, G, R = cv2.split(img1)
cv2.imshow('B', B)
cv2.imshow('G', G)
cv2.imshow('R', R)
cv2.waitKey(0)
# =====合并颜色通道=====
img2 = cv2.merge([B, G, R])
cv2.imshow('RGB', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

说明:

  • cv2.split() 分离 B、G、R 通道。

  • cv2.merge() 合并通道生成彩色图像。

通过调试观察数据组成:

可以看到数据的上面是


八、区域像素替换与图像合成

7.1 用随机像素填充图像区域(打码):

import cv2
import numpy as np
img = cv2.imread('penguin.jpg')
img[150:350,500:700] = np.random.randint(0,256,(200,200,3))
cv2.imshow('penguin_head',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

7.2 图像区域拷贝与粘贴(换头):

import cv2
img1 = cv2.imread('penguin.jpg')
img2 = cv2.imread('penguin.jpg')# head = img1[150:350,500:700]
# img2[250:450,1000:1200] = head
head = img1[250:450,1000:1200]
img2[150:350,500:700] = headcv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

说明:

  • 通过数组操作,可轻松实现区域复制与图像拼接。


总结

通过本教程,我们学习了 OpenCV 的以下基础内容:

功能使用方法
图像读取cv2.imread()
图像展示cv2.imshow()
灰度图转换cv2.IMREAD_GRAYSCALEcv2.cvtColor()
图像裁剪NumPy 切片
视频读取cv2.VideoCapture()
通道分离与合并cv2.split()cv2.merge()
图像缩放cv2.resize()
图像保存cv2.imwrite()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917968.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917968.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917968.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】使用Sql Server创建索引优化查询速度,一般2万多数据后,通过非索引时间字段排序查询出现超时情况

大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录前言SQL 创建索引…

MyBatis联合查询

文章目录数据库设计MyBatis 配置MyBatis 映射文件Mapper 接口总结数据库设计 建表 SQL CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL );CREATE TABLE order (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_no VARCHAR(…

项目中使用的设计模式

项目中使用的设计模式请列举几个项目中常用的设计模式什么是设计模式,在项目中使用了那些设计模式动态代理模式JDK动态代理CGLIB动态代理单例模式懒汉式(非线程安全)饿汉式懒汉式(线程安全)工厂模式观察者模式装饰器模…

实战教程:从“对象文件为空“到仓库重生——修复 Git 仓库损坏全记录

文章目录实战教程:从"对象文件为空"到仓库重生——修复 Git 仓库损坏全记录案发现场:一个严重损坏的仓库修复之旅:四步让仓库重获新生准备工作:创建安全备份第 1 步:清理战场——删除所有空对象第 2 步&…

ansible 操作家族(ansible_os_family)信息

1. 操作系统系列 (ansible_os_family)ansible web -m setup -a filteransible_os_family2. 操作系统家族为 RedHat 时执行任务--- - hosts: websrvsremote_user: roottasks:- name: Install package on RedHat systemsyum:name: httpdstate: presentwhen…

一文学会c++继承 组合

文章目录继承简介定义访问限定符和继承方式⭐基类派生类赋值转换继承的作用域派生类的默认成员函数继承与友元继承与静态成员⭐复杂的菱形继承虚拟继承组合继承简介 继承是面向对象程序设计代码复用的重要手段,使得程序员可以在保持原类的基础上扩展,新…

.Net下载共享文件夹中的文件

由于IIS站点权限等问题,总是没找到处理办法,所以改用外挂的winform的方式来下载共享文件(也可以改为使用windows服务的方式)。 前提需要先在资源管理器中登录到共享文件夹,确保系统能访问。 服务端代码 (.NET后端) usi…

目标检测数据集 - 眼睛瞳孔检测数据集下载「包含COCO、YOLO两种格式」

数据集介绍:眼睛瞳孔检测数据集,真实采集高质量人脸眼部图片数据,适用于人脸定位、人脸疾病如白内障等疾病的视觉检测。数据标注标签包括 eyepupil 瞳孔一 个缺陷类别;适用实际项目应用:眼睛瞳孔检测项目,以…

Keil MDK-ARM V5.42a 完整安装教程

文章目录一、安装前期准备二、Keil MDK-ARM 主程序安装三、器件支持包(Pack)安装四、许可证激活五、安装验证Keil MDK(Microcontroller Development Kit)是针对 Arm Cortex-M 系列微控制器的专业开发环境,集成了 μVis…

WPF中引用其他元素各种方法

在WPF中,引用其他元素的方式有多种,每种方式适用于不同场景,各有优缺点。除了x:Reference,常用的还有以下几种: 一、ElementName 绑定(最常用的XAML绑定方式) 通过元素的x:Name属性引用同一作用…

Python生成统计学公式

一元线性回归模型 2.1回归分析概述/25 一、回归分析基本概念/25 二、总体回归函数/27 三、随机误差项/29 四、样本回归函数/30 2.2 一元线性回归模型的参数估计/32 一、参数估计的普通最小二乘法/32 二、拟合优度/35 2.3基本假设与普通最小二乘估计量的统计性质/36 一、一元线性…

网络工程师--华为命令专题

一、交换机 交换机分类:1.根据交换方式划分:(1)存储转发式交换(Store and Forward)(2)直通式交换(Cut-through)(3)碎片过滤式交换&…

判断可编辑div的光标是否在最前面

要判断一个可编辑div(contenteditable)中的光标是否位于最前面,可以使用以下几种方法: 方法一:使用Selection和Range API function isCaretAtStart(div) {const selection window.getSelection();if (selection.rangeCount 0) return false…

【unity实战】使用Unity程序化生成3D随机地牢(附项目源码)

最终效果 文章目录最终效果前言1、理解程序生成的核心概念2、种子值的核心作用3、程序生成的实际应用4、主流程序生成技术概览5、选择合适的技术实战1、素材2、生成一面墙变换矩阵数据3、渲染墙壁4、加点随机不同的墙壁效果5、绘制四面墙壁4、在四个角落生成支柱5、生成地板6、…

多账号管理方案:解析一款免Root的App分身工具

之前有小伙伴问阿灿有没有可以软件分身的免费软件,后来阿灿找到了一款可以无限分身的app感觉很实用,只有10M大小 02软件介绍说白了它能给各种app和游戏做分身,包括V信、qQ、某音、某付宝这些,而且支持最新的安卓15系统。每个分身…

(附源码)基于PHP和Vue的网上购物平台

内容摘要 内容摘要: 随着互联网技术的迅猛发展,网上购物已成为人们日常生活的重要组成部分。本文围绕PHPVue技术栈构建的网上购物平台展开研究,深入探讨了该平台的架构设计与实现细节。平台前端采用Vue框架,利用其组件化开发和数据驱动的特性…

51单片机

中断系统1.什么是中断当CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断2.为什么要…

前端开发:HTML(5)—— 表单

下面我们来学习表单。 目录 什么是Web表单? 表单标签 1.form标签 2.输入框 文本框和密码框 单选框和复选框 1.单选框 2.复选框 3.按钮 (1)普通按钮 (2)提交按钮 (3)重置按钮 &#…

【YOLOv8改进 - C2f融合】C2f融合SFS-Conv(空间 - 频率选择卷积)提升特征多样性,同时减少参数和计算量

YOLOv8目标检测创新改进与实战案例专栏 专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例 专栏链接: YOLOv8基础解析+创新改进+实战案例 文章目录 YOLOv8目标检测创新改进与实战案例专栏 介绍 摘要 文…

如何将照片从POCO手机传输到Mac电脑

将照片从POCO手机传输到Mac电脑可能会有些困难,因为与iPhone不同,POCO设备没有原生的macOS支持。这常常让用户寻找简单、有效的方法来移动图片,同时避免丢失质量,节省时间,并避免复杂的软件设置。如果你想知道如何将照…