Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子

这篇具有很好参考价值的文章主要介绍了Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Roberts算子

Roberts算子即交叉微分算子,是基于交叉差分的梯度算子。此算法通过局部差分来计算检测图像的边缘线条,对噪声敏感。

Roberts交叉微分算子分别为主对角线和副对角线方向的算子,有两个2*2的滤波算子组成:

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子

对于图像而言,如果im表示图像像素矩阵,则可以如下计算(i,j)点处的特征值:

|im(i,j)-im(i+1,j+1)|+|im(i+1,j)-im(i,j+1)|

完整代码如下: 

import cv2
import numpy as np
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
im=cv2.imread('C:/Users/bwy/Desktop/lena.bmp',cv2.IMREAD_GRAYSCALE)
cv_show('im',im)
m,n=im.shape
eIm=np.zeros([m,n])
for i in range(m-1):
    for j in range(n-1):
        eIm[i,j]=abs(im[i,j]-im[i+1,j+1])+abs(im[i+1,j]-im[i,j+1])
eim=eIm.astype(np.uint8)
res=np.hstack((im,eim))
cv_show('res',res)

结果如图所示:

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子

 二、Sobel算子

        Sobel算子结合了高斯模糊和一阶微分并计算图像明暗程度的近似值,通过比较图像边缘的明暗程度把该区域内超过阈值的特定像素点记为边缘点。Sobel算子具有一定的平滑作用,对噪声不敏感。

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子

手写代码如下:

def sobel(image):
    filterX=np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
    filterY=np.array([[-1,-2,-1],[0,0,0],[1,1,2,]])
    w,h=im.shape
    edgeim=np.zeros((w,h))
    theta=np.zeros((w,h))
    half_mF=np.floor(mF/2)
    half_mF1=half_mF.astype(int)
    for i in range(m-1):
        for j in range(n-1):
            localImage=data[i:i+mF,j:j+nF]
            edgeImX=abs(sum(sum(localImage*filterX)))
            edgeImY=abs(sum(sum(localImage*filterY)))
            edgeim[i,j]=max( edgeImX,edgeImY)
            edgeim=edgeim.astype(np.uint8)
            if edgeImX == 0:   
                theta[i, j] = np.pi / 2
            else:
                theta[i, j] = np.arctan(edgeImY/ edgeImX)
    return edgeim,theta

测试:

a,b=sobel(im)
r=np.hstack((im,a))
cv_show('r',r)

结果如图所示:

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子

 sobel算子 opencv中调包使用(详细介绍)

To begin with,我们看函数:

Dst=cv2.Sobel(im,ddepth,dx,dy,ksize)

参数解释:

Ddepth代表:图像的深度(一般为-1表示输入深度和输出深度一样)

dx,dy代表:水平方向和竖直方向(谁为1代表在哪个方向)

ksize是Sobel算子的大小

Next

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子对应项相乘Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子在求和=p3+2*p6+p9-p1-2p4-p7(这这里我们会发现在x方向是右减左,那我们运行一下程序看结果如何。

Img=cv2.imread('C:/Users/bwy/Desktop/2.png',cv2.IMREAD_GRAYSCALE)
sobelx=cv2.Sobel(Img,cv2.CV_64F,1,0,ksize=3)
cv_show('sobelx',sobelx)

 解释说明一下cv2.CV_64F:在我们进行计算的时候会出现正数和负数都存在,opencv会自动拦截将负数变成零,因此我们需要强制换成负数形式,这就是它的含义。

 结果如图所示:

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子

 左图是操作过的图,右图是原图。

看到这个左图像,想大家都会有疑问,咦???右边的呢咋没了呢?是因为我们前面说了,在计算的时候是右减左,大家看原图,当把这个圆2从中间分开,左半部分在进行计算的时候 ,是不是白减黑因此它是大于零的,而右半部分黑减白是小于零的,就没了,因此我们需要取绝对值。我们在实现以下代码。

sobelx1=cv2.Sobel(Img,cv2.CV_64F,1,0,ksize=3)
sobelx1=cv2.convertScaleAbs(sobelx1)
cv_show('sobelx1',sobelx1)

 结果如图所示:

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子

上下是点点因此我们再看一下Sobel因子,我就不写计算过程了,在y方向上是下减上 。看一下代码吧:

sobely=cv2.Sobel(Img,cv2.CV_64F,0,1,ksize=3)
sobely=cv2.convertScaleAbs(sobely)
cv_show('sobely',sobely)

 结果如图所示:

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子

 Finished,分别计算x,y之后再求和:

sobelxy=cv2.addWeighted(sobelx1,0.5,sobely,0.5,0)

结果如图所示:

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子

 三、Scharr算子、Laplacian算子

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子和上面的很像,但它的数更大,效果就会更详细,后面看区别很容易看出来。 而Laplacian算子是一种具有旋转不变性的各向同性的二阶微分算子。Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子我们观察这个算子是四周减去中间,由于它对噪音很敏感所以很少单独用。

四、Sobel算子、Scharr算子、Laplacian算子的差异

#不同算子的差异
im=cv2.imread('C:/Users/bwy/Desktop/lena.bmp',cv2.IMREAD_GRAYSCALE)
sobelxx=cv2.Sobel(im,cv2.CV_64F,1,0,ksize=3)
sobelyy=cv2.Sobel(im,cv2.CV_64F,0,1,ksize=3)
sobelyy=cv2.convertScaleAbs(sobelyy)
sobelxx=cv2.convertScaleAbs(sobelxx)
sobelxxyy=cv2.addWeighted(sobelxx,0.5,sobelyy,0.5,0)

scharrx=cv2.Scharr(im,cv2.CV_64F,1,0)
scharry=cv2.Scharr(im,cv2.CV_64F,0,1)
scharrx=cv2.convertScaleAbs(scharrx)
scharry=cv2.convertScaleAbs(scharry)
scharrxy=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)

