您现在的位置是:首页 >学无止境 >python cv2的一些操作,如膨胀,画线,滤波等网站首页学无止境

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

岳轩子 2024-10-19 00:01:10
简介python cv2的一些操作,如膨胀,画线,滤波等

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挺简单的,而且方便好用,可以学习一下,用于图像识别是一个很有趣的库。


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


图片

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。