python cv2的一些操作,如膨胀,画线,滤波等

news2024/11/26 18:35:31

目录

  • 0. cv2简介
  • 1. 打开摄像头
  • 2. 画图,画线
  • 3. 滤波
  • 4. 获取角点
  • 5. 梯度+边缘
  • 6. 图形匹配
  • 7. 形态学变化-膨胀腐蚀
  • 8. 二值化+阈值
  • 10. 总结

0. cv2简介

在这里先简单介绍一下cv2吧。

  1. cv2 是 OpenCV Python 库的主要模块,提供了许多图像处理和计算机视觉方面的函数和工具。使用 cv2 可以对图像进行读取、保存、处理、显示等操作,同时也提供了许多计算机视觉方面的算法和函数,如特征检测、对象跟踪、图像分割等。
  2. cv2 中一些常用的函数和工具包括:
  • cv2.imread():读取图像文件。
  • cv2.imshow():显示图像。
  • cv2.imwrite():保存图像到文件。
  • cv2.cvtColor():将图像从一种颜色空间转换为另一种。
  • cv2.resize():调整图像大小。
  • cv2.threshold():对图像应用阈值。
  • cv2.findContours():查找图像中的轮廓。
  • cv2.matchTemplate():在图像中查找模板。
  • cv2.VideoCapture():捕获视频帧。
  • cv2.VideoWriter():将视频帧写入文件。
  1. 除此之外,cv2 还提供了许多计算机视觉方面的算法和函数,如特征检测与匹配、对象检测与跟踪、图像分割、人脸识别等。cv2 是 Python 中进行图像处理和计算机视觉的重要工具之一,被广泛应用于工业、医疗、安防等领域。

1. 打开摄像头

代码:

'''
Descripttion: 打开摄像头
version: 版本
Author: YueXuanZi
Date: 2023-05-29 16:29:15
LastEditors: YueXuanZi
LastEditTime: 2023-06-13 19:33:46
Experience: 心得体会
'''
import cv2

capture = cv2.VideoCapture(0)

while True:
    ret, frame = capture.read()
    frame2 = cv2.flip(frame,1)
    cv2.imshow("camera",frame2)
    key = cv2.waitKey(1)
    if key!= -1:
        break

capture.release()

注意:要找好摄像头型号是否匹配,再者,想关闭摄像头,我这里设置是,按一下键盘的“1”就好。
在cv2.imshow()之前可以对frame2的矩阵进行处理。

2. 画图,画线

代码:

'''
Descripttion: 画图,画线
version: 版本
Author: YueXuanZi
Date: 2023-05-29 15:05:24
LastEditors: YueXuanZi
LastEditTime: 2023-06-13 19:29:47
Experience: 心得体会
'''
import cv2
import numpy as np

image = np.ones((300,300,3))
cv2.imshow("image",image)
cv2.line(image,(100,200),(250,250),(255,0,255),2) # 图像,起点,终点,颜色,粗细
cv2.rectangle(image,(30,100),(60,150),(0,255,0),2) # 方框
cv2.circle(image,(150,100),20,(0,0,255),3)  # 圆圈
cv2.putText(image,"hello",(100,50),3,1,(0,255,255),2,1) # 字符串,坐标,字体序号,缩放系数,颜色,粗细
cv2.imshow("image",image)
cv2.waitKey()

运行结果:
图像

这个经常用在对图像中某个物体的识别进行框出来或者标识

3. 滤波

代码:

'''
Descripttion: 滤波
version: 版本
Author: YueXuanZi
Date: 2023-05-29 15:13:00
LastEditors: YueXuanZi
LastEditTime: 2023-06-13 19:30:23
Experience: 心得体会
'''
import cv2


image = cv2.imread("women.jpg")

gauss = cv2.GaussianBlur(image,(5,5),0) # 高斯滤波
median = cv2.medianBlur(image,5) # 中值

cv2.imshow("image1",image)
cv2.imshow("gauss",gauss)
cv2.imshow("median",median)
cv2.imshow("image",image)
cv2.waitKey()

运行结果:
图像

