OpenCV常用的函数和操作

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

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值