python图像处理(十一)——图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子、Laplacian算子

article/2025/11/9 3:50:14

在图像增强过程中,通常利用各类图像平滑算法消除噪声,图像的常见噪声主要有加性噪声、乘性噪声和量化噪声等。一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像边缘信息也主要集中在其高频部分。这将导致原始图像在平滑处理之后,图像边缘和图像轮廓模糊的情况出现。为了减少这类不利效果的影响,就需要利用图像锐化技术,使图像的边缘变得清晰。

 

一、Roberts算子

Roberts算子又称交叉微分算法,它是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条,常来处理具有陡峭的低噪声图像,当图像边缘接近于正负45,处理效果最佳。缺点是对边缘定位信息不太准确,提取的边缘线条较粗。Roberts算子模板分为水平方向和垂直方向。

在python中Roberts算子主要是通过Numpy定义模板,再调用OpenCV中的filter2D()函数实现边缘提取,该函数主要是利用内核实现对图像的卷积运算,其函数原型如下:

dst=cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

参数如下:

src原图像
dst目标图像,与原图像尺寸和通过数相同
ddepth目标图像的所需深度
kernel卷积核(或相当于相关核),单通道浮点矩阵;如果要将不同的内核应用于不同的通道,请使用拆分将图像拆分为单独的颜色平面,然后单独处理它们。
anchor内核的锚点,指示内核中过滤点的相对位置;锚应位于内核中;默认值(-1,-1)表示锚位于内核中心。
detal在将它们存储在dst中之前,将可选值添加到已过滤的像素中。类似于偏置。
borderType像素外推法,参见BorderTypes

Roberts算法代码如下所示:

import cv2
import matplotlib.pyplot as plt
import numpy as np#读取图像
image = cv2.imread('E:/pythonProject/12.png')
lena = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)#灰度转化处理
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#roberts算子
kernelx = np.array([[-1, 0], [0, 1]], dtype= int)
kernely = np.array([[0, -1], [1, 0]], dtype= int)
x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)
y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)#转uint8
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)#加权和
Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)#显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']#图像显示
titles = [u'原始图像', u'Robertes图像']
images = [lena, Roberts]for i in range(2):plt.subplot(1, 2, i+1), plt.imshow(images[i], 'gray')plt.xticks([]), plt.yticks([])plt.title(titles[i])
plt.show()

输出结果如下所示:

 

二、Prewitt算子

Prewitt算子是一种图像边缘检测的微分算子,由于Prewitt算子采用3*3模板对区域中的像素进行计算,而Roberts算子的是利用2*2模板,因此,Prewitt算子边缘检测结果在水平方向和垂直方向均比Roberts算子更加明显。Prewitt算子适合用来处理噪声较多,灰度渐变的图像。

在python中,Prewitt算子处理过程与Roberts算子较为相似,主要是通过Numpy定义模板,再调用OpenCV中的filter2D()函数实现对图像的卷积运算,最终通过cv2.convertScaleAbs(),和cv2.addWeighted()实现图像边缘提取。

Prewitt算法代码如下所示:

import cv2
import numpy as np
import matplotlib.pyplot as plt#输入图像
image = cv2.imread('E:/pythonProject/12.png')
lena = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)#灰度转化处理
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#kernel
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(grayImage, cv2.CV_16S, kernelX)
y = cv2.filter2D(grayImage, cv2.CV_16S, kernelY)#转uint8
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)#加权和
Prewitt = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)#图象显示
plt.rcParams['font.sans-serif'] = ['SimHei']
titles = [u'原始图像', u'Prewitt图像']
images = [lena, Prewitt]for i in range(2):plt.subplot(1, 2, i+1), plt.imshow(images[i], 'gray')plt.xticks([]), plt.yticks([])plt.title(titles[i])
plt.show()

输出结果如下所示:

从其效果图输出可以明显看出,Prewitt算子在垂直方向和水平方向其边缘检测结果均比Roberts算子边缘检测轮廓要更明显。

 

三、Sobel算子

Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。

函数原型:

sobelx = cv2.Sobel(img,cv2.CV_64F, 1, 0, ksize=3)

  • img表示原图像
  • 利用Sobel方法可以进行sobel边缘检测 img表示源图像,即进行边缘检测的图像 cv2.CV_64F表示64位浮点数即64float, 这里不使用numpy.float64,因为可能会发生溢出现象。
  • 用cv的数据则会自动 第三和第四个参数分别是对X和Y方向的导数(即dx,dy),对于图像来说就是差分,这里1表示对X求偏导(差分),0表示不对Y求导(差分),其中,X还可以求2次导。 (注意:对X求导就是检测X方向上是否有边缘。)
  • 第五个参数ksize是指核的大小。

在sobel处理之后还要用cv2.convertScaleAbs()求其绝对值,并将图像转化为uint8格式。

Sobel算法代码如下所示:

import cv2
import matplotlib.pyplot as plt#读取图像
image = cv2.imread('E:/pythonProject/12.png')
lean = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)#转灰度图像
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#Sobel算子
x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0)#对x一阶求导
y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1)#对y一阶求导
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)#图像输出
plt.rcParams['font.sans-serif'] = ['SimHei']
titles = [u'原始图像', u'Sobel图像']
images = [lean, Sobel]for i in range(2):plt.subplot(1, 2, i+1), plt.imshow(images[i], 'gray')plt.xticks([]), plt.yticks([])plt.title(titles[i])
plt.show()

输出结果如下所示:

 

四、Laplacian算子

Laplace函数实现的方法是先用Sobel 算子计算二阶x和y导数,再求和。

函数原型:

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

必须的参数:

  • scr是需要处理的图像;
  • ddepth是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;

可选的参数:

  • dst表示输出边缘图,其大小和通道数与输入图像相同;
  • ksize是算子的大小,必须为1、3、5、7。默认为1。
  • scale是缩放导数的比例常数,默认情况下没有伸缩系数;
  • delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;
  • borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。

Laplacian算子代码如下所示:

import cv2
import matplotlib.pyplot as plt#读取图像
image = cv2.imread('E:/pythonProject/12.png')
lean = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)#转灰度图像
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#拉普拉斯算法
dst = cv2.Laplacian(grayImage, cv2.CV_16S, ksize= 3)
Laplacian = cv2.convertScaleAbs(dst)#图像输出
plt.rcParams['font.sans-serif'] = ['SimHei']
titles = [u'原始图像', u'Laplacian图像']
images = [lean, Laplacian]for i in range(2):plt.subplot(1, 2, i+1), plt.imshow(images[i], 'gray')plt.xticks([]), plt.yticks([])plt.title(titles[i])
plt.show()

输出结果如下所示:

今天先写这么多,后期持续更新~

 

 

 

 


http://chatgpt.dhexx.cn/article/SNnBGRXa.shtml

相关文章

机器学习MATLAB实现:Matlab-梯度Roberts算子、拉普拉斯算子、Sobel算子、Prewitt算子对图像进行锐化

机器学习MATLAB实现:Matlab-梯度Roberts算子、拉普拉斯算子、Sobel算子、Prewitt算子对图像进行锐化 欢迎大家来到安静到无声的《模式识别与人工智能(程序与算法)》,如果对所写内容感兴趣请看模式识别与人工智能(程序与…

10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子

10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子 文章目录 10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子1 算法原理1.1 Sobel 算子1.2 Ro…

【计算机视觉】卷积、均值滤波、高斯滤波、Sobel算子、Prewitt算子(Python实现)

##1.环境的搭建 Python 3.6OpenCV Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、MacOS操作…

几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny

from:https://blog.csdn.net/gdut2015go/article/details/46779251 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括:深度上的…

prewitt算子实现

原理&#xff1a; 实现&#xff1a; /*** description: prewitt算子* param src 输入图像* param dst 输出图像*/ void prewitt(cv::Mat& src, cv::Mat& dst) {cv::Mat getPrewitt_horizontal (cv::Mat_<float>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, …

数字图像处理——Sobel算子锐化、Prewitt算子锐化

数字图像处理——Sobel算子锐化、Prewitt算子锐化 一、Sobel算子锐化 %函数名称为Image_Sobel,输入参数Image,输出参数IMAGE function [IMAGE] Image_Sobel(Image) %获取矩阵的行、列、波段数 [m,n,bands] size(Image); %定义模板大小&#xff0c;假设模板大小33 A 1; %定义…

Python 图像处理 OpenCV (12): Roberts 算子、 Prewitt 算子、 Sobel 算子和 Laplacian 算子边缘检测技术

前文传送门&#xff1a; 「Python 图像处理 OpenCV &#xff08;1&#xff09;&#xff1a;入门」 「Python 图像处理 OpenCV &#xff08;2&#xff09;&#xff1a;像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python 图像处理 OpenCV &#xff08;3&#xff09;&…

[Python从零到壹] 五十七.图像增强及运算篇之图像锐化Roberts、Prewitt算子实现边缘检测

欢迎大家来到“Python从零到壹”&#xff0c;在这里我将分享约200篇Python系列文章&#xff0c;带大家一起去学习和玩耍&#xff0c;看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解&#xff0c;真心想把自己近十年的编程经验分享给大家&#xff0c;希望…

Prewitt算子计算图像梯度

Prewitt算子是一阶微分算子的边缘检测&#xff0c;利用像素点上下、左右邻点的灰度差&#xff0c;在边缘处达到极值检测边缘&#xff0c;去掉部分伪边缘&#xff0c;对噪声具有平滑作用。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成&#xff0c;这两个方向模板…

opencv-6 边缘检测(Prewitt算子,Sobel算子,Laplacian算子)

Roberts filter2D形式实现 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread(lena.jpg) lenna_img cv2.cvtColor(img,cv2.COLOR_BGR2RGB) grayImage cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)kernelx np.array([[-1,0],[0,1]],dtypeint) kernely…

