sobel算子python代码实现
sobel算子计算过程详解

sobel算子计算过程详解Sobel算子是一种用于图像边缘检测的算法,其基本原理是通过计算像素点周围的像素点梯度值来确定图像中的边缘信息。
以下是Sobel算子的具体计算过程。
1. 定义Sobel算子模板Sobel算子模板是一个3×3的矩阵,如下所示:|-1 0 1||-2 0 2||-1 0 1|其中,中间一行和一列的元素值为0,其余各元素值根据上述矩阵填充。
2. 对图像进行卷积操作将Sobel算子模板与图像进行卷积操作,具体过程为:(1)将3×3的模板矩阵与图像中的某个像素点对应位置进行对齐;(2)求出模板矩阵与该像素点周围8个像素点的加权平均值,即:Gx = -I(p-1,q-1) - 2I(p,q-1) - I(p+1,q-1) + I(p-1,q+1) + 2I(p,q+1) +I(p+1,q+1)Gy = -I(p-1,q-1) - 2I(p-1,q) - I(p-1,q+1) + I(p+1,q-1) + 2I(p+1,q) +I(p+1,q+1)其中,Gx和Gy分别为水平和竖直方向上的边缘梯度值,I为图像像素值,p和q为像素点的位置坐标。
3. 计算像素点的边缘梯度值将Gx和Gy的平方和求平方根,即可得到像素点的边缘梯度值:G = sqrt(Gx^2 + Gy^2)4. 根据梯度值进行二值化处理对于像素点的边缘梯度值,如果超过了设定的阈值,则将其二值化为白色(255),否则为黑色(0),从而形成边缘检测后的图像。
以上便是Sobel算子的基本计算流程,通过该算法可以有效地提取图像的边缘信息,并应用于图像分割、医学影像处理、目标跟踪等领域。
边缘检测实验报告

边缘检测实验报告边缘检测实验报告引言:边缘检测是图像处理中的一项重要任务,它能够有效地提取图像中物体的边界信息,为后续的图像分割、物体识别等任务提供基础。
本实验旨在探究不同的边缘检测算法在不同场景下的表现,并对其进行评估和比较。
一、实验背景边缘检测是图像处理领域的经典问题,早期的边缘检测算法主要基于梯度的计算,如Sobel、Prewitt等。
随着深度学习的发展,基于卷积神经网络的边缘检测方法也取得了显著的进展。
本实验将选择传统的Sobel算子和基于深度学习的Canny算法进行对比。
二、实验步骤1. 数据准备:选择一组包含不同场景、不同复杂度的图像作为实验数据集,确保数据集的多样性和代表性。
2. 算法实现:使用Python编程语言,利用OpenCV库实现Sobel算子和Canny 算法。
对于Sobel算子,我们将尝试不同的卷积核大小和阈值设置。
对于Canny算法,我们将调整高低阈值的取值范围。
3. 实验评估:使用评估指标来衡量不同算法的性能,如准确率、召回率、F1值等。
同时,我们还可以通过可视化的方式来比较不同算法的边缘检测效果。
三、实验结果在实验中,我们选择了10张不同类型的图像进行边缘检测,并使用Sobel算子和Canny算法进行处理。
通过对比实验结果,我们得出以下结论:1. Sobel算子:- 当卷积核大小较小(如3x3)时,Sobel算子能够较好地检测到图像中的细节边缘,但对于噪声较多的图像效果较差。
- 当卷积核大小较大(如7x7)时,Sobel算子能够更好地抑制噪声,但会导致边缘检测结果的模糊。
- 阈值的设置对Sobel算子的效果也有较大影响,较低的阈值可以提高边缘检测的敏感性,但也容易引入噪声。
2. Canny算法:- Canny算法基于梯度的计算和非极大值抑制,能够有效地检测到图像中的边缘,并且对噪声有较好的鲁棒性。
- 高低阈值的设置对Canny算法的效果影响较大,合适的阈值范围可以提高边缘检测的准确性和稳定性。
OPENCVFORPYTHON学习笔记-图像梯度Sobel算子

