python cv2的一些操作,如膨胀,画线,滤波等
用python中cv2库,对图像进行处理,打开摄像头,比如膨胀腐蚀,二值化,在图内画线画圆圈,这都是很有意思的,还有对图像进行匹配等。
0. cv2简介
在这里先简单介绍一下cv2吧。
- cv2 是 OpenCV Python 库的主要模块,提供了许多图像处理和计算机视觉方面的函数和工具。使用 cv2 可以对图像进行读取、保存、处理、显示等操作,同时也提供了许多计算机视觉方面的算法和函数,如特征检测、对象跟踪、图像分割等。
- cv2 中一些常用的函数和工具包括:
- cv2.imread():读取图像文件。
- cv2.imshow():显示图像。
- cv2.imwrite():保存图像到文件。
- cv2.cvtColor():将图像从一种颜色空间转换为另一种。
- cv2.resize():调整图像大小。
- cv2.threshold():对图像应用阈值。
- cv2.findContours():查找图像中的轮廓。
- cv2.matchTemplate():在图像中查找模板。
- cv2.VideoCapture():捕获视频帧。
- cv2.VideoWriter():将视频帧写入文件。
- 除此之外,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 库中的函数,用于对图像进行滤波处理。 常用的滤波函数包括:
- cv2.blur(src, ksize[, dst[, anchor[, borderType]]]):均值滤波。将每个像素的值设置为其周围像素的平均值。
- cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]):高斯滤波。将每个像素的值设置为其周围像素的加权平均值,权重取决于它们到中心像素的距离,距离越远的像素权重越小。
- cv2.medianBlur(src, ksize[, dst]):中值滤波。将每个像素的值设置为其周围像素的中值,即排序后的中间值。
- 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()
运行结果:
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()
运行结果:
cv2 中的膨胀(dilate)和腐蚀(erode)是图像处理中基本的形态学操作,它们主要用于对二值图像进行处理,可以用于去除图像中的噪声、填补图像中的空洞、分离图像中的物体等。
- 膨胀操作将图像中的边缘区域扩张,使得图像中的白色区域增大。具体来说,对于图像中的每个像素,如果其周围存在至少一个白色像素,则该像素被认为是白色的;否则,该像素被认为是黑色的。膨胀的过程可以使用一个结构元素(kernel)来控制,结构元素可以是任意形状的矩阵,通常是一个正方形或圆形。
- 腐蚀操作与膨胀相反,将图像中的边缘区域收缩,使得图像中的白色区域减小。具体来说,对于图像中的每个像素,如果其周围所有像素都是白色,则该像素被认为是白色的;否则,该像素被认为是黑色的。腐蚀的过程也可以使用一个结构元素来控制。
- 膨胀和腐蚀操作可以组合使用,也可以多次重复执行,以达到不同的效果。例如,先进行膨胀操作,然后再进行腐蚀操作,可以去除图像中的小孔和毛刺;而先进行腐蚀操作,然后再进行膨胀操作,可以填补图像中的空洞和裂缝。
- 膨胀和腐蚀操作在图像处理中的应用非常广泛,例如在数字图像处理中,可以用于二值化、边缘检测、形态学分析等方面。
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()
运行结果:
cv2的二值化作用与原理:
- cv2 中的二值化(thresholding)是一种常用的图像预处理方法,用于将灰度图像转换为二值图像,即只有黑白两种颜色的图像。二值化可以使图像中的信息更加简洁明了,便于后续的图像处理和分析。
- 二值化的原理是将灰度图像中的像素值进行阈值处理,将大于或等于阈值的像素设为白色,小于阈值的像素设为黑色。在 cv2 中,可以使用 cv2.threshold() 函数进行二值化处理,其参数包括输入图像、设定的阈值、像素值的最大值、二值化的类型等。
cv2的阈值解释和参数:
- cv2 中的阈值(threshold)是一种常用的图像处理操作,用于将图像中的像素值转换为二进制形式,即只有 0 和 1 两种状态,以实现图像分割、边缘检测等目的。
- 阈值可以限制图像中像素值的范围,从而达到筛选出感兴趣区域的作用。在 cv2 中,可以使用 cv2.threshold() 函数进行阈值处理,其参数包括输入图像、设定的阈值、像素值的最大值、阈值处理的类型等。
- 阈值处理的类型有以下几种:
- cv2.THRESH_BINARY:大于阈值的像素设为最大值,小于阈值的像素设为 0。
- cv2.THRESH_BINARY_INV:大于阈值的像素设为 0,小于阈值的像素设为最大值。
- cv2.THRESH_TRUNC:大于阈值的像素设为阈值,小于阈值的像素不变。
- cv2.THRESH_TOZERO:大于阈值的像素不变,小于阈值的像素设为 0。
- cv2.THRESH_TOZERO_INV:大于阈值的像素设为 0,小于阈值的像素不变。
10. 总结
其实cv2挺简单的,而且方便好用,可以学习一下,用于图像识别是一个很有趣的库。
最后我把我用的那个图片放在这里吧,欢迎大家在评论区交流学习!!!
更多推荐
所有评论(0)