Opencv图像处理3-边缘检测

图像梯度-Sobel算子

Opencv图像处理3-边缘检测_第1张图片

Opencv图像处理3-边缘检测_第2张图片

img = cv2.imread('pie.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()

def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()


sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3) #水平方向  

cv_show(sobelx,'sobelx')

白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,所以要取绝对值

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)# 取绝对值
cv_show(sobelx,'sobelx')

sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)#垂直方向
sobely = cv2.convertScaleAbs(sobely)  
cv_show(sobely,'sobely')
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
cv_show(sobelxy,'sobelxy')

Opencv图像处理3-边缘检测_第3张图片

不建议直接计算XY方向梯度

sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy) 
cv_show(sobelxy,'sobelxy')

Opencv图像处理3-边缘检测_第4张图片

图像梯度-Scharr算子

Opencv图像处理3-边缘检测_第5张图片

scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)   
scharry = cv2.convertScaleAbs(scharry)  
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 

图像梯度-Laplacian算子

Opencv图像处理3-边缘检测_第6张图片

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

Opencv图像处理3-边缘检测_第7张图片(SOBEL SCHARR LAPLACIAN)

Canny边缘检测-其他算法的提升版本

Canny边缘检测基本思想

- 1) 使用高斯滤波器,以平滑图像,滤除噪声。

- 2) 计算图像中每个像素点的梯度强度和方向。

- 3) 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。  

- 4) 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

- 5) 通过抑制孤立的弱边缘最终完成边缘检测。

Opencv图像处理3-边缘检测_第8张图片

Opencv图像处理3-边缘检测_第9张图片

Opencv图像处理3-边缘检测_第10张图片

线性插值法

1、线性插值法中 C为目标点 确定了梯度模值和方向

2、找寻临近值 并比较 抑制较小值点

3、线性插值 选取临近点求亚像素点

简化方法-  梯度和边界是垂直的

1、直接由梯度方向 在八个方向选择较近的两个点

2、然后比较目标点与临近点梯度值 

Opencv图像处理3-边缘检测_第11张图片

对保留的边界点进行判断筛选

img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)

v1=cv2.Canny(img,80,150)
v2=cv2.Canny(img,50,100)

res = np.hstack((v1,v2))
cv_show(res,'res')


img=cv2.imread("car.png",cv2.IMREAD_GRAYSCALE)
cv_show(img,'img')

img=cv2.imread("car.png",cv2.IMREAD_GRAYSCALE)

v1=cv2.Canny(img,120,250)
v2=cv2.Canny(img,50,100)

res = np.hstack((v1,v2))
cv_show(res,'res')

Opencv图像处理3-边缘检测_第12张图片

你可能感兴趣的:(opencv)