OPENCVFORPYTHON学习笔记-图像梯度Sobel算⼦Sobel算⼦:是离散微分算⼦(discrete differentiation operator),⽤来计算图像灰度的近似梯度,梯度越⼤越有可能是边缘。
Sobel算⼦依然是⼀种过滤器,只是其是带有⽅向的。
在OpenCV-Python中,使⽤Sobel的算⼦的函数原型如下:dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) 前四个是必须的参数: 第⼀个参数src:需要处理的图像; 第⼆个参数ddepth:是图像的深度,-1表⽰采⽤的是与原图像相同的深度。
⽬标图像的深度必须⼤于等于原图像的深度; 第三个和第四个参数dx和dy:表⽰的是求导的阶数,0表⽰这个⽅向上没有求导,⼀般为0、1、2。
其后是可选的参数: dst不⽤解释了; ksize是Sobel算⼦的⼤⼩,必须为1、3、5、7。
scale是缩放导数的⽐例常数,默认情况下没有伸缩系数; delta是⼀个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中; borderType是判断图像边界的模式。
这个参数默认值为cv2.BORDER_DEFAULT。
在OpenCV-Python中,Sobel函数的使⽤如下:import cv2 as cvimg = cv.imread("lena.jpg",cv.IMREAD_UNCHANGED)gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)dWindow("binary",cv.WINDOW_AUTOSIZE)cv.imshow("binary",binary)sobelx = cv.Sobel(binary,cv.CV_64F,1,0)sobelx = cv.convertScaleAbs(sobelx)dWindow("sobelx",cv.WINDOW_AUTOSIZE)cv.imshow("sobelx",sobelx)sobely = cv.Sobel(binary,cv.CV_64F,0,1)sobely = cv.convertScaleAbs(sobely)dWindow("sobely",cv.WINDOW_AUTOSIZE)cv.imshow("sobely",sobely)sobelxy = cv.addWeighted(sobelx,0.5,sobely,0.5,0)dWindow("sobelxy",cv.WINDOW_AUTOSIZE)cv.imshow("sobelxy",sobelxy)cv.waitKey(0)cv.destroyAllWindows()在Sobel函数的第⼆个参数这⾥使⽤了cv2.CV_16S。
Python+OpenCV实现图像边缘检测算子SOBEL、ROBERT

Python+OpenCV实现图像边缘检测算⼦SOBEL、ROBERT 在Jupyter Notebook上使⽤Python实现图像边缘检测算⼦SOBEL、ROBERT,这个过程中实现某些功能处理出来的图像可能会有点粗糙。
关于opencv库的安装可以参考:。
1.实现代码import cv2import numpy as npimport matplotlib.pyplot as plt#实现图⽚反⾊功能def PointInvert(img):height, width, _ = img.shapefor i in range(height):for j in range(width):pi = img[i, j]img[i, j] = 255 - pireturn img#读取原灰度图⽚src_s=cv2.imread("dip_switch_02.bmp")cv2.imshow("src_s", src_s)#将原图⽚命名为“src_s”显⽰出来#图⽚反⾊src=PointInvert(src_s)cv2.imshow("src", src)#将图⽚src_s反⾊处理后命名为“src”并显⽰出来#SOBEL算⼦sobel = cv2.Sobel(src,cv2.CV_64F, 1, 1, ksize=7)cv2.imshow("sobel", sobel)#将SOBEL算⼦处理后的图⽚src命名为“sobel”并显⽰出来#图⽚反⾊sobel2=PointInvert(sobel)cv2.imshow("sobel2", sobel2)#将图⽚sobel反⾊处理后命名为“sobel2”并显⽰出来#ROBERT算⼦def Robert(img):h,w,_ = img.shaperob = [[-1,-1],[1,1]]for x in range(h):for y in range(w):if (y + 2 <= w) and (x + 2 <= h):imgChild = img[x:x+2, y:y+2, 1]list_robert = rob*imgChildimg[x, y] = abs(list_robert.sum())# 求和加绝对值return imgrobert = Robert(src)cv2.imshow("robert", robert)#将ROBERT算⼦处理后的图⽚src命名为“robert”并显⽰出来#图⽚反⾊robert2=PointInvert(robert)cv2.imshow("robert2", robert2)#将图⽚robert反⾊处理后命名为“robert2”并显⽰出来cv2.waitKey(0)2.运⾏结果3.遇到的问题及解决⽅法(1) 运⾏时出现:ValueError: too many values to unpack(expect 2)出错代码:h,w = img.shape出错原因:⾸先了解img.shape[0]、[1]、[2]。
基于多方向的sobel算子___解释说明

