计算机视觉(opencv)实战一——图像本质、数字矩阵、RGB + 图片基本操作(灰度、裁剪、替换等)

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/web/93042.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93042.shtml

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

相关文章

《探索C++ set与multiset容器:深入有序唯一性集合的实现与应用》

前引:在STL的关联式容器中,set以其严格的元素唯一性和自动排序特性成为处理有序数据的核心工具。其底层基于红黑树(Red-Black Tree)实现,保证了O(log n)的查找、插入与删除复杂度!本文将从底层原理切入&…

各测试平台功能对比分析(ITP,Postman,Apifox,MeterSphere)

对比ITP与Postman,Apifox,MeterSphere 功能特性ITPPostmanApifoxMeterSphere接口测试✅ 可视化接口调试,支持多种请求方式✅ 支持✅ 支持✅ 支持场景测试✅ 多接口串联测试,支持前后置脚本✅ Collections功能✅ 支持✅ 支持定时任务✅ 基于Celery的定时…

开源日志log4cplus—如何将 string类型转为tstring类型,又如何将char*类型转换为tstring类型?

文章目录🔧 一、理解 log4cplus::tstring 的本质⚙️ 二、std::string 转 tstring 的三种方法✅ 1. 使用内置宏 LOG4CPLUS_STRING_TO_TSTRING(推荐)✅ 2. 手动条件编译转换(精细控制)✅ 3. 多字节模式下的直接赋值⚙️…

深度学习之CNN网络简介

CNN网络简单介绍 1.概述 卷积神经网络(Convolutional Neural Network,CNN)是一种专门用于处理具有网格状结构数据的深度学习模型。 ​ CNN网络主要有三部分构成:卷积层、池化层和全连接层构成,其中卷积层负责提取图像中…

【微实验】基频提取的MATLAB实现(优化版)

前情提要: 【超详细】科普:别再只会用自相关!YIN 和 PYIN 如何破解音频隐藏密码?-CSDN博客 【微实验】妈妈我的MATLAB会识别声音的基频了!-CSDN博客 今天用MATLAB把算法封装成函数,然后调用对比结果。 …

开发 npm 包【详细教程】(含发布 npm 包,版本号升级,修改包后重新发布等)

1. 给 npm 包取个【唯一】的名字! npm 包命名规范 只能包含小写字母(a-z)、数字(0-9)、连字符(-) 和 下划线(_),不能包含空格、大写字母、标点符号&#xff…

Secure 第三天作业

实验需求:1.参考以上拓扑所示,完成以下需求:1) 配置各设备 IP 地址2) 配置 ZBFW,Inside-1 和 nside-2 属于内部 Zone,Outside-1 属于外部 Zonezone security insidezone security outsidezone-p…

Linux应用层-5.计算机网络(菜鸟学习笔记)

计算机网络的核心是连接与通信,从底层的物理信号到上层的应用服务,各层协议协同工作---------------------------------------------------------------------------------------一.计算机网络分类(按范围)1•个人区域网&#xff…

[论文阅读] 人工智能 + 软件工程 | 大型语言模型对决传统方法:多语言漏洞修复能力大比拼

大型语言模型对决传统方法:多语言漏洞修复能力大比拼 论文阅读:On the Evaluation of Large Language Models in Multilingual Vulnerability RepairarXiv:2508.03470 On the Evaluation of Large Language Models in Multilingual Vulnerability Repair…

计算机网络2-3:传输方式

目录 串行传输和并行传输 同步传输和异步传输 单工、半双工以及全双工通信 总结 串行传输和并行传输 并行传输的优点是速度为串行传输的n倍,但也存在一个严重的缺点即成本高 同步传输和异步传输 单工、半双工以及全双工通信 总结

文档生成PPT软件哪个好?深度测评8款word转ppt生成工具

在日常办公与教学场景中,如何高效地将Word文档内容转化为专业PPT,一直是职场人士、教育工作者及内容创作者的共同痛点。随着AI技术的普及,一键式转换工具应运而生,它们不仅能精准识别Word中的标题与段落结构,还能自动套…

Azimutt:一款免费开源的多功能数据库工具

Azimutt 是一款支持数据库设计、表结构探索与分析、数据查询以及数据库文档生成功能的全栈工具。 Azimutt 是一个免费开源的项目,源代码托管在 GitHub: https://github.com/azimuttapp/azimutt 功能特性 多数据库支持:包括主流数据库 MySQ…

智算赋能:移动云助力“世界一流数据强港”建设之路

2024年5月,某创新产业园区智算中心正式揭牌成立。台下响起的掌声不仅是对一个项目的祝贺,更是客户对未来的期许—— 推动产业结构优化升级,领跑数字经济转型发展。5家500强企业、8家上市企业、17家独角兽企业……该创新产业园区在成为“世界一…

达梦自定义存储过程实现获取表完整的ddl语句

--导出表的ddl CREATE OR REPLACE PROCEDURE show_create_table( db IN varchar(255), tb IN varchar(255)) ASsql1 text;ret text : ;cmt text :;sql2 text :; BEGINFOR WSX IN (select TABLEDEF(db,tb) as ddl from dual) LOOPret: ret||WSX.DDL;END LOOP;ret : ret||chr(10…

【ARM】keil提示UVISION: Error: Encountered an improper argument

1、 文档目标 解决MDK退出debug模式后,提示UVISION: Error: Encountered an improper argument。 2、 问题场景 在退出Debug模式的时候,弹出提示窗口,提示:UVISION: Error: Encountered an improper argument。(如图…

【2025最新版】PDF24 Creator,PDF编辑,合并分割,格式转换全能工具箱,本地离线版本,完全免费!

软件介绍(文末获取)这款软件于1999年开发,至今已经有26年了,这26年里它都完全免费!简洁的操作界面,让用户轻松上手,高效完成 PDF 文件的处理,方便又实用。这次给大家带来的是一个本地…

如何使用VLLM进行openai/gpt-oss系列推理与支持工具调用

OpenAI时隔6年再次推出开源模型gpt-oss系列,本次gpt-oss系列包含两个模型gpt-oss-120b与gpt-oss-20b。由于模型原生支持一种新的量化技术MXFP4,所以模型的部署所需的显存也显著的降低。openai/gpt-oss-20b 只需要大概16GB的显存openai/gpt-oss-120b 需要…

SVN 查看历史信息

SVN 查看历史信息 引言 Subversion(简称SVN)是一个开源的版本控制系统,广泛应用于软件开发中。查看SVN的历史信息对于了解代码变更、追踪问题来源以及理解项目发展历程具有重要意义。本文将详细介绍如何在SVN中查看历史信息。 SVN历史信息概述…

vue+flask山西非遗文化遗产图谱可视化系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处!编号:F068 项目介绍: 本系统主要实现了以下功能: 非遗项目知识图谱可视化 非遗项目可视化关键词分析 …

Jetson NX Python环境搭建:使用APT轻松安装NumPy, scikit-learn, OpenCV

引言 在NVIDIA Jetson NX等ARM架构的嵌入式AI板子上搭建Python开发环境,特别是安装像NumPy、OpenCV这样包含C/C底层代码的科学计算库时,经常会遇到编译失败、耗时过长或依赖冲突等问题。这些问题尤其在通过pip从源代码编译安装时更为突出,例如…