cv2 滤波函数是 OpenCV 库中的函数,用于对图像进行滤波处理。 常用的滤波函数包括:

  1. cv2.blur(src, ksize[, dst[, anchor[, borderType]]]):均值滤波。将每个像素的值设置为其周围像素的平均值。
  2. cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]):高斯滤波。将每个像素的值设置为其周围像素的加权平均值,权重取决于它们到中心像素的距离,距离越远的像素权重越小。
  3. cv2.medianBlur(src, ksize[, dst]):中值滤波。将每个像素的值设置为其周围像素的中值,即排序后的中间值。
  4. cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]):双边滤波。将每个像素的值设置为其周围像素的加权平均值,权重除了像素间距离外,还考虑了它们的像素值相似度。

4. 获取角点

代码:

'''
Descripttion: 获取角点
version: 版本
Author: YueXuanZi
Date: 2023-05-29 15:16:32
LastEditors: YueXuanZi
LastEditTime: 2023-06-13 19:30:39
Experience: 心得体会
'''
import cv2

image = cv2.imread("women.jpg")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
corners = cv2.goodFeaturesToTrack(gray, 500, 0.1, 10)
for corner in corners:
    x,y = corner.ravel()
    cv2.circle(image,(int(x),int(y)),3,(255,0,255),-1)

cv2.imshow("corners",image)
cv2.waitKey()

运行结果:

图像

cv2.goodFeaturesToTrack是OpenCV中的一个函数,可以在图像中检测到角点。其用法如下:

cv2.goodFeaturesToTrack(image, 
						maxCorners, 
						qualityLevel, 
						minDistance[, 
									corners[, 
											mask[, 
												blockSize[,
													 useHarrisDetector[,
													 	 k]]]]]) -> corners

其中,参数的含义如下:

  • image:输入的灰度图像。
  • maxCorners:检测到的最大角点数。
  • qualityLevel:表示角点的可接受质量水平,取值范围为0到1之间。
  • minDistance:表示角点之间的最小距离。
  • corners:输出的角点坐标。
  • mask:可选参数,表示要检测的图像区域。
  • blockSize:计算梯度和角点响应函数时所使用的窗口大小。
  • useHarrisDetector:可选参数,表示是否使用Harris角点检测算法。默认为False。
  • k:可选参数,表示Harris角点检测算法中的参数k,默认值为0.04。

返回值为检测到的角点坐标列表。

5. 梯度+边缘

代码:

'''
Descripttion: 梯度+边缘
version: 版本
Author: YueXuanZi
Date: 2023-05-29 15:32:07
LastEditors: YueXuanZi
LastEditTime: 2023-05-29 15:39:08
Experience: 心得体会
'''
import cv2
import numpy as np

gray = cv2.imread("women.jpg",cv2.IMREAD_GRAYSCALE)

laplacian = cv2.Laplacian(gray, cv2.CV_64F)
canny = cv2.Canny(gray, 100, 200) # 大于200,是边缘,小于100,非边缘,100——200待定

cv2.imshow("gray",gray)
cv2.imshow("laplacian", laplacian)
cv2.imshow("canny",canny)

cv2.waitKey()

运行结果:
图像

6. 图形匹配

原图:
原图

代码:

'''
Descripttion: 图形匹配
version: 版本
Author: YueXuanZi
Date: 2023-05-29 15:23:11
LastEditors: YueXuanZi
LastEditTime: 2023-06-13 19:31:26
Experience: 心得体会
'''
import cv2
import numpy as np
image = cv2.imread("puke.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 

templat = gray[51:62, 50:64]

match = cv2.matchTemplate(gray, templat, cv2.TM_CCOEFF_NORMED)

locations = np.where(match>0.9)
w, h = templat.shape[0:2]
for p in zip(*locations[::-1]):
    x1,y1 = p[0],p[1]
    x2,y2 = x1 + w, y1 + h
    cv2.rectangle(image, (x1,y1),(x2,y2),(0,255,0),2)

cv2.imshow("image",image)
cv2.waitKey()

运行结果:
pipei

cv2.matchTemplate 是 OpenCV 库中的函数,用于在一幅图像中搜索指定的模板(即另一张小图像),并返回模板在原图像中的位置。该函数使用模板匹配算法,通过对原图像中每个像素与模板的相似度进行比较,得到一个响应图像,其中响应值最大的位置即为匹配位置。
函数原型如下:

cv2.matchTemplate(image, templ, method[, result[, mask]])

参数说明:

  • image:原图像,可以是任意通道数的灰度图或彩色图像。
  • templ:模板图像,必须是单通道的灰度图像。
  • method:匹配算法,可选值包括 cv2.TM_SQDIFF、cv2.TM_SQDIFF_NORMED、>cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_CCOEFF 和 >cv2.TM_CCOEFF_NORMED。
  • result:可选输出参数,响应图像。
  • mask:可选掩码,指定哪些像素需要匹配。
    函数返回值为一个 Numpy 数组,表示模板在原图像中的匹配结果。可以通过 np.unravel_index 函数将数组中响应值最大的位置转换为坐标。例如:
res = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img, top_left, bottom_right, 255, 2)

