Opencv-python 常用操作函数速查笔记

原文即图片数据:https://github.com/JiageWang/Note/tree/master/opencv

一、阈值操作

1. 阈值处理 cv2.threshold()

ret, dst = cv2.threshold(src, thresh, maxval, method)

函数参数

  • src:原图像

  • thresh:阈值

  • maxval:阈值分割后得到图像的最大值

  • method:操作方法,主要有以下六种,可使用|操作符叠加使用

    • cv2.THRESH_BINARY:二进制阈值化,大于thresh元素处理为maxval,其余为0

      [外链图片转存失败(img-gTHTlvdE-1565772011808)(C:\Users\Administrator\OneDrive\笔记\opencv\Threshold_Tutorial_Theory_Binary.png)]

    • cv2.THRESH_BINARY_INV:反二进制阈值化,小于thresh元素处理为maxval,其余为0

      [外链图片转存失败(img-Qd9W2Xzv-1565772011810)(C:\Users\Administrator\OneDrive\笔记\opencv\Threshold_Tutorial_Theory_Binary_Inverted.png)]

    • cv2.THRESH_TOZERO:阈值化为0,小于thresh元素处理为0,其余不变

      [外链图片转存失败(img-c6XUamQO-1565772011810)(C:\Users\Administrator\OneDrive\笔记\opencv\Threshold_Tutorial_Theory_Zero.png)]

    • cv2.THRESH_TOZERO_INV:反阈值化为0,大于thresh元素处理为0,其余不变

      [外链图片转存失败(img-rvkeuIMV-1565772011811)(C:\Users\Administrator\OneDrive\笔记\opencv\Threshold_Tutorial_Theory_Zero_Inverted.png)]

    • cv2.THRESH_TRUNC:截断阈值化,大于thresh部分处理为thresh,其余不变

      [外链图片转存失败(img-jm5QEuh2-1565772011811)(C:\Users\Administrator\OneDrive\笔记\opencv\Threshold_Tutorial_Theory_Truncate.png)]

    • cv2.THRESH_OTSU:大津算法,自适应阈值,将thresh设置为0

返回值

  • ret:返回阈值
  • dst:处理结果

实例效果

二进制阈值化
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
ret, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

[外链图片转存失败(img-LVA4XXOf-1565772011812)(C:\Users\Administrator\OneDrive\笔记\opencv\binary.jpg)]

反二进制阈值化
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
ret, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)

[外链图片转存失败(img-a020TbiC-1565772011812)(C:\Users\Administrator\OneDrive\笔记\opencv\binary_inv.jpg)]

阈值化为0
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
ret, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)

[外链图片转存失败(img-N7UM2hhs-1565772011812)(C:\Users\Administrator\OneDrive\笔记\opencv\tozero.jpg)]

反阈值化为0
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
ret, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)

[外链图片转存失败(img-vr9xaAIF-1565772011813)(C:\Users\Administrator\OneDrive\笔记\opencv\tozero_inv.jpg)]

截断阈值化
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
ret, dst = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)

[外链图片转存失败(img-tAtE5Tzy-1565772011813)(C:\Users\Administrator\OneDrive\笔记\opencv\trunc.jpg)]

自适应阈值化
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
ret, dst = cv2.threshold(img, 127, 255, cv2.THRESH_OSTU)

[外链图片转存失败(img-DGgaFXYT-1565772011813)(C:\Users\Administrator\OneDrive\笔记\opencv\ostu.jpg)]

二、平滑处理

1. 均值滤波 cv2.blur()

dst = cv2.blur(src, ksize)

函数参数

  • src:源图像
  • ksize:卷积核大小,例如(N,N)

返回值

  • dst:处理结果

实例效果

img = cv2.imread('lena.jpg')
dst1 = cv2.blur(img, (3,3))  # kernal 为3x3
dst2 = cv2.blur(img, (7,7))  # kernal 为7x7
result = np.hstack((img, dst1, dst2))

[外链图片转存失败(img-eqBsCswi-1565772011814)(C:\Users\Administrator\OneDrive\笔记\opencv\blur.jpg)]