基于多方向的sobel算子解释说明1. 引言1.1 概述引言部分将会对本文所要探讨的主题进行概述。
本文将介绍基于多方向的Sobel 算子,该算子是一种用于边缘检测的常见图像处理算法。
通过对图像中各个像素点进行局部梯度计算,并结合多个方向上的梯度信息,可以有效地检测出图像中的边缘。
1.2 文章结构在本文中,将会按照以下结构来展开说明基于多方向的Sobel算子的应用和实现过程。
首先,简单介绍Sobel算子作为边缘检测的方法,并阐述其原理与应用领域(第2节)。
然后,详细介绍多方向的Sobel算子设计思路,包括对单一方向Sobel算子局限性的分析以及多方向算子的优势介绍和设计过程与方法论(第3节)。
接下来,将详细描述多方向Sobel算子的具体实现步骤,并给出代码示例,同时还会通过实验结果和分析报告评估其在图像边缘检测中的性能(第4节)。
最后,在结论与展望部分总结本文内容并对未来研究进行展望(第5节)。
1.3 目的本文的目的是介绍基于多方向的Sobel算子在图像边缘检测中的应用,并通过实例研究来说明其设计和实现过程。
通过深入探讨多方向Sobel算子的优势和适用性,旨在为读者提供更全面、深入的理解,并为后续研究和应用提供参考和指导。
通过本文,读者将能够了解到如何利用多方向Sobel算子来提高边缘检测的准确性和鲁棒性,并且还能够对其在更高级别应用场景中的适用性进行评估。
2. Sobel算子简介2.1 边缘检测概述边缘是图像中灰度级变化较为剧烈的地方,对于图像分析和处理任务具有重要意义。
边缘检测是一种常用的图像处理技术,可以识别出图像中不同物体或区域之间的边界。
边缘检测在计算机视觉、模式识别和图像分析等领域广泛应用。
2.2 Sobel算子原理Sobel算子是一种常用的边缘检测算子,可以识别出图像中的水平和垂直边界。
它利用了图像灰度值的梯度来确定像素点是否位于边缘上。
Sobel算子通过卷积运算,在每个像素点周围的邻域内计算出水平方向和垂直方向上的梯度值,然后综合这两个梯度值来获得最终的边缘强度。
Python图像处理OpenCV(12):Roberts算子、Prewitt算子、Sobe。。。

Python 图像处理OpenCV (12):Roberts 算⼦、Prewitt 算⼦、Sobe。
前⽂传送门:引⾔前⽂介绍了 Canny 算⼦边缘检测,本篇继续介绍 Roberts 算⼦、 Prewitt 算⼦、 Sobel 算⼦和 Laplacian 算⼦等常⽤边缘检测技术。
Roberts 算⼦Roberts 算⼦,⼜称罗伯茨算⼦,是⼀种最简单的算⼦,是⼀种利⽤局部差分算⼦寻找边缘的算⼦。
他采⽤对⾓线⽅向相邻两象素之差近似梯度幅值检测边缘。
检测垂直边缘的效果好于斜向边缘,定位精度⾼,对噪声敏感,⽆法抑制噪声的影响。
1963年, Roberts 提出了这种寻找边缘的算⼦。
Roberts 边缘算⼦是⼀个 2x2 的模版,采⽤的是对⾓⽅向相邻的两个像素之差。
Roberts 算⼦的模板分为⽔平⽅向和垂直⽅向,如下所⽰,从其模板可以看出, Roberts 算⼦能较好的增强正负 45 度的图像边缘。
dx =−1001dy =0−11Roberts 算⼦在⽔平⽅向和垂直⽅向的计算公式如下:d x (i ,j )=f (i +1,j +1)−f (i ,j )d y (i ,j )=f (i ,j +1)−f (i +1,j )Roberts 算⼦像素的最终计算公式如下:S =d x (i ,j )2+dy (i ,j )2今天的公式都是⼩学⽣⽔平,千万别再说看不懂了。
实现 Roberts 算⼦,我们主要通过 OpenCV 中的 filter2D() 这个函数,这个函数的主要功能是通过卷积核实现对图像的卷积运算:def filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None)src: 输⼊图像ddepth: ⽬标图像所需的深度kernel: 卷积核接下来开始写代码,⾸先是图像的读取,并把这个图像转化成灰度图像,这个没啥好说的:# 读取图像img = cv.imread('maliao.jpg', cv.COLOR_BGR2GRAY)[][]√rgb_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)# 灰度化处理图像grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)然后是使⽤ Numpy 构建卷积核,并对灰度图像在 x 和 y 的⽅向上做⼀次卷积运算:# Roberts 算⼦kernelx = np.array([[-1, 0], [0, 1]], dtype=int)kernely = np.array([[0, -1], [1, 0]], dtype=int)x = cv.filter2D(grayImage, cv.CV_16S, kernelx)y = cv.filter2D(grayImage, cv.CV_16S, kernely)注意:在进⾏了 Roberts 算⼦处理之后,还需要调⽤convertScaleAbs()函数计算绝对值,并将图像转换为8位图进⾏显⽰,然后才能进⾏图像融合:# 转 uint8 ,图像融合absX = cv.convertScaleAbs(x)absY = cv.convertScaleAbs(y)Roberts = cv.addWeighted(absX, 0.5, absY, 0.5, 0)最后是通过 pyplot 将图像显⽰出来:# 显⽰图形titles = ['原始图像', 'Roberts 算⼦']images = [rgb_img, Roberts]for i in range(2):plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray') plt.title(titles[i])plt.xticks([]), plt.yticks([])plt.show()最终结果如下:Prewitt 算⼦Prewitt 算⼦是⼀种⼀阶微分算⼦的边缘检测,利⽤像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作⽤。
python-opencv-图像边缘检测Sobel算子

