当前位置: 首页 > news >正文

OpenCV入门:图像处理基础教程

OpenCV简介

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库。它包含超过2500种优化算法,涵盖图像处理、物体识别、人脸检测、3D重建、视频分析等任务。

核心功能

  • 图像处理:滤波、边缘检测、几何变换。
  • 视频分析:运动估计、背景减除。
  • 物体检测:人脸、行人、文本等。
  • 相机标定:3D重建、AR应用。
  • 机器学习:SVM、KNN、神经网络等集成。

下载与安装

Python环境安装

通过pip直接安装:

pip install opencv-python  # 仅核心模块
pip install opencv-contrib-python  # 包含额外模块

资源推荐

  • 官方文档:docs.opencv.org
  • GitHub仓库:github.com/opencv/opencv
  • 教程:OpenCV官方提供的Python和C++示例代码。

基础功能

1 读取图片

import cv2
import numpy as np
a=cv2.imread('test.png')
cv2.imshow('tu',a)
print(a.shape)
print(a.size)
print(a.dtype)
b=cv2.waitKey(0)
# cv2.destroyAllWindows()

这里线导入了opencv的库CV2,读取了一张图片,这里我们读取后的数据为(*,*,3),因为默认读取的是RGB三个通道的。然后cv2.show()可以展示图片,cv2.waitKey(0)表示停留时间,如果参数为0,表示一直停留,如果是其他表示停留n毫秒。cv2.destroyAllWindows()表示关闭所有界面

2 转化灰度图和保存

import cv2
import numpy as np
# a=cv2.imread('test.png',cv2.IMREAD_GRAYSCALE)
# a=cv2.imread('test.png',0)#等效
a=cv2.imread('test.png')
a=cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
cv2.imshow('tu',a)
cv2.waitKey(0)
cv2.destroyAllWindows()
#图片保存
cv2.imwrite('test0.jpg',a)

这里采用了三种方法来转化灰度图,前两种都是在读取的同时就转化为灰度图了,第一种用cv2.IMREAD_GRAYSCALE来直接转换,其实吧这个替换为0也是同样效果。还有一种是用cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)来转的。最后可以用cv2.imwrite('test0.jpg',a)来保存。

3 抠图

#抠图
import cv2
import numpy as np
a=cv2.imread('test.png')#等效b=a[100:300,280:500]
cv2.imshow('b',b)
cv2.imshow('tu',a)
cv2.waitKey(0)
#图片保存
cv2.imwrite('test0.jpg',a)

这里就像数组一样,可以进行切片。然后选取我们要选中的区域

我们可以这样理解图片,图片是由一个一个像素组成的,cv2库把像素点量化了(0-255)。通过cv2,我们可以把一组数组转化为图片,也可以把图片转化为数组。所有我们可以选中一块区域来转化为图片。

4 读取视频

#读取视频
import cv2
import numpy as np
video=cv2.VideoCapture('test.mp4')
# video=cv2.VideoCapture(0)         #0表示打开摄像头
if not video.isOpened():            #判断是否打开print("视频打开失败")
while True:ret,frame=video.read()              #ret表示是否读取到下一帧,用于终止画面的if not ret:break# frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)    #把图像转化为黑白的cv2.imshow('frame',frame)if cv2.waitKey(30)  == 27:          #27为esc的ASCII码,只有esc才能退出breakvideo.release()
cv2.destroyAllWindows()

我们用cv2.VideoCapture('test.mp4')来读取一个视频,然后判断是否打开了(防止意外发生),然后如果打开了就进入一个循环,就是读取视频的每一帧,然后如果存在这里ret就为True:帧读取成功,可继续处理,否则就停止了。然后对这一帧进行展示,然后下面cv2.waitKey()中填参数来控制速度越大就会播放的速度。最后要对视频资源进行释放,否则如果视频资源太多会卡顿。

5 提取RGB通道

提取RGB通道
import cv2
import numpy as np
a=cv2.imread('test.png')#等效
a1=a[:,:,0]
a2=a[:,:,1]
a3=a[:,:,2]
cv2.imshow('Red Channel (Grayscale)', a2)
cv2.waitKey(0)b,g,r=cv2.split(a)
cv2.imshow('a',a)
cv2.imshow('g',g)
cv2.imshow('b',b)
cv2.imshow('r',r)
cv2.waitKey(0)a_new=a.copy()
a_new[:,:,0]=0
a_new[:,:,1]=0
# a_new[:,:,2]=0
cv2.imshow('Red',a_new)
cv2.waitKey(0)b,g,r=cv2.split(a)
cv2.imshow('a',a)cv2.imshow('g',g)
cv2.imshow('b',b)
cv2.imshow('r',r)n=cv2.merge([b,g,r])
cv2.imshow('new',n)
cv2.waitKey(0)

上面提供了三种提供RGB的方式,但是如果我们展示单通道的时候会自动转化为灰白的图片,只有当我们将其与两种设为0,这样才会展现出。(RGB顺序和RGB不一样,他是以BGR顺序存在的)

 6 图片打码

import cv2
import numpy as np
a=cv2.imread('test.png')#等效
a[100:300,280:500]=np.random.randint(0,255,(200,220,3))
cv2.imshow('a',a)
cv2.waitKey(0)

还是和上面说的一样,图片由像素表示,像素由数字控制大小,如果我们把指定区域的数字取随机数,那么这块就相当于打码了

7 图片组合

import cv2
import numpy as np
a=cv2.imread('test.png')#等效
b=cv2.imread('img.png')
a[100:300,280:500]=b[100:300,200:420]
cv2.imshow('a',a)
cv2.waitKey(0)

这个就是把像素的一块,替换为另一张图片的一块,和上面图片打码的核心是差不多的。值得注意的是,这里两张图片取的大小要对应。

8 图片缩放

import cv2
import numpy as np
a=cv2.imread('test.png')#等效
cv2.imshow('a',a)
# b=cv2.resize(a,(300,300))
b=cv2.resize(a,dsize=None,fx=1.5,fy=1.5)
cv2.imshow('b',b)
cv2.waitKey(0)

这里由两种方法,虽然都是用resize,但一个 是直接给出你要放大或缩小到多少像素大小,另一种是要横向x和纵向y要放大或缩小多少倍

总结        

        OpenCV是一个开源的计算机视觉库,提供2500多种优化算法,支持图像处理、视频分析、物体检测等任务。摘要介绍了OpenCV的基础功能:1)读取和显示图片;2)灰度图转换与保存;3)图像区域裁剪;4)视频读取与处理;5)RGB通道分离与合并;6)图像打码处理;7)图像组合;8)图像缩放。这些功能展示了OpenCV如何通过像素级操作实现基础图像处理,为更复杂的计算机视觉应用奠定基础。

http://www.lryc.cn/news/613010.html

相关文章:

  • 在开发板上画出一个2048棋盘的矩阵
  • Docker Buildx最佳实践:多架构镜像构建指南
  • P8250 交友问题
  • 如何理解“信号集是位掩码,每个bit代表一个信号”这句话?
  • QtC++ 中使用 qtwebsocket 开源库实现基于websocket的本地服务开发详解
  • UE5多人MOBA+GAS 39、制作角色上半身UI
  • Redis中间件(四):主从同步与对象模型
  • HarmonyOS系统 读取系统相册图片并预览
  • 基于django的非物质文化遗产可视化网站设计与实现
  • Jenkins全链路教程——Jenkins项目创建与基础构建
  • 2025年机械工程与自动化技术国际会议(ICMEAT 2025)
  • 单链表专题---暴力算法美学(1)(有视频演示)
  • Numpy科学计算与数据分析:Numpy数组索引与切片入门
  • 【论坛系统自动化功能测试报告】
  • 动手学深度学习(pytorch版):第一节——引言
  • 具身智能机器人 - Reachy Mini
  • MyCAT实战环节
  • 考研复习-计算机组成原理-第三章-存储系统
  • 微服务平台需求-部署一体化文档V1.0
  • cv2.threshold cv2.morphologyEx
  • Ubuntu 25.04 安装 pyenv 并配置多个 python 版本
  • Java并发与数据库锁机制:悲观锁、乐观锁、隐式锁与显式锁
  • 构建一个简洁优雅的 PHP 参数验证器 —— php-schema-validator
  • 金仓KingbaseES逻辑架构,与Oracle/MySQL对比
  • Python实现点云随机一致性(RANSAC)配准——粗配准
  • (Python)Python爬虫入门教程:从零开始学习网页抓取(爬虫教学)(Python教学)
  • 利用vue.js2X写前端搜索页面,express写后端API接口展现搜索数据
  • python数据结构与算法(基础)
  • DrissionPage自动化:高效Web操作新选择
  • 怎么在本地引入字体