2. 方框滤波 cv2.boxFilter()

dst = cv2.boxFilter(src, ddepth, ksize, normalize=None)

函数参数

  • src:源图像
  • ddepth:图像深度,一般取-1表示与源图像深度一致
  • ksize:卷积核大小,例如(N,N)
  • normalize:是否归一化,若为True,与均值滤波一致,若为False,大于255的值将被置为255

返回值

  • dst:处理结果

实例效果

img = cv2.imread('lena.jpg')
dst1 = cv2.boxFilter(img, -1, (3,3), normalize=True)  # 进行归一化,与均值滤波相同
dst2 = cv2.boxFilter(img, -1, (3,3), normalize=False)  # 不进行归一化
result = np.hstack((img, dst1, dst2))

[外链图片转存失败(img-q12kE0mA-1565772011814)(C:\Users\Administrator\OneDrive\笔记\opencv\boxFilter.jpg)]

3. 高斯滤波 cv2.GaussianBlur()

dst = cv2.GaussianBlur(src, ksize, sigmaX)

函数参数

  • src:源图像
  • ksize:卷积核大小,例如(N,N)
  • sigmaX:X方向方差,控制卷积核权重

返回值

  • dst:处理结果

实例效果

img = cv2.imread('lena.jpg')
dst1 = cv2.GaussianBlur(img, (3,3), 0)  # kernal 为3x3
dst2 = cv2.GaussianBlur(img, (7,7), 0)  # kernal 为7x7
result = np.hstack((img, dst1, dst2))

[外链图片转存失败(img-wkpT9ck5-1565772011814)(C:\Users\Administrator\OneDrive\笔记\opencv\gaussianBlur.jpg)]

4. 中值滤波 cv2.medianBlur()

dst = cv2.medianBlur(src, ksize)

函数参数

  • src:源图像
  • ksize:卷积核大小,奇数整数值,例如3,5,7

返回值

  • dst:处理结果

实例效果

img = cv2.imread('lena.jpg')
dst1 = cv2.medianBlur(img, 3)  # 核大小为3
dst2 = cv2.medianBlur(img, 7)  # 核大小为7
result = np.hstack((img, dst1, dst2))

[外链图片转存失败(img-WkUNTGkf-1565772011815)(C:\Users\Administrator\OneDrive\笔记\opencv\medianblur.jpg)]

三、形态学操作

1. 腐蚀 cv2.erode()

dst = cv2.erode(src, kernel, iterations=None)

函数参数

  • src:源图像
  • kernal:卷积核,常用cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))np.ones((5,5))来获取
  • iterations:进行腐蚀操作次数

返回值

  • dst:处理结果

实例效果

img = cv2.imread('lena.jpg')
kernal = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
dst = cv2.erode(img, kernal)
result = np.hstack((img, dst))

[外链图片转存失败(img-Z81ukSQO-1565772011815)(C:\Users\Administrator\OneDrive\笔记\opencv\erode.jpg)]

2. 膨胀 cv2.dilate()

dst = cv2.dilate(src, kernel, iterations=None)

函数参数

  • src:源图像
  • kernal:卷积核,常用cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))np.ones((5,5))来获取
  • iterations:进行腐蚀操作次数

返回值

  • dst:处理结果

实例效果

kernal = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
dst = cv2.dilate(img, kernal)
result = np.hstack((img, dst))

[外链图片转存失败(img-W4ut2hOO-1565772011815)(C:\Users\Administrator\OneDrive\笔记\opencv\dilate.jpg)]

3. 组合 cv2.morphologyEx()

dst = morphologyEx(src, op, kernel)

函数参数

  • src:源图像
  • op:操作类别,常用:
    • cv2.MORPH_CLOSE:闭操作,先膨胀后腐蚀
    • cv2.MORPH_OPEN:开操作,先腐蚀后膨胀
    • cv2.MORPH_TOPHAT:顶貌操作,原图与开运算结果图之差
    • cv2.MORPH_BLACKHAT:黑帽操作,闭运算的结果与原图之差
    • cv2.MORPH_GRADIENT:形态梯度,膨胀与腐蚀之差
  • iterations:进行腐蚀操作次数