python-opencv-图像边缘检测Sobel算⼦Sobel算⼦对噪声具有平滑作⽤,提供较为精确的边缘⽅向信息,边缘定位精度不够⾼。
当对精度要求不是很⾼时,是⼀种较为常⽤的边缘检测⽅法。
import cv2image = cv2.imread("wuhuan.jpg",1)cv2.imshow('yuan',image)image_x=cv2.Sobel(image,cv2.CV_64F,1,0,ksize=3) #X⽅向Sobel'''参数2 ddepth:必选参数。
表⽰输出图像的深度,-1表⽰采⽤的是与原图像相同的深度。
⽬标图像的深度必须⼤于等于原图像的深度参数3和参数4 dx和dy表⽰的是求导的阶数,0表⽰这个⽅向上没有求导,⼀般为0、1、2参数6 ksize:可选参数。
⽤于设置内核⼤⼩,即Sobel算⼦的矩阵⼤⼩,值必须是1、3、5、7,默认为3。
'''absX=cv2.convertScaleAbs(image_x) # 转回uint8cv2.imshow("absX",absX)image_y=cv2.Sobel(image,cv2.CV_64F,0,1,ksize=3) #Y⽅向SobelabsY=cv2.convertScaleAbs(image_y)cv2.imshow('absY',absY)#进⾏权重融合dst=cv2.addWeighted(absX,0.5,absY,0.5,0)cv2.imshow('dst',dst)#cv2.imshow("dst",dst)cv2.waitKey()。
pythonopencvSobel、Laplace、canny算子的边缘提取以及参数解析

pythonopencvSobel、Laplace、canny算⼦的边缘提取以及参数解析前提:各种算⼦不完全区分好坏,但根据我实际操作分析得到,有的算⼦之间效果⼤相径庭,但有的也很相似,也就是各有各的⽤法,这⾥按Sobel、Laplace、canny三种算⼦作⽐较,看其结果:⼀、 Sobel、Laplace、canny边缘提取()1. Sobel算⼦边缘提取注释:gray 灰度转换后的图像,前⾯省略了⼀部灰度转换的步骤,后⾯代码会补上1,表⽰x⽅向的差分阶数,1或0------------------------------>如果只写⼀个1,代表x⽅向提取---》1,01,表⽰y⽅向的差分阶数,1或0------------------------------->如果只写⼀个1,代表y⽅向提取---》0,1sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 1)#sobel算⼦边缘检测PointInvert_sobel=255-sobel#反⾊ place算⼦边缘提取注释:这⾥要说的是通过对⽐sobel算⼦的结果,发现Laplace⽐sobel效果更好,可以说是加强版,效果如下所⽰laplace = placian(gray, cv2.CV_8U, ksize=3)#laplace算⼦边缘检测PointInvert_laplace=255-laplace 3.Canny算⼦边缘提取注释:上⼀节提到过:其效果多变,主要是看设置的阈值的范围,当我们改变阈值后,图像后渐渐过滤掉⼀些背景,当然,重在阈值的选取上,当阈值选⼤的时候,也是会将图像的特征完全损坏的。
canny=cv2.Canny(gray, 50, 150)#canny边缘检测PointInvert_canny=255-canny#canny图像反⾊函数中阈值1和阈值2两者的⼩者⽤于边缘连接,⽽⼤者⽤来控制强边缘的初始段,推荐的⾼低阈值⽐在2:1到3:1之间⼆、四种图像的代码演⽰三、源码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Sobel算子是一种常用的边缘检测算法,它利用卷积运算来寻找图像中的边缘。
以下是使用Python和NumPy库实现Sobel算子的简单示例代码:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE)
# 使用Sobel算子进行边缘检测
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
# 计算梯度幅值和方向
gradient_magnitude = np.sqrt(sobel_x**2 + sobel_y**2)
gradient_direction = np.arctan2(sobel_y, sobel_x)
# 将梯度幅值映射到0-255范围
gradient_magnitude_normalized = cv2.normalize(gradient_magnitude, None, 0, 255, cv2.NORM_MINMAX)
# 显示原图和边缘检测结果
plt.subplot(2, 2, 1), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(sobel_x, cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(sobel_y, cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(gradient_magnitude_normalized, cmap='gray')
plt.title('Gradient Magnitude'), plt.xticks([]), plt.yticks([])
plt.show()
```
确保你已经安装了NumPy、OpenCV和Matplotlib库。
这个示例代码读取一张灰度图像,然后使用Sobel算子进行水平和垂直边缘检测。
最后,显示原始图像、Sobel X、Sobel Y以及梯度幅值的图像。