马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
目录
前言
一、图像边沿检测
1.边沿检测
2.边沿检测的方法
二、Sobel算子
1.Sobel算子
2.计算
3.代码实现
4.代码步骤剖析
1.导入图片
2.处理x轴和y轴的边沿并相加
三、Scharr算子
1.Scharr算子
2.计算
3.代码实现
四、Laplacian算子
1.Laplacian算子
2.计算
3.代码实现
五、Canny边沿检测算法
1.Canny
2.计算
3.代码实现
总结
前言
本篇将介绍图像边沿检测的Sobel、Scharr和Laplacian算子以及Canny边沿检测算法及其效果。
一、图像边沿检测
1.边沿检测
是图形图像处理、计算机视觉和机器视觉中的一个根本工具,通常用于特性提取和特性检测,旨在检测一张数字图像中有明显变化的边沿或者不连续的区域。
2.边沿检测的方法
二、Sobel算子
1.Sobel算子
Sobel 算子是一种离散的微分算子,该算子结合了高斯平滑和微分求导运算。该算子利用局部差分寻找边沿,计算所得的是一个梯度的近似值。
2.计算
计算过程简朴的来说就是x轴放箱费和y轴方向各一个矩阵,对图像的所有像素点做卷积操作寻找梯度
3.代码实现
完整代码:
- import cv2
- """Sobel算子"""
- yuan = cv2.imread('../yuan.png')
- cv2.imshow('yuan', yuan)
- cv2.waitKey(0)
- '''x方向上的边缘'''
- # 右端为负值 显示不出来
- yuan_x_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=1, dy=0)
- cv2.imshow('yuan_x_64', yuan_x_64)
- cv2.waitKey(0)
- # 进行取绝对值操作即可
- yuan_x_full = cv2.convertScaleAbs(yuan_x_64)
- cv2.imshow('yuan_x_full', yuan_x_full)
- cv2.waitKey(0)
- '''y方向上的边缘'''
- # y的下端为负值 显示不出来
- # 进行取绝对值操作即可
- yuan_y_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=0, dy=1)
- yuan_y_full = cv2.convertScaleAbs(yuan_y_64)
- cv2.imshow('yuan_y_full', yuan_y_full)
- cv2.waitKey(0)
- '''使用加权运算组合图像得到完整边缘'''
- yuan_xy_full = cv2.addWeighted(yuan_x_full, 1, yuan_y_full, 1, 10)
- cv2.imshow('yuan_xy_full', yuan_xy_full)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- """使用彩色图获取边缘"""
- zrn = cv2.imread('../zrn.jpg', cv2.IMREAD_GRAYSCALE)
- zrn = cv2.resize(zrn, (400, 400))
- x = cv2.Sobel(zrn, cv2.CV_64F, dx=1, dy=0)
- y = cv2.Sobel(zrn, cv2.CV_64F, dx=0, dy=1)
- x_full = cv2.convertScaleAbs(x)
- y_full = cv2.convertScaleAbs(y)
- xy = cv2.addWeighted(x_full, 1, y_full, 1, 0)
- cv2.imshow('zrn_Sobel', xy)
- cv2.waitKey(0)
复制代码 输出:
4.代码步骤剖析
1.导入图片
- import cv2
- """Sobel算子"""
- yuan = cv2.imread('../yuan.png')
- cv2.imshow('yuan', yuan)
- cv2.waitKey(0)
复制代码 2.处理x轴和y轴的边沿并相加
- '''x方向上的边缘'''
- # 右端为负值 显示不出来
- yuan_x_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=1, dy=0)
- cv2.imshow('yuan_x_64', yuan_x_64)
- cv2.waitKey(0)
- # 进行取绝对值操作即可
- yuan_x_full = cv2.convertScaleAbs(yuan_x_64)
- cv2.imshow('yuan_x_full', yuan_x_full)
- cv2.waitKey(0)
复制代码 输出:
左边的右边边沿没表现出来是由于举行计算之后这些位置的像素值为负值,表现不出来。
颠末取绝对值操作之后即可完整表现出来
y轴的处理与x轴划一
完整的边沿只需将两个轴上的数据举行加权相加即可
- '''y方向上的边缘'''
- # y的下端为负值 显示不出来
- # 进行取绝对值操作即可
- yuan_y_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=0, dy=1)
- yuan_y_full = cv2.convertScaleAbs(yuan_y_64)
- cv2.imshow('yuan_y_full', yuan_y_full)
- cv2.waitKey(0)
- '''使用加权运算组合图像得到完整边缘'''
- yuan_xy_full = cv2.addWeighted(yuan_x_full, 1, yuan_y_full, 1, 10)
- cv2.imshow('yuan_xy_full', yuan_xy_full)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
复制代码 最闭幕果:
三、Scharr算子
1.Scharr算子
Scharr 算子是 Soble 算子在 ksize=3 时的优化,与 Soble 的速率雷同,且精度更高。Scharr 算子与 Sobel 算子的不同点是在平滑部分,其中心元素占的权重更重,相当于利用较小尺度差的高斯函数,也就是更瘦高的模板。
2.计算
计算过程与sobel算子雷同,只是所用矩阵有差别
3.代码实现
完整代码:
- 实现步骤与Sobel的步骤一模一样,在此就不过多赘述了。
- import cv2
- """Scharr(xia)算子"""
- zrn1 = cv2.imread('../zrn.jpg', cv2.IMREAD_GRAYSCALE)
- zrn1 = cv2.resize(zrn1, (400, 400))
- x = cv2.Scharr(zrn1, cv2.CV_64F, dx=1, dy=0)
- y = cv2.Scharr(zrn1, cv2.CV_64F, dx=0, dy=1)
- x_full = cv2.convertScaleAbs(x)
- y_full = cv2.convertScaleAbs(y)
- xy = cv2.addWeighted(x_full, 1, y_full, 1, 0)
- cv2.imshow('zrn_Scharr', xy)
- cv2.waitKey(0)
复制代码 输出:
四、Laplacian算子
1.Laplacian算子
不再以x和y的方向计算,而是以圆方向计算变化率。因此不必要Gx+Gy。
2.计算
简朴来说就是只利用一个矩阵去跟所有的点举行卷积,得到的结果直接作为边沿
3.代码实现
完整代码:
步骤就是将Sobelx轴和y轴的步骤合二为一,并将取绝对值和加权相加的步骤去除了
- import cv2
- """Laplacian算子"""
- zrn1 = cv2.imread('zrn.jpg', cv2.IMREAD_GRAYSCALE)
- zrn1 = cv2.resize(zrn1, (400, 400))
- lap = cv2.Laplacian(zrn1, cv2.CV_64F, delta=10)
- lap_full = cv2.convertScaleAbs(lap)
- cv2.imshow('zrn_Lap', lap_full)
- cv2.waitKey(0)
复制代码 输出:
五、Canny边沿检测算法
1.Canny
Canny 边沿检测是一种图像处理技能,用于检测图像中的边沿。它通过以下几个步骤实现:首先对图像举行平滑处理以淘汰噪声;接着计算每个像素的梯度强度和方向;然后举行非极大值克制以准确定位边沿;末了应用双阈值化和边沿毗连来确定最终的边沿。这种方法能有效地识别和提取图像中的显著边沿。
2.计算
canny的计算分为四步:
详细内容感兴趣的可以搜索查看
3.代码实现
完整代码:
利用算法的代码就cv2.Canny()那一行,数字参数代表高低阈值,可以自己调试看看效果有何不同
- import cv2
- """Canny算子"""
- suda = cv2.imread('suda.jpg', cv2.IMREAD_GRAYSCALE)
- suda = cv2.resize(suda, (400, 400))
- cv2.imshow('suda', suda)
- cv2.waitKey(0)
- can = cv2.Canny(suda, 100, 200) # 低阈值 高阈值
- cv2.imshow('suda_canny', can)
- cv2.waitKey(0)
复制代码 输出:
总结
这么多种算法各有千秋,面对每种情况可以选择得当的算法
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |