Python中图像边缘检测算法如何实现

发布时间:2022-05-31 10:48:12 作者:zzz
来源:亿速云 阅读:231

这篇“Python中图像边缘检测算法如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中图像边缘检测算法如何实现”文章吧。

本文采用面向对象设计,定义了一个边缘检测类EdgeDetect,使图像边缘检测算法的应用更简洁,例如

import cv2
import numpy as np
import matplotlib.pyplot as plt

Detector = EdgeDetect('1.jpg')
Prewitt = Detector.prewitt()
plt.imshow(Prewitt , 'gray')
plt.show()

这个类的构造函数为

class EdgeDetect:
    def __init__(self, img) -> None:
        self.src = cv2.imread(img)
        self.gray = cv2.cvtColor(self.src, cv2.COLOR_BGR2GRAY)

读取的是图像的基本信息。

1.一阶微分算子

图像边缘是数字图像的高频成分,对应图像梯度的极值。在二维离散数字图像上,某个方向上图像强度函数微分使用有限差分法来近似,即:

Python中图像边缘检测算法如何实现

因此图像边缘检测即是对图像的差分运算。

1.1 Prewitt算子

Prewitt算子本质上就是x或y方向上相邻像素的差分。

Python中图像边缘检测算法如何实现

那我们常说的图像梯度是什么意思呢?

其实就是用x与y方向上相邻像素的差分为方向的向量

Python中图像边缘检测算法如何实现

在编程实现上,就是构造上图的两个方向的滤波算子,然后将x xx、y yy两个方向的边缘合成就是整张图各方向的边缘检测结果

def prewitt(self):
    # Prewitt 算子
    kernelX = np.array([[1,1,1],[0,0,0],[-1,-1,-1]], dtype=int)
    kernelY = np.array([[-1,0,1],[-1,0,1],[-1,0,1]], dtype=int)
    # 对图像滤波
    x = cv2.filter2D(self.gray, cv2.CV_16S, kernelX)
    y = cv2.filter2D(self.gray, cv2.CV_16S, kernelY)
    # 转 uint8 ,图像融合
    absX = cv2.convertScaleAbs(x)
    absY = cv2.convertScaleAbs(y)
    return cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

Python中图像边缘检测算法如何实现

1.2 Sobel算子

对高斯核函数x、y方向求导,并将其模板化即得Sobel算子。Sobel算子相比于Prewitt算子有更强的抗噪能力,因为其结合了高斯滤波的效果。

Python中图像边缘检测算法如何实现

在编程实现上,就是构造上图的两个方向的滤波算子,然后将x、y两个方向的边缘合成就是整张图各方向的边缘检测结果

def sobel(self):
    # Sobel 算子
    kernelX = np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1]],dtype=int)
    kernelY = np.array([[-1, -2, -1],[0, 0, 0],[1, 2, 1]],dtype=int)
    # 对图像滤波
    x = cv2.filter2D(self.gray, cv2.CV_16S, kernelX)
    y = cv2.filter2D(self.gray, cv2.CV_16S, kernelY)
    # 转 uint8 ,图像融合
    absX = cv2.convertScaleAbs(x)
    absY = cv2.convertScaleAbs(y)
    return cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

Python中图像边缘检测算法如何实现

2.二阶微分算子

2.1 Laplace算子

将Laplace算子

Python中图像边缘检测算法如何实现

写成差分方程形式为

Python中图像边缘检测算法如何实现

将差分方程进一步写成卷积核形式如图(a),可将其扩展为图(b)使之具有各向同性。微分算子属于高通滤波,在锐化边缘的同时也增强了噪点,因此Laplace算子抗噪能力弱,且不能检测边缘方向。

Python中图像边缘检测算法如何实现

在编程实现上,就是构造上图的滤波算子

# Laplace 算子
def laplace(self):
    kernel = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]], dtype=int)
    img = cv2.filter2D(self.gray, cv2.CV_16S, kernel)
    return cv2.convertScaleAbs(img)

Python中图像边缘检测算法如何实现

2.2 LoG算子

为克服Laplace算子抗噪能力弱这一问题,引入高斯-拉普拉斯算子(LoG, Laplace of Gaussian),即先低通滤除噪声,再高通强化边缘,LoG算子本质上是带通滤波器。

Python中图像边缘检测算法如何实现

在编程实现上,就是构造上图的滤波算子

# LoG算子
def LoG(self):
    kernel = np.array([[0, 0, 1, 0, 0], [0, 1, 2, 1, 0], [1, 2, -16, 2, 1], [0, 1, 2, 1, 0], [0, 0, 1, 0, 0]], dtype=int)
    img = cv2.filter2D(self.gray, cv2.CV_16S, kernel)
    return cv2.convertScaleAbs(img)

Python中图像边缘检测算法如何实现

3.Canny边缘检测

Canny边缘检测算法可以分为以下步骤。

使用如下双阈值检测算法解决因噪声引起的杂散边缘响应。

Python中图像边缘检测算法如何实现

阈值的选择取决于给定输入图像的内容。下面对弱边缘进一步审查,即

Python中图像边缘检测算法如何实现

通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素的8个邻域像素是否存在强边缘像素,来决定是否滤除该弱边缘点。

下面是Canny边缘检测算法的效果。

Python中图像边缘检测算法如何实现

以上就是关于“Python中图像边缘检测算法如何实现”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。

推荐阅读:
  1. 如何实现python Canny边缘检测算法
  2. python opencv实现图像边缘检测

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:C++强制类型转换的方法

下一篇:C++函数参数的默认值怎么指定

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》