《Opencv》基础操作<1>

目录

一、Opencv简介

主要特点:

应用领域:

二、基础操作

1、模块导入

2、图片的读取和显示

(1)、读取

(2)、显示

[3、 图片的保存](#3、 图片的保存)

4、获取图像的基本属性

5、图像转灰度图

6、图像的截取

7、图像的缩放

8、图像的旋转

9、膨胀和腐蚀操作

(1)、膨胀操作

(2)、腐蚀操作

10、图像的轮廓检测

[(1)、Sobel 算子轮廓检测法](#(1)、Sobel 算子轮廓检测法)

[(2)、findContours 边缘检测算法](#(2)、findContours 边缘检测算法)

(3)、Canny轮廓检测


一、Opencv简介

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列C++函数和少量C函数构成,同时也提供了Python、Java、MATLAB等语言的接口。OpenCV的设计目标是提供一个简单易用的计算机视觉框架,以便开发者能够快速实现各种视觉处理任务。

主要特点:

  1. 跨平台支持:OpenCV可以在Windows、Linux、macOS、Android和iOS等多个操作系统上运行。

  2. 丰富的图像处理功能:包括图像的读取、显示、保存、滤波、边缘检测、形态学操作、特征检测与描述、图像分割等。

  3. 视频处理:支持视频的读取、显示、保存,以及视频流的实时处理。

  4. 机器学习:内置了多种机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等,可以用于分类、回归等任务。

  5. 深度学习支持:OpenCV 3.3版本之后,集成了深度学习模块,支持TensorFlow、Caffe、Torch等主流深度学习框架的模型导入和推理。

  6. 高性能:OpenCV的许多算法都经过了优化,能够高效地处理大规模图像和视频数据。

  7. 开源社区支持:OpenCV拥有庞大的用户和开发者社区,提供了丰富的文档、教程和示例代码,方便用户学习和使用。

应用领域:

OpenCV广泛应用于各种计算机视觉和图像处理任务,包括但不限于:

  • 图像处理:如图像增强、滤波、边缘检测等。

  • 视频分析:如目标跟踪、运动检测、行为识别等。

  • 机器视觉:如工业检测、机器人视觉、自动驾驶等。

  • 医学图像处理:如CT、MRI图像的分析与处理。

  • 增强现实:如虚拟物体叠加、实时特效等。

二、基础操作

1、模块导入

python 复制代码
import cv2

2、图片的读取和显示

(1)、读取
  • 读取原图
python 复制代码
image = cv2.imread('图片名或路径')
  • 读取灰度图

在路径后面加上0,代表以灰度图的形式读取图片

python 复制代码
image = cv2.imread('图片名或路径',0)
(2)、显示
python 复制代码
import cv2

# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.waitKey() 函数 : 用于等待用户的按键事件,它的参数表示等待按键的时间(单位是毫秒)。当参数设置为 0 时,意味着程序会一直处于等待状态,直到用户按下任意一个按键为止;

**cv2.destroyAllWindows ( )函数 :**作用是关闭所有由 OpenCV 创建的图像显示窗口。

3、 图片的保存

python 复制代码
import cv2

# 保存图像
cv2.imwrite('output_image.jpg', image)

4、获取图像的基本属性

获取图像的BGR、像素点个数、数据类型。

python 复制代码
# 获取图像的宽度和高度
height, width, channels = image.shape

# 获取图像的尺寸
size = image.size

# 获取图像的数据类型
dtype = image.dtype

5、图像转灰度图

假设一张已经读取的非灰度图想转为灰度图,可用此方法

python 复制代码
import cv2

gray_img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

6、图像的截取

注:前面的参数截取的是高,后面的是宽。opencv中的图像坐标原点在图像的左上角。

python 复制代码
img_cut = image[0:50,0:50]
# 前面的参数截取的是高,后面的是宽。

7、图像的缩放

python 复制代码
import cv2
# 缩放图像
resized_image = cv2.resize(image, (new_width, new_height))

8、图像的旋转

python 复制代码
import cv2

# 获取图像的中心点
(h, w) = image.shape[:2]
center = (w // 2, h // 2)

# 旋转图像
M = cv2.getRotationMatrix2D(center, angle, scale)
rotated_image = cv2.warpAffine(image, M, (w, h))

center:图像的中心点;

angle:旋转的角度,正数为逆时针旋转,负数为顺时针旋转;

scale:图像旋转后的缩放比例;

M :为一个2*3的变换矩阵,会被后续的 cv2.warpAffine 函数用来对图像实际执行旋转(以及缩放,如果有设置缩放比例的话)操作;

(w,h):经过旋转等变换后输出的图像 大小;

9、膨胀和腐蚀操作

(1)、膨胀操作
python 复制代码
import cv2
import numpy as np

kernel = np.ones(3,3)

# 膨胀操作
dilated_image = cv2.dilate(image, kernel, iterations=1)
(2)、腐蚀操作
python 复制代码
import cv2
import numpy as np

kernel = np.ones(3,3)

# 腐蚀操作
eroded_image = cv2.erode(image, kernel, iterations=1)

iterations参数:用于指定腐蚀操作执行的次数

10、图像的轮廓检测

注意:轮廓检测最好使用灰度图或者二值化的图,这样检测会更精准。

(1)、Sobel 算子轮廓检测法
python 复制代码
import cv2

# 水平方向检测
sobelx = cv2.Sobel(image,cv2.CV_64F,1,0,ksize=3)
# 对结果取绝对值,以免负数被截取为0
sobelx = cv2.convertScaleAbs(sobelx)

# 垂直方向检测
sobely = cv2.Sobel(image,cv2.CV_64F,0,1,ksize=3)
# 对结果取绝对值,以免负数被截取为0
sobely = cv2.convertScaleAbs(sobely)

# 垂直水平方向根据权重进行相加
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)


cv2.imshow('',sobelxy)

此种方法最好水平检测与垂直检测分开,然后再求和。如果同时检测效果会不好。

(2)、findContours 边缘检测算法

使用cv2.findContours()算法时图片必须是灰度图或者经过二值化处理过的图

python 复制代码
import cv2

# 查找轮廓
contours, hierarchy = cv2.findContours(image_gray, type1, type2)

# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)

contours:包含了所有检测到的轮廓信息的列表;

hierarchy:它表示轮廓之间的层次关系信息;

image:表示待检测的图片;

type1(轮廓检测形式)有如下选项:

**cv2.RETR_TREE:**表示会检索所有的轮廓,并重构嵌套轮廓的完整层次结构;

**cv2.RETR_EXTERNAL:**只检索最外层的轮廓,忽略所有内部的子轮廓;

**cv2.RETR_LIST:**检索所有轮廓,但不建立轮廓间的层次关系;

type2(轮廓逼近的方法)有如下选项:

**cv2.CHAIN_APPROX_SIMPLE:**会压缩水平、垂直和对角方向的线段,仅保留轮廓的端点信息,将轮廓用尽可能少的点来表示,以达到简化轮廓数据的目的;

**cv2.CHAIN_APPROX_NONE:**存储轮廓的所有边界点,也就是完整地记录轮廓经过的每一个像素点,不进行任何简化,这样得到的轮廓数据会比较详细、准确,但数据量通常很大。

(3)、Canny轮廓检测
python 复制代码
import cv2
result_img = cv2.Canny(gray_img,50,150,apertureSize=3,L2gradient=True)
cv2.imshow('result_img',result_img)

**50,150:**低阈值和高阈值;

apertureSize:Sobel算子核的大小,一般为奇数3,5,7等;

L2gradient:为True时使用采用更为精确的 L2 范数,为False时采用近似的 L1 范数。

相关推荐
三月七(爱看动漫的程序员)几秒前
Exploring Prompt Engineering: A Systematic Review with SWOT Analysis
人工智能·gpt·学习·语言模型·自然语言处理·chatgpt·prompt
L_cl38 分钟前
【NLP 3、深度学习简介】
人工智能·深度学习
黄卷青灯7740 分钟前
NLP自然语言处理包含哪些方面?
人工智能·自然语言处理·nlp
Guofu_Liao44 分钟前
大语言模型---RewardBench 介绍;RewardBench 的主要功能;适用场景
人工智能·语言模型·自然语言处理
Elastic 中国社区官方博客1 小时前
使用 Spring AI + Elasticsearch 让 RAG 变得简单
java·大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
weixin_543662861 小时前
BERT的中文问答系统35
人工智能·深度学习·bert
kejijianwen2 小时前
Soul App创始人张璐团队亮相GITEX GLOBAL 2024,展示多模态AI的交互创新
人工智能
想你依然心痛2 小时前
【AI赋能电商】探索人工智能在购物推荐、会员管理和商品定价中的创新应用及其对销售效率和用户体验的影响
人工智能·ux
baijin_cha2 小时前
深度学习基础02_损失函数&BP算法(上)
人工智能·笔记·深度学习
青石横刀策马2 小时前
从0开始深度学习(33)——循环神经网络的简洁实现
人工智能·rnn·深度学习