返回值

  • dst:处理结果

实例效果

闭操作

先膨胀后腐蚀,目的是为了填充小的黑色区域

kernal = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dst1 = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernal)

[外链图片转存失败(img-6WNTbnRj-1565772011815)(C:\Users\Administrator\OneDrive\笔记\opencv\close.jpg)]

开操作

先腐蚀后膨胀,目的是为了去除小的白色区域,去噪声去毛刺

kernal = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dst1 = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernal)

[外链图片转存失败(img-IjZuJzB3-1565772011816)(C:\Users\Administrator\OneDrive\笔记\opencv\open.jpg)]

顶貌操作

原图与开运算结果图之差,用来分离比邻近点亮一些的斑块,得到噪声,得到亮的部分

kernal = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
dst1 = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernal)
dst2 = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernal)

[外链图片转存失败(img-82bHa9Qi-1565772011816)(C:\Users\Administrator\OneDrive\笔记\opencv\tophat.jpg)]

黑帽操作

闭运算的结果与原图之差,用来分离比邻近点暗一些的斑,获取图像内部的小点,获暗的部分

kernal = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))
dst1 = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernal)
dst1 = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernal)

[外链图片转存失败(img-mQMNkeeF-1565772011816)(C:\Users\Administrator\OneDrive\笔记\opencv\blackhat.jpg)]

形态梯度

膨胀与腐蚀之差,获取边缘特征

kernal = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst1 = cv2.morphologyEx(src, cv2.cv2.MORPH_GRADIENT, kernal)

[外链图片转存失败(img-evfzPFqo-1565772011817)(C:\Users\Administrator\OneDrive\笔记\opencv\gradient.jpg)]

四、梯度操作

1. Sobel算子 cv2.Sobel()

dst=cv2.Sobel(src, ddepth, dx, dy, ksize=None)

函数参数

  • src:源图像
  • ddepth:图像深度,一般取-1表示与源图像深度一致。计算梯度值可能会出现负数,会自动截断为0,发生信息丢失。通常计算时,使用更高的数据类型cv2.CV_64F,再通过cv2.convertScaleAbs(src)取绝对值并转换为cv2.CV_8U类型。
  • dx:计算x方向梯度,传入1或0
  • dy:计算y方向梯度,传入1或0
  • ksize:卷积核大小,整数,例如3、5、7

返回值

  • dst:处理结果

实例效果

x方向梯度
sobelx1 = cv2.Sobel(src, -1, 1, 0, ksize=3)  # 只计算黑到白的梯度
sobelx2 = cv2.Sobel(src, cv2.CV_64F, 1, 0, ksize=3)  # 使用更高的数据类型`cv2.CV_64F
sobelx2 = cv2.convertScaleAbs(sobelx2)  #求绝对值获取双边梯度

[外链图片转存失败(img-PdDTUnvT-1565772011817)(C:\Users\Administrator\OneDrive\笔记\opencv\sobel_x.jpg)]

y方向梯度
sobely1 = cv2.Sobel(src, -1, 0, 1, ksize=3)  # 只计算黑到白的梯度
sobely2 = cv2.Sobel(src, cv2.CV_64F, 0, 1, ksize=3)  # 使用更高的数据类型`cv2.CV_64F
sobely2 = cv2.convertScaleAbs(sobely2)  #求绝对值获取双边梯度

[外链图片转存失败(img-pyroZ7u9-1565772011817)(C:\Users\Administrator\OneDrive\笔记\opencv\sobel_y.jpg)]

总梯度
  • 方法一:分别计算x与y梯度然后相加