laplacian=cv2.Laplacian(im,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
RR=np.hstack((im,sobelxxyy,scharrxy,laplacian))
cv_show("RR",RR)

 结果如图所示:

Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子神奇吧! 文章来源地址https://www.toymoban.com/news/detail-440032.html

到了这里,关于Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图像处理】基于matlab边缘检测 Sobel、Roberts、Prewitt

    Sobel 算子算子包含两组 3x3 的矩阵,如图所示: 对于图像而言,取 3 行 3 列的图像数据,将图像数据与对应位置的算子的值相乘再相加,得到 x 方向的 Gx ,和 y 方向的 Gy ,将得到的 Gx 和 Gy ,平方后相加,再取算术平方根,得到 Gxy ,近似值为 Gx 和 Gy 绝对值之和,将计算得

    2024年02月04日
    浏览(42)
  • Python图像锐化及边缘检测(Roberts、Prewitt、Sobel、Lapllacian、Canny、LOG)

    目录 图像锐化概述 算法方法介绍  代码实现 效果展示 图像锐化 (image sharpening) 是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波

    2023年04月17日
    浏览(34)
  • OpenCV(7):边缘检测之Sobel算子,Scharr算子,Laplacian算子和Canny算子边缘检测

    Sobel算子、Scharr算子、Laplacian算子和Canny算子都是常用的图像边缘检测算法。它们可以用来识别图像中物体之间的边界,从而对物体进行定位、跟踪、分割、识别等处理。 Sobel算子和Scharr算子都是基于卷积运算实现的边缘检测算法。Sobel算子使用两个3×3的矩阵对原始图像进行卷

    2024年02月05日
    浏览(40)
  • Python从零到壹丨详解图像锐化Roberts、Prewitt算子实现边缘检测

    摘要: 图像锐化和边缘提取技术可以消除图像中的噪声,提取图像信息中用来表征图像的一些变量,为图像识别提供基础。本章主要介绍Robert算子、Prewitt算子、Sobel算子、Laplacian算子、Scharr算子等。 本文分享自华为云社区《[Python从零到壹] 五十七.图像增强及运算篇之图像锐

    2024年02月05日
    浏览(42)
  • 【OpenCv • c++】基础边缘检测算子 —— Sobel

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月03日
    浏览(35)
  • 【OpenCV学习】第16课:图像边缘提取 - Sobel算子详细剖析(图像梯度)

    理论 卷积的应用 - 图像边缘提取: 边缘是什么:是像素值发生跃迁的地方, 是图像的显著特征之一, 再图像特征提取丶对象检测丶模式识别等方面都有重要作用 如何捕捉/提取边缘:对图像求它的一阶导数,delta = f(x) - f(x-1), delta值越大, 说明像素在x方向变化越大,边缘信

    2024年02月04日
    浏览(30)
  • 模式识别与图像处理课程实验一:图像处理实验(颜色算子实验、Susan、Harris角点检测实验、 sobel边缘算子检测实验)

    要求编写一个包含颜色算子,Susan,Harris,角点,sobel边缘算子的程。 实验的程序如下 运行结果如下 实验原图 实验结果图 实验的程序如下 运行结果如下 实验原图 实验结果图 实验的程序如下 运行结果如下 实验原图 实验结果图 Susan角点检测程序如下 运行结果如下 实验原图

    2024年02月02日
    浏览(28)
  • 边缘检测——Roberts算子

    采用对角线方向相邻两象素之差近似梯度幅值检测边缘,是一个 2x2 的模版,模板分为水平方向和垂直方向。 模板:  计算公式: 最终计算公式:   原理: [说明] 边缘检测的对象只能是灰度图片 为什么这样的公式可以计算灰度图片的边缘呢?其实该公式利用的是物体边缘处

    2024年02月04日
    浏览(32)
  • openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读 ?????OpenCV实战系列总目录

    打印一个图片可以做出一个函数: Canny是一个科学家在1986年写了一篇论文,所以用自己的名字来命名这个检测算法,Canny边缘检测算法这里写了5步流程,会用到之前《openCV实战-系列教程》的内容。  使用高斯滤波器,以平滑图像,滤除噪声。 计算图像中每个像素点的梯度强

    2024年02月11日
    浏览(35)
  • OpenCV15-图像边缘检测:Sobel、Scharr、Laplace、Canny

    图像的边缘指的是图像中像素灰度值突然发生变化的区域,如果将图像中的每一行像素和每一列像素都描述成一个关于灰度值的函数,那么图像的边缘对应在灰度值函数中是函数值突然变大的区域。函数值得变化趋势可以用导数描述,当函数值突然变大时,导数也必然会变大

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包