赞
踩
OpenCV(Open Source Computer Vision Library)是一个广泛应用于计算机视觉任务的开源计算机视觉库。以下是一些常用的OpenCV函数和操作:
一、图像读取和显示:
(1)cv2.imread(): 用于读取图像文件
- img_cat = cv2.imread('cat.jpg')
- img_dog = cv2.imread('dog.jpg')
(2)cv2.imshow(): 用于显示图像。
cv2.imshow('image', img)
(3) cv2.imwrite():用于保存图像到文件。
- import cv2
-
- # 读取图像
- image = cv2.imread('input.jpg')
-
- # 处理图像(这里假设对图像进行了处理)
-
- # 保存图像到文件
- cv2.imwrite('output.jpg', image)
(4) cv2.destroyWindow():用于关闭指定名称的窗口的函数。
- import cv2
-
- # 打开两个窗口并显示图像
- cv2.imshow('Window1', image1)
- cv2.imshow('Window2', image2)
-
- # 关闭特定窗口
- cv2.destroyWindow('Window1')
(5) cv2.destroyAllWindows():用于关闭所有通过OpenCV打开的窗口的函数。
- import cv2
-
- # 打开一个窗口并显示图像
- cv2.imshow('Window', image)
-
- # 在某个条件下关闭所有窗口
- if condition:
- cv2.destroyAllWindows()
二、 图像阈值:
(1)ret, dst = cv2.threshold(src, thresh, maxval, type)
src: 输入图,只能输入单通道图像,通常来说为灰度图
dst: 输出图
thresh: 阈值
maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
type:二值化操作的类型,包含以下5种类型:
(1)cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
(2)cv2.THRESH_BINARY_INV THRESH_BINARY的反转
(3)cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
(4)cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
(5)cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转
- import cv2
- import matplotlib.pyplot as plt
- img=cv2.imread('cat.jpg')
- img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
- ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
- ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
- ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
- ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)
-
- titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
- images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
-
- for i in range(6):
- plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
- plt.title(titles[i])
- plt.xticks([]), plt.yticks([])
- plt.show()