sobelx = cv2.Sobel(src, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(src, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)

[外链图片转存失败(img-QH4SyLpQ-1565772011818)(C:\Users\Administrator\OneDrive\笔记\opencv\sobel_xy.jpg)]

  • 方法二:直接计算总梯度
sobelxy = cv2.Sobel(src, cv2.CV_64F, 1, 1, ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)

[外链图片转存失败(img-YUZrJ8PG-1565772011818)(C:\Users\Administrator\OneDrive\笔记\opencv\sobel_xy2.jpg)]

2. Scharr算子 cv2.Scharr()

dst=cv2.Scharr(src, ddepth, dx, dy)

函数参数

  • src:源图像
  • ddepth:图像深度,一般取-1表示与源图像深度一致。计算梯度值可能会出现负数,会自动截断为0,发生信息丢失。通常计算时,使用更高的数据类型cv2.CV_64F,再通过cv2.convertScaleAbs(src)取绝对值并转换为cv2.CV_8U类型。
  • dx:计算x方向梯度,传入1或0
  • dy:计算y方向梯度,传入1或0

返回值

  • dst:处理结果

实例效果

x方向梯度
scharrx1 = cv2.Scharr(src, -1, 1, 0)  # 只计算黑到白的梯度
scharrx2 = cv2.Scharr(src, cv2.CV_64F, 1, 0)  # 使用更高的数据类型`cv2.CV_64F
scharrx2 = cv2.convertScaleAbs(scharrx2)  #求绝对值获取双边梯度

[外链图片转存失败(img-DJYFSfKN-1565772011818)(C:\Users\Administrator\OneDrive\笔记\opencv\scharr_x.jpg)]

y方向梯度
scharry1 = cv2.Scharr(src, -1, 0, 1)  # 只计算黑到白的梯度
scharry2 = cv2.Scharr(src, cv2.CV_64F, 0, 1)  # 使用更高的数据类型`cv2.CV_64F
scharry2 = cv2.convertScaleAbs(scharry2)  #求绝对值获取双边梯度

[外链图片转存失败(img-yGSpfCuC-1565772011818)(C:\Users\Administrator\OneDrive\笔记\opencv\scharr_y.jpg)]

总梯度
scharrx = cv2.Scharr(src, cv2.CV_64F, 1, 0)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.Scharr(src, cv2.CV_64F, 0, 1)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)

[外链图片转存失败(img-xGfEnEE5-1565772011818)(C:\Users\Administrator\OneDrive\笔记\opencv\scharr_xy.jpg)]

3. Laplacian算子 cv2. Laplacian()

dst=cv2.Laplacian(src, ddepth)

函数参数

  • src:源图像
  • ddepth:图像深度,一般取-1表示与源图像深度一致。计算梯度值可能会出现负数,会自动截断为0,发生信息丢失。通常计算时,使用更高的数据类型cv2.CV_64F,再通过cv2.convertScaleAbs(src)取绝对值并转换为cv2.CV_8U类型。

返回值

  • dst:处理结果

实例效果

laplacian = cv2.Laplacian(src, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

[外链图片转存失败(img-yKUTjXdV-1565772011819)(C:\Users\Administrator\OneDrive\笔记\opencv\laplacian_xy.jpg)]

4. 各算子对比

从左到右依次为:原图像、Sobel算子、Scharr算子、Laplacian算子

[外链图片转存失败(img-lDipjCOY-1565772011819)(C:\Users\Administrator\OneDrive\笔记\opencv\compare.jpg)]

五、边缘检测

1. Canny边缘检测 cv2.Canny()

原理:高斯滤波去噪+梯度大小与方向+非极大值抑制+滞后阈值

dst = Canny(src, threshold1, threshold2)

函数参数

  • src:源图像

  • threshold1:滞后阈值的低阈值

  • threshold2:滞后阈值的高阈值

    [外链图片转存失败(img-W4CSYR7e-1565772011819)(C:\Users\Administrator\OneDrive\笔记\opencv\滞后阈值.png)]

返回值

  • dst:处理结果

实例效果

thred1 = [50, 100, 150]
thred2 = [50, 100, 150]
for t1 in thred1:    
	for t2 in thred2:        
		dst = cv2.Canny(src, t1, t2)

[外链图片转存失败(img-8oUApdFH-1565772011819)(C:\Users\Administrator\OneDrive\笔记\opencv\canny_lena.jpg)]

你可能感兴趣的:(教程,opencv,python,函数速查)