OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测

OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测
© Fu Xianjun. All Rights Reserved.

文章目录

  • 前言
  • 一、学习目标
  • 二、学习内容
    • 1.图像梯度-Sobel算子
    • 2.图像梯度-Scharr算子
    • 3.图像梯度-laplacian算子
    • 4.Canny边缘检测
  • 总结


前言

随着时间的推移,不知不觉的学了很多的东西,今天就让我们来学习OpenCV的图像梯度与Canny边缘检测。


一、学习目标

1.能够理解图像梯度一阶导数和二阶导数的含义
2.能够使用sobel算子与laplacian算子函数进行边缘检测
3.能够掌握Canny边缘检测基本步骤
4.能够使用Canny函数进行边缘检测以及综合应用

二、学习内容

1.图像梯度-Sobel算子

import cv2
import numpy as np
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
img = cv2.imread('yuan.jpg',cv2.IMREAD_GRAYSCALE)
cv_show("yuan",img)

OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测_第1张图片
计算图像x方向边缘:

sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
#因为右侧像素减去左边像素,存在负值的情况,因此使用cv2.convertScaleAbs取绝对值操作
sobelx = cv2.convertScaleAbs(sobelx)
cv_show("sobelx",sobelx)

OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测_第2张图片
计算图像y方向边缘:

sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
#因为下侧像素减去下边像素,存在负值的情况,因此使用cv2.convertScaleAbs取绝对值操作
sobely = cv2.convertScaleAbs(sobely)
cv_show("sobely",sobely)

OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测_第3张图片
合并:

sobel_demo = cv2.addWeighted(sobelx,0.5,sobely,0.5,0.5)
cv_show("sobel_demo",sobel_demo)

OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测_第4张图片

2.图像梯度-Scharr算子

Scharrx = cv2.Scharr(peppa,cv2.CV_64F,1,0)
Scharry = cv2.Scharr(peppa,cv2.CV_64F,0,1)
Scharrx = cv2.convertScaleAbs(Scharrx)
Scharry = cv2.convertScaleAbs(Scharrx)
Scharr_demo = cv2.addWeighted(Scharrx,0.5,Scharry,0.5,0.5)
cv2.imshow("Scharr_demo",Scharr_demo)
cv2.imshow("sobel_demo",sobel_demo)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测_第5张图片

3.图像梯度-laplacian算子

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian) 
cv2.imshow("laplacian_demo",laplacian)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测_第6张图片

4.Canny边缘检测

学习内容:

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

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

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

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

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

v1=cv2.Canny(peppa,80,150)
v2=cv2.Canny(peppa,50,100)
cv2.imshow("v1",v1)
cv2.imshow("v2",v2)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测_第7张图片

import cv2
def doCanny(x):
    position = cv2.getTrackbarPos("CannyBar", "Canny")
    canny = cv2.Canny(gauss, position, position*2.5)
    cv2.imshow("Canny", canny)
    
img = cv2.imread("peppa.png",0)
gauss = cv2.GaussianBlur(img, (3, 3), 1)

cv2.namedWindow("Canny")
cv2.createTrackbar("CannyBar", "Canny", 1, 100, doCanny)
cv2.waitKey()
cv2.destroyAllWindows()

OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测_第8张图片


总结

今天的图像梯度,计算的是图像变化的速度。对于图像的边缘,灰度变化较大,所以梯度值也较大。对于图像之中的平滑部分则反之。
Canny边缘检测则是一种使用多级边缘检测算法检测边缘的方法。
以上所学习的内容要感谢傅老师的教导。

你可能感兴趣的:(OpenCV图像处理技术(Python)——图像梯度与Canny边缘检测)