其中 img 是原图像,templ 是模板图像,w 和 h 分别是模板图像的宽度和高度,max_loc 是响应图像中响应值最大的位置。这段代码将在原图像中绘制一个矩形框,框选出匹配到的区域。

7. 形态学变化-膨胀腐蚀

代码:

'''
Descripttion: 形态学变化
version: 版本
Author: YueXuanZi
Date: 2023-05-29 15:59:32
LastEditors: YueXuanZi
LastEditTime: 2023-05-29 16:28:36
Experience: 心得体会
'''
import cv2
import numpy as np

gray = cv2.imread("women.jpg",cv2.IMREAD_GRAYSCALE)

_, binary = cv2.threshold(gray, 150,255, cv2.THRESH_BINARY_INV) # cv2.THRESH_BINARY_INV反向二值化
kernel = np.ones((5,5),np.uint8)

erosion = cv2.erode(binary, kernel) # 腐蚀
dilation = cv2.dilate(binary,kernel) # 膨胀

cv2.imshow("binary",binary)
cv2.imshow("erosion",erosion)
cv2.imshow("dilation",dilation)

cv2.waitKey()

运行结果:
tu1
cv2 中的膨胀(dilate)和腐蚀(erode)是图像处理中基本的形态学操作,它们主要用于对二值图像进行处理,可以用于去除图像中的噪声、填补图像中的空洞、分离图像中的物体等。

  1. 膨胀操作将图像中的边缘区域扩张,使得图像中的白色区域增大。具体来说,对于图像中的每个像素,如果其周围存在至少一个白色像素,则该像素被认为是白色的;否则,该像素被认为是黑色的。膨胀的过程可以使用一个结构元素(kernel)来控制,结构元素可以是任意形状的矩阵,通常是一个正方形或圆形。
  2. 腐蚀操作与膨胀相反,将图像中的边缘区域收缩,使得图像中的白色区域减小。具体来说,对于图像中的每个像素,如果其周围所有像素都是白色,则该像素被认为是白色的;否则,该像素被认为是黑色的。腐蚀的过程也可以使用一个结构元素来控制。
  3. 膨胀和腐蚀操作可以组合使用,也可以多次重复执行,以达到不同的效果。例如,先进行膨胀操作,然后再进行腐蚀操作,可以去除图像中的小孔和毛刺;而先进行腐蚀操作,然后再进行膨胀操作,可以填补图像中的空洞和裂缝。
  4. 膨胀和腐蚀操作在图像处理中的应用非常广泛,例如在数字图像处理中,可以用于二值化、边缘检测、形态学分析等方面。

8. 二值化+阈值

代码:

'''
Descripttion: 二值化+阈值
version: 版本
Author: YueXuanZi
Date: 2023-05-29 15:41:08
LastEditors: YueXuanZi
LastEditTime: 2023-06-05 16:39:28
Experience: 心得体会
'''
import cv2
import numpy as np

gray = cv2.imread("women.jpg",cv2.IMREAD_GRAYSCALE)

ret, binary =cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
print(gray.shape)
binary_adaptive = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,155,1)
# 大金算法
ret1, binary_otsu = cv2.threshold(gray, 0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)

cv2.imshow("gray",gray)
cv2.imshow("binary",binary)
cv2.imshow("adaptive",binary_adaptive)
cv2.imshow("otsu",binary_otsu)

cv2.waitKey()

运行结果:

tuian

cv2的二值化作用与原理:

  1. cv2 中的二值化(thresholding)是一种常用的图像预处理方法,用于将灰度图像转换为二值图像,即只有黑白两种颜色的图像。二值化可以使图像中的信息更加简洁明了,便于后续的图像处理和分析。
  2. 二值化的原理是将灰度图像中的像素值进行阈值处理,将大于或等于阈值的像素设为白色,小于阈值的像素设为黑色。在 cv2 中,可以使用 cv2.threshold() 函数进行二值化处理,其参数包括输入图像、设定的阈值、像素值的最大值、二值化的类型等。