三、图像平滑:
图像平滑是一种图像处理技术,用于减少图像中的噪声、去除细节,使图像更加模糊或柔和。这种技术对于许多视觉计算机和图像处理任务非常有用,例如消除图像中的噪声、模糊边缘、改善图像质量等。
(1)均值滤波 cv2.blur()
- # 均值滤波
- # 简单的平均卷积操作
- blur = cv2.blur(img, (3, 3))
-
- cv2.imshow('blur', blur)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
(2) 方框滤波 cv2.boxFilter()
- # 方框滤波
- # 基本和均值一样,可以选择归一化
- box = cv2.boxFilter(img,-1,(3,3), normalize=True)
-
- cv2.imshow('box', box)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
(3) 高斯滤波 cv2.GaussianBlur()
- # 高斯滤波
- # 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
- aussian = cv2.GaussianBlur(img, (5, 5), 1)
-
- cv2.imshow('aussian', aussian)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
(4) 中值滤波 cv2.medianBlur()
- # 相当于用中值代替
- median = cv2.medianBlur(img, 5) # 中值滤波
-
- cv2.imshow('median', median)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
四、 颜色空间转换:
(1)cv2.cvtColor():用于图像颜色空间的转换,如从BGR到灰度或从BGR到HSV。
- import cv2
-
- # 读取图像
- image = cv2.imread('input.jpg')
-
- # 将图像从BGR颜色空间转换为灰度颜色空间
- gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
-
- # 将图像从BGR颜色空间转换为HSV颜色空间
- hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
五、 图像处理:
(1)cv2.resize():用于调整图像大小。
- img_cat = cv2.resize(img_cat, (499,429))
- print(img_cat.shape)
(2)cv2.Canny(): 用于边缘检测
1) 使用高斯滤波器,以平滑图像,滤除噪声。
2) 计算图像中每个像素点的梯度强度和方向。
3) 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
4) 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
5) 通过抑制孤立的弱边缘最终完成边缘检测。
- import cv2
-
- # 读取图像
- image = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE) # 将图像以灰度方式读取
-
- # 使用Canny边缘检测算法
- edges = cv2.Canny(image, threshold1, threshold2)
-
- # 第一个参数是输入图像,通常是灰度图像。
- # 第二个参数threshold1是低阈值maxVal,用于边缘强度的下限。
- # 第三个参数threshold2是高阈值minVal,用于边缘强度的上限
(3)cv2.threshold()
:用于图像二值化。
- import cv2
-
- # 读取灰度图像
- image = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)
-
- # 设定阈值,将图像分为前景和背景
- threshold_value = 128 # 阈值
- retval, thresholded_image = cv2.threshold(image, threshold_value, max_value, threshold_type)
(4)cv2.warpAffine()
:用于图像的仿射变换。
五、形态学操作:
(1)cv2.erode()
:用于腐蚀图像。
- import cv2
- img = cv2.imread('dige.png')
- kernel = np.ones((3,3),np.uint8)
- erosion = cv2.erode(img,kernel,iterations = 1)
- cv2.imshow('erosion', erosion)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
(2)cv2.dilate()
:用于膨胀图像。
- kernel = np.ones((3,3),np.uint8)
- dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
-
- cv2.imshow('dilate', dige_dilate)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
(3)cv2.morphologyEx()
:用于更复杂的形态学操作,如开运算和闭运算,礼帽和黑帽,梯度运算。
- # 开:先腐蚀,再膨胀
- img = cv2.imread('dige.png')
-
- kernel = np.ones((5,5),np.uint8)
- opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
-
- cv2.imshow('opening', opening)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- # 闭:先膨胀,再腐蚀
- img = cv2.imread('dige.png')
-
- kernel = np.ones((5,5),np.uint8)
- closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
-
- cv2.imshow('closing', closing)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- # 梯度运算(梯度=膨胀-腐蚀)
- pie = cv2.imread('pie.png')
- kernel = np.ones((7,7),np.uint8)
- gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
- cv2.imshow('gradient', gradient)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- # 礼帽 = 原始输入-开运算结果
- #礼帽
- img = cv2.imread('dige.png')
- tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
- cv2.imshow('tophat', tophat)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- # 黑帽 = 闭运算-原始输入
- #黑帽
- img = cv2.imread('dige.png')
- blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
- cv2.imshow('blackhat ', blackhat )
- cv2.waitKey(0)
- cv2.destroyAllWindows()
六、 轮廓检测:
(1) cv2.findContours()
:用于检测图像中的轮廓。
- import cv2
- # 读取图像
- image = cv2.imread('input.jpg')
- # 将图像转换为灰度
- gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
- # 查找图像中的轮廓
- contours, hierarchy = cv2.findContours(gray_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- # cv2.findContours()函数参数包括:
- # 第一个参数是输入图像,通常是灰度图像。
- # 第二个参数是检索模式,它定义了如何检索。常见的选项包括:
- # (1)cv2.RETR_EXTERNAL:仅检测外部。
- # (2)cv2.RETR_LIST:检测所有单一,不建立层次关系。
- # (3)cv2.RETR_CCOMP:检测所有的,建立两层的层次关系。
- # (4)cv2.RETR_TREE:检测所有的,建立完整的层次关系树。
- # 第三个参数是虚构的近方法,它定义了如何表示虚构的点。常见的选项包括:
- # (1)cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线段,仅保留它们的端点。
- # (2)cv2.CHAIN_APPROX_NONE:保留所有单一点。
- # 函数的返回值包括两个:
- # (1)contours是一个包含检测到的自定义的列表,每个都是一个点坐标的列表。
- # (2)hierarchy是一个层次的信息,它表示之间的关系。

(2) cv2.drawContours(): 绘制轮廓
图像代码首先使用cv2.imread()
读取一个图像文件(例如,'input.jpg'),然后将图像转换为灰度图像,因为通常是在灰度图像上进行检测。接下来,使用函数查找图像中的转换cv2.findContours()
。最后,cv2.drawContours()
在原始图像上使用函数来计算这些相似值。
- import cv2
- # 读取图像
- image = cv2.imread('input.jpg')
- # 将图像转换为灰度
- gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
- # 查找图像中的轮廓
- contours, _ = cv2.findContours(gray_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- # 在图像上绘制轮廓
- cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
- # cv2.drawContours()函数参数包括:
- #
- # 第一个参数是目标图像,这里是原始图像。
- # 第二个参数是列表,它包含了要不同的单独。
- # 第三个参数是抽象的索引,如果设置为-1,则将不同的所有检测到抽象的。
- # 第四个参数是自定义的颜色。
- # 第五个参数是相似的线宽。

七、绘图函数:
(1)cv2.line()
:绘制直线。
(2)cv2.rectangle()
:绘制矩形。
(3)cv2.circle()
:绘制圆。
(4)cv2.putText()
:在图像上绘制文本。
八、计算机视觉:
(1)cv2.CascadeClassifier()
:用于对象检测,如人脸检测。
(2)cv2.calcHist()
:用于图像直方图的计算。
九、视频处理:
(1)cv2.VideoCapture()
:用于捕获视频。
- vc = cv2.VideoCapture('test.mp4')
- if vc.isOpened():
- open, frame = vc.read()
- else:
- open = False
- while open:
- ret, frame = vc.read()
- if frame is None:
- break
- if ret == True:
- gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
- cv2.imshow('result',gray)
- if cv2.waitKey(10) & 0XFF == 27:
- break
- vc.release()
- cv2.destroyAllWindows()

(2) cv2.VideoWriter()
:用于保存视频。
十、特征检测和匹配:
(1)cv2.SIFT()
:用于检测关键点和计算SIFT特征。
(2)cv2.matchTemplate()
:用于模板匹配。
十一、图像混合和融合:
(1)cv2.add()
:用于图像加法。
(2)cv2.addWeighted()
:用于图像权重相加。
- import cv2
-
- # 读取两幅图像
- image1 = cv2.imread('image1.jpg')
- image2 = cv2.imread('image2.jpg')
-
- # 设置权重参数
- alpha = 0.5
- beta = 0.5
- gamma = 0
-
- # 执行加权叠加
- result = cv2.addWeighted(image1, alpha, image2, beta, gamma)
- # src1:第一幅输入图像。
- # alpha:第一幅输入图像的权重,通常是一个浮点数。
- # src2:第二幅输入图像。
- # beta:第二幅输入图像的权重,通常是一个浮点数。
- # gamma:加到结果图像上的标量值。通常用于调整图像的亮度。
- # dst:输出图像,与输入图像具有相同的大小和深度。
- # dtype(可选):输出图像的数据类型,通常使用默认值 cv2.CV_64F 或 -1
-
- # 显示结果图像
- cv2.imshow('Blended Image', result)
- cv2.waitKey(0)
- cv2.destroyAllWindows()

这些只是OpenCV库中的一些常见函数和操作。OpenCV提供了大量的功能,适用于各种计算机视觉和图像处理任务。你可以根据具体的需求查阅OpenCV的文档并使用适当的函数来完成你的项目。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。