【python】实现canny算子与LoG算子

本文详细介绍了如何用Python实现LoG和Canny边缘检测算子,并对比了OpenCV官方函数的效果。通过代码示例和处理结果分析,指出自编函数在边缘提取上的不足,强调了OpenCV的优化优势。
摘要由CSDN通过智能技术生成

参考链接:https://www.cnblogs.com/wj-1314/p/9800272.html

一、LoG算子

参考:
https://blog.csdn.net/pi9nc/article/details/8655396
http://www.roborealm.com/help/LOG.php

1.Laplacian算子

定义:图像I在x、y方向上的二阶导数的和
在这里插入图片描述
三个经典模板:
在这里插入图片描述
模板实际上是根据离散数据求近似二阶导数的公式,整理得到的矩阵形式。

2.LoG算子

由于Laplacian算子对噪点敏感,常常在Laplacian处理前对图片进行高斯滤波,为了简化运算,将高斯滤波算子与Laplacian算子相结合,就得到了LoG算子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
而当高斯滤波范围很窄(方差很小)时,高斯滤波不再产生影响,LoG算子退化为Laplacian算子。

3.编程实现

参考网站的代码有一个严重的错误
在这里插入图片描述
第27行的image应改为new_image,以将new_image的灰度值缩放到0~255范围内。
下面是更正后的代码

# LoG边缘检测算子
def LaplaceOperator(roi, operator_type="fourfields"):
    if operator_type == "fourfields":
        laplace_operator = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
    elif operator_type == "eightfields":
        laplace_operator = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])
    else:
        raise ("type Error")
    result = np.abs(np.sum(roi * laplace_operator))
    return result


def LaplaceAlogrithm(image, operator_type="fourfields"):
    # 提取结果
    new_image = np.zeros(image.shape)
    # 扩充边界
    image = cv2.copyMakeBorder(image, 1, 1, 1, 1, cv2.BORDER_DEFAULT)
    for i in range(1, image.shape[0] - 1):
        for j in range(1, image.shape[1] - 1):
            new_image[i - 1, j - 1] = LaplaceOperator2(image[i - 1:i + 2, j - 1:j + 2], operator_type)
    # 归一
    new_image = new_image * (255 / np.max(new_image)
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值