别人没那么重要,我也没那么重要,好好活着,把能做的小事做好,够不到的东西就放弃,承认就好。做一个心情好能睡着的人,你所有事情都会在正轨上。

PythonOpenCV-边缘和轮廓-边缘检测

0. 简介

  图像的边缘是指图像中灰度值发生急剧变化的位置,边缘检测的目的是为了绘制出边缘线条。

  边缘通常是不连续的,不能表示整体。

  边缘检测结果通常为黑白图像,图像中的白色线条表示边缘。

  常见的边缘检测算法有 Laplacian边缘检测、Sobel 边缘检测和 Canny 边缘检测等。

 

1.  Laplacian边缘检测

  Laplacian(拉普拉斯)边缘检测使用图像矩阵与拉普拉斯核进行卷积运算,其质是计算图像中任意一点与其在水平方向和垂直方向上4个相邻点平均值的差值。

  常用的拉普拉斯核如下:

  cv2.Laplacian()函数用于实现 Laplacian 边缘检测,其基本格式如下:

dst = cv2.Laplacian(src, ddepth[, ksize[, scale[, delta[, borderType]]]])

  参数说明:

dst:边缘检测结果图像

src:原图像

ddepth:目标图像的深度

ksize:用于计算二阶导数滤波器的系数,必须为正数且为奇数

scale:可选比例因子

delta:添加到边缘检测结果中的可选增量值

borderType:边界值类型

  代码示例:

import cv2 as cv
import numpy as np

img_src = cv.imread('./Pictures/opencvlog.jpg')
cv.imshow('src', img_src)
img_dst = cv.Laplacian(img_src, cv.CV_8U)
cv.imshow('dst', img_dst)
cv.waitKey(0)

  运行结果:

 

2. Sobel 边缘检测

  Sobel 边缘检测将高斯滤波和微分结合起来执行图像卷积运算,其结果具有定的抗噪性。

  cv2.Sobel()函数用于实现 Sobel边缘检测,其基本格式如下:

dst = cv2.Sobel(src, depth, dx, dy[, ksize[, scale[, delta[,  borderType]]]])

  参数说明:

dst:边缘检测结果图像

src:原图像

ddepth:目标图像的深度

dx:导数X的阶数

dy:导数y的阶数

ksize:扩展的 Sobel 内核的大小,必须是 1、3、5或7

scale :计算导数的可选比例因子

delta:添加到边缘检测结果中的可选增量值

borderType:边界值类型

  代码示例:

import cv2 as cv
import numpy as np

img_src = cv.imread('./Pictures/opencvlog.jpg')
cv.imshow('src', img_src)
img_dst = cv.Sobel(img_src, cv.CV_8U, 0, 1)
cv.imshow('dst', img_dst)
cv.waitKey(0)

  运行结果:

 

3. Canny边缘检测

  Laplacian 边缘检测和 Sobel 边缘检测都是通过卷积运算来计算边缘,它们的算法比较简单,因此结果可能会损失过多的边缘信息或有很多的噪声。

  Canny边缘检测的算法更复杂,它包含下列 5 个步骤:

  1. 使用高斯滤波去除图像噪声
  2. 使用 Sobel 核进行滤波,计算梯度
  3. 在边缘使用非最大值抑制
  4. 对检测出的边缘使用双闯值以去除假阳性
  5. 分析边缘之间的连接性,保留真正的边缘,消除不明显的边缘

  cv2.Canny0函数用于实现 Canny 边缘检测,其基本格式如下:

dst = cv2.Canny(src, threshold1, threshold2[, apertureSize[, L2gradient]])

  参数说明:

dst:边缘检测结果图像

src:原图像

threshold1:第 1 阈值

threshold2:第2 阈值

apertureSize:计算梯度时使用的 Sobel 核大小

L2gradient:标志。

  代码示例:

import cv2 as cv
import numpy as np

img_src = cv.imread('./Pictures/opencvlog.jpg')
cv.imshow('src', img_src)
img_dst = cv.Canny(img_src, 100, 200)
cv.imshow('dst', img_dst)
cv.waitKey(0)

  运行结果:

 

 

/*-------------------------------------------------------------------------------------------------------

笔者说明:

  该笔记来源于本人学习Python + OpenCv时的资料,

  分享出来只是为了供大家学习,并且为了自己以后想要用的时候方便寻找。

时间:2023年8月22日

------------------------------------------------------------------------------------------------------------*/

posted @ 2023-08-22 16:26  一路狂奔的乌龟  阅读(349)  评论(0)    收藏  举报
返回顶部