cv2的阈值解释和参数:

  1. cv2 中的阈值(threshold)是一种常用的图像处理操作,用于将图像中的像素值转换为二进制形式,即只有 0 和 1 两种状态,以实现图像分割、边缘检测等目的。
  2. 阈值可以限制图像中像素值的范围,从而达到筛选出感兴趣区域的作用。在 cv2 中,可以使用 cv2.threshold() 函数进行阈值处理,其参数包括输入图像、设定的阈值、像素值的最大值、阈值处理的类型等。
  3. 阈值处理的类型有以下几种:
  • cv2.THRESH_BINARY:大于阈值的像素设为最大值,小于阈值的像素设为 0。
  • cv2.THRESH_BINARY_INV:大于阈值的像素设为 0,小于阈值的像素设为最大值。
  • cv2.THRESH_TRUNC:大于阈值的像素设为阈值,小于阈值的像素不变。
  • cv2.THRESH_TOZERO:大于阈值的像素不变,小于阈值的像素设为 0。
  • cv2.THRESH_TOZERO_INV:大于阈值的像素设为 0,小于阈值的像素不变。

10. 总结

其实cv2挺简单的,而且方便好用,可以学习一下,用于图像识别是一个很有趣的库。


最后我把我用的那个图片放在这里吧,欢迎大家在评论区交流学习!!!


图片

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

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

相关文章

vue2组件通信

