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的文档并使用适当的函数来完成你的项目。