梯度与Roberts、Prewitt、Sobel、Lapacian算子

一、学习心得&#xff1a; 学习图像处理的过程中&#xff0c;刚开始遇到图像梯度和一些算子的概念&#xff0c;这两者到底是什么关系&#xff0c;又有什么不同&#xff0c;一直困扰着我。后来在看到图像分割这一模块后才恍然大悟&#xff0c;其实图像的梯度可以用一阶导数和二…

【计算机视觉】图像分割与特征提取——基于Roberts、Prewitt、Sobel算子的图像分割实验

个人简介&#xff1a; > &#x1f4e6;个人主页&#xff1a;赵四司机 > &#x1f3c6;学习方向&#xff1a;JAVA后端开发 > ⏰往期文章&#xff1a;SpringBoot项目整合微信支付 > &#x1f514;博主推荐网站&#xff1a;牛客网 刷题|面试|找工作神器 > &#…

边缘检测——Prewitt算子

垂直水平方向边缘 垂直水平方向的Prewitt算子是可分离的卷积核。 45、135方向边缘 算子不可分割。 缺点 没有充分利用边缘的梯度方向最后输出的边缘二值图&#xff0c;只是简单地利用阈值进行处理。如果阈值过大&#xff0c;则会损失很多边缘信息&#xff1b;如果阈值过…

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子)

目录 1 边缘检测的基本原理 2 边缘检测算子分类 3 梯度 3.1 图像梯度 3.2 梯度算子 4 Roberts 算子 4.1 基本原理 4.2 代码示例 5 Prewitt 算子 5.1 基本原理 5.2 代码示例 6 Sobel 算子 6.1 基本原理 6.2 代码示例 7 Laplacian 算子 7.1 基本原理 7.2 代码示…

python数字图像处理——边缘检测算子(Laplacian算子、Roberts算子、Prewitt算子和Sobel算子)

1.Laplacian算子 拉普拉斯&#xff08;Laplacian&#xff09;算子是n维欧几里德空间中的一个二阶微分算子&#xff0c;常用于图像增强领域和边缘提取。它通过灰度差分计算邻域内的像素&#xff0c;基本流程是&#xff1a;判断图像中心像素灰度值与它周围其他像素的灰度值&…

Prewitt算子边缘检测原理及实现

写在前面 Prewitt算子同样也是一种一阶微分算子&#xff0c;利用像素点上下左右邻点灰度差&#xff0c;在边缘处达到极值检测边缘&#xff0c;对噪声具有平滑的作用。 原理 其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的&#xff0c;这两个方向模板一个检测…

Prewitt和Sobel算子

在3*3模板中&#xff1a; 我如下定义水平、垂直和两对角线方向的梯度&#xff1a; 该定义下的算子称之为Prewitt算子&#xff1a; Sobel算子是在Prewitt算子的基础上改进的&#xff0c;在中心系数上使用一个权值2&#xff0c;相比较Prewitt算子&#xff0c;Sobel模板能够较好…

Prewitt边缘检测算子

Prewitt算子也是一种一阶微分算子&#xff0c;用于边缘检测。与Robert使用22的模板不同&#xff0c;Prewitt算子使用的是33的模板&#xff0c;利用像素点上下、左右邻点的灰度差来检测边缘&#xff0c;故其边缘检测结果在水平方向和垂直方向均比Robert算子更加明显。 其数学表…

图像边缘检测之Prewitt算子

Prewitt 算子 1. 原理 Prewitt算子是一种图像边缘检测的微分算子&#xff0c;其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于Prewitt算子采用 3x3 模板对区域内的像素值进行计算&#xff0c;而Robert算子的模板为 2x2&#xff0c;故Prewitt算子的边缘检测结果…

华为--配置本地环回接口地址

该实验紧接上一节实验 网络拓扑图如下 AR1环回接口配置 AR2环回接口配置 AR3环回接口配置 配置AR1回环接口路由 配置AR2回环接口路由 配置AR3回环接口路由 在AR1上测试回环接口的连通性 在AR2上测试回环接口的连通性 在AR3上测试回环接口的连通性 测试成功 转载于:https://my.o…