Python从0到1丨详解图像锐化的Sobel、Laplacian算子

本文介绍了Python中Sobel和Laplacian算子在图像锐化和边缘检测中的应用。Sobel算子通过结合高斯平滑和微分求导,提供抗噪边缘检测,适用于噪声较多的图像。Laplacian算子通过计算邻域像素的梯度,实现图像锐化,但对噪声敏感。文章还展示了使用OpenCV实现这两种算子的代码示例及其效果。
摘要由CSDN通过智能技术生成

本文分享自华为云社区《[Python从零到壹] 五十八.图像增强及运算篇之图像锐化Sobel、Laplacian算子实现边缘检测》,作者: eastmount 。

一.Sobel算子

Sobel算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导。该算子用于计算图像明暗程度近似值,根据图像边缘旁边明暗程度把该区域内超过某个数的特定点记为边缘。Sobel算子在Prewitt算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓[1-4]。

Sobel算子的边缘定位更准确,常用于噪声较多、灰度渐变的图像。其算法模板如公式(1)所示,其中dx表示水平方向,dy表示垂直方向[3]。

cke_135.png

其像素计算公式如下:

cke_136.png

Sobel算子像素的最终计算公式如下:

cke_137.png

Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息。因为Sobel算子结合了高斯平滑和微分求导(分化),因此结果会具有更多的抗噪性,当对精度要求不是很高时,Sobel算子是一种较为常用的边缘检测方法。

Python和OpenCV将Sobel算子封装在Sobel()函数中,其函数原型如下所示:

  • dst = Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

    – src表示输入图像

    – dst表示输出的边缘图,其大小和通道数与输入图像相同

    – ddepth表示目标图像所需的深度,针对不同的输入图像,输出目标图像有不同的深度

    – dx表示x方向上的差分阶数,取值1或 0

    – dy表示y方向上的差分阶数,取值1或0

    – ksize表示Sobel算子的大小,其值必须是正数和奇数

    – scale表示缩放导数的比例常数,默认情况下没有伸缩系数

    – delta表示将结果存入目标图像之前,添加到结果中的可选增量值

    – borderType表示边框模式,更多详细信息查阅BorderTypes

注意,在进行Sobel算子处理之后,还需要调用convertScaleAbs()函数计算绝对值,并将图像转换为8位图进行显示。其算法原型如下:

  • dst = convertScaleAbs(src[, dst[, alpha[, beta]]])

    – src表示原数组

    – dst表示输出数组,深度为8位

    – alpha表示比例因子

    – beta表示原数组元素按比例缩放后添加的值

Sobel算子的实现代码如下所示。

# -*- coding: utf-8 -*-

# By:Eastmount

import cv2

import numpy as np

import matplotlib.pyplot as plt

#读取图像

img = cv2.imread('luo.png')

lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#灰度化处理图像

grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#Sobel算子

x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0) #对x求一阶导

y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1) #对y求一阶导
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值