原文即图片数据:https://github.com/JiageWang/Note/tree/master/opencv
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)]
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)]
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)]
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)]
dst = cv2.boxFilter(src, ddepth, ksize, normalize=None)
src
:源图像ddepth
:图像深度,一般取-1表示与源图像深度一致ksize
:卷积核大小,例如(N,N)normalize
:是否归一化,若为True,与均值滤波一致,若为False,大于255的值将被置为255dst
:处理结果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)]
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)]
dst = cv2.medianBlur(src, ksize)
src
:源图像ksize
:卷积核大小,奇数整数值,例如3,5,7dst
:处理结果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)]
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)]
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)]
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)]
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或0dy
:计算y方向梯度,传入1或0ksize
:卷积核大小,整数,例如3、5、7dst
:处理结果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)]
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)]
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)]
dst=cv2.Scharr(src, ddepth, dx, dy)
src
:源图像ddepth
:图像深度,一般取-1表示与源图像深度一致。计算梯度值可能会出现负数,会自动截断为0,发生信息丢失。通常计算时,使用更高的数据类型cv2.CV_64F
,再通过cv2.convertScaleAbs(src)
取绝对值并转换为cv2.CV_8U
类型。dx
:计算x方向梯度,传入1或0dy
:计算y方向梯度,传入1或0dst
:处理结果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)]
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)]
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)]
从左到右依次为:原图像、Sobel算子、Scharr算子、Laplacian算子
[外链图片转存失败(img-lDipjCOY-1565772011819)(C:\Users\Administrator\OneDrive\笔记\opencv\compare.jpg)]
原理:高斯滤波去噪+梯度大小与方向+非极大值抑制+滞后阈值
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)]