父传子 传递静态或动态 Prop <!-- 传入静态值 --> <blog-post title"hai hai hai"></blog-post><!-- 传入变量值 --> <blog-post :title"info.title"></blog-post>传入一个对象的所有 property 数据 post: {id: 1…

进程管道:popen函数实例

基础知识 可能最简单的在两个程序之间传递数据的方法就是使用popen和pclose函数了。它们的原型如下所示&#xff1a; #include <stdio.h>FILE *popen(const char *command, const char *type);int pclose(FILE *stream); 1&#xff0e;popen函数 popen函数允许一个程…

因为Json,controller方法单参数 导致脑袋短路

对于单参数方法&#xff0c; 一直喜欢用parameter方式。今天不知道为啥&#xff0c;就想用Json方式&#xff0c;然后无法直接传递。各种自我怀疑&#xff0c;然后尝试。 突然醒悟过来&#xff0c;Json方式是key/value模式&#xff0c;单参数String类型&#xff0c;没有key。必…

TreeMap源码

介绍 如果我们希望Map可以保持key的大小顺序时&#xff0c;就需要利用TreeMap。底层使用了红黑树&#xff0c;左子树总小于root&#xff0c;右子树总大于root&#xff0c;具有很好的平衡性,操作速度达到log(n)。 TreeMap 相比于HashMap多实现了了NavigableMap接口&#xff08…

5. SpringCloudAlibab 集成 gateway

一、什么是 Spring Cloud Gateway 1、网关简介 网关作为流量的入口&#xff0c;常用的功能包括路由转发&#xff0c;权限校验&#xff0c;限流等等。 SpringCloud Gateway是 Spring Cloud 官方推出的第二代网关框架&#xff0c;定位取代 Netflix Zuul。相对Zuul来说&#xf…

【多线程】原子引用ABA问题

目录 一、代码示例二、执行结果截图三、说明四、AtomicStampedReference使用4.1 代码示例4.2 截图 一、代码示例 package com.learning.atomic;import lombok.extern.slf4j.Slf4j; import java.util.concurrent.atomic.AtomicReference; /*** Author wangyouhui* Description …

2023年软考-高级信息系统项目管理工程师考试大纲

高级信息系统项目管理工程师考试大纲 2023年软考高级信息系统项目管理工程师考试大纲已于2023年5月出版。您可以在 中国计算机技术职业资格网 上找到更多关于考试的信息 。 信息系统项目管理师是对从事信息系统项目管理工作的专业技术人员基本理论和实践能力的综合考核,该专业…

新手如何挑选一款合适的功率放大器?

ATA系列功率放大器是&#xff08;AB&#xff09;类功放&#xff0c;相比于甲类功率放大器&#xff0c;它小信号输入时效率更高&#xff0c;随着输出功率的增大&#xff0c;效率也增高&#xff0c;它的效率比以及保真度而言&#xff0c;都优于A类和B类功放。 因为具有这些优势&a…

助你更好的理解 Python 字典

助你更好的理解 Python 字典 字典是Python中的常用数据类型之一&#xff0c;可将数据存储在键/值对中&#xff0c;同 Java 中的 Map 相似。 1、什么是字典理解&#xff1f; 字典理解是创建字典的一种优雅简洁的方法。 字典理解优化 使用字典理解优化函数。 示例&#xff…

使用 FFmpeg 开发的那些事

勇敢就是&#xff0c;在你还没开始的时候就知道自己注定会输&#xff0c;但依然义无反顾地去做&#xff0c;并且不管发生什么都坚持到底。一个人很少能赢&#xff0c;但也总会有赢的时候。《杀死一只知更鸟》 欢迎大家加入广州城市社区&#xff1a;https://devpress.csdn.net/g…

java面经

String, StringBuffer, StringBuilder区别 第一点是可变性。String不可变&#xff0c;String Buffer和StringBuider可变。这是因为String被final修饰&#xff0c;每次操作都生成新的对象。StringBuffer和StringBuilder的父类AbstractStringBuilder没有被final修饰。 第二点是…

MATLAB 之 非线性方程数值求解、最优化问题求解和常微分方程初值问题的数值求解

这里写目录标题 一、非线性方程数值求解1. 单变量非线性方程求解2. 非线性方程组的求解 二、最优化问题求解1. 无约束最优化问题求解2. 有约束最优化问题求解3. 线性规划问题求解 三、常微分方程初值问题的数值求解1. 龙格—库塔法简介2. 龙格—库塔法的实现 一、非线性方程数值…

Day975.如何使用JWT结构化令牌 -OAuth 2.0

如何使用JWT结构化令牌 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何使用JWT结构化令牌的内容。 OAuth 2.0 规范并没有约束访问令牌内容的生成规则&#xff0c;只要符合唯一性、不连续性、不可猜性就够了。这就意味着&#xff0c;可以灵活选择令牌的形式&…

将递归函数转成非递归函数的通用方法

看到过一道非常不错的面试题&#xff1a;不支持递归的程序语言如何实现递归程序&#xff1f; 之所以说这道题好&#xff0c;是因为&#xff1a; 首先&#xff0c;它不是纯粹考概念和死记硬背&#xff0c;求职者在回答问题之前需要进行一定的思考&#xff1b; 其次&#xff0c…

vim粘贴出现多余的#

vim粘贴yaml格式时&#xff0c;出现多余的#&#xff0c;格式错误 解决&#xff1a;设置paste :set paste 然后再粘贴即可

final不可变性

一、什么是不可变性&#xff08;Immutable&#xff09; 如果对象在被创建后&#xff0c;状态就不能被修改&#xff0c;那么它就是不可变的这个对象不能被修改指&#xff1a; 对象指向(引用)不可变字段不可变成员变量不可变 案列演示&#xff1a; person对象&#xff0c;age和…

我的C++学习笔记

声明&#xff1a; 写本篇博客的目的是为了整理自己在找工作时学习的C相关知识点&#xff0c;博客整体内容会分为两种风格&#xff0c;第一章基础部分是以常见C面试问题解答的形式呈现&#xff1b;其余部分是知识点层层递进的方式展现&#xff0c;比较系统。其中&#xff0c;在第…

Avalon 学习系列(三)—— 数据和指令同步

Avalon 有很多个指令&#xff0c;通过这些指令可以对 DOM 进行一些事件操作、或者样式修改。 ms-duplex Avalon 实现数据与视图的同步的方式是用 ms-duplex 将元素跟数据绑定在一起&#xff0c;如果有其中一个的值改变另一个值也将改变。 ms-duplex 是 avalon 的双向绑定属性…

OpenCV(C++)创建图片绘制图形(矩形、圆、文字、线段等等)

一、OpenCV介绍 OpenCV 是基于开源许可证的跨平台计算机视觉库,提供了一组丰富、广泛的图像处理和计算机视觉算法。OpenCV 支持多种编程语言,包括 C++、Python、Java 等,可以运行在 Linux、Windows、Mac OS 等平台上。 OpenCV 能够在图像上绘制各种几何形状、文本和曲线,…

学习ESP32笔记

学习ESP32笔记 1.platform IO插件的下载&#xff08;提前安装好python&#xff0c;不然在中间的一部分会一直报错&#xff09; VS Code下载platform IO时&#xff0c;开加速器&#xff08;VPN&#xff09;&#xff0c;并且关闭防火墙 这一步比较慢&#xff0c;大概等十来分钟…