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


    一、Roberts算子

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

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

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

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

    完整代码如下: 

    1. import cv2
    2. import numpy as np
    3. def cv_show(name,img):
    4. cv2.imshow(name,img)
    5. cv2.waitKey(0)
    6. cv2.destroyAllWindows()
    7. im=cv2.imread('C:/Users/bwy/Desktop/lena.bmp',cv2.IMREAD_GRAYSCALE)
    8. cv_show('im',im)
    9. m,n=im.shape
    10. eIm=np.zeros([m,n])
    11. for i in range(m-1):
    12. for j in range(n-1):
    13. eIm[i,j]=abs(im[i,j]-im[i+1,j+1])+abs(im[i+1,j]-im[i,j+1])
    14. eim=eIm.astype(np.uint8)
    15. res=np.hstack((im,eim))
    16. cv_show('res',res)

    结果如图所示:

     二、Sobel算子

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

    手写代码如下:

    1. def sobel(image):
    2. filterX=np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
    3. filterY=np.array([[-1,-2,-1],[0,0,0],[1,1,2,]])
    4. w,h=im.shape
    5. edgeim=np.zeros((w,h))
    6. theta=np.zeros((w,h))
    7. half_mF=np.floor(mF/2)
    8. half_mF1=half_mF.astype(int)
    9. for i in range(m-1):
    10. for j in range(n-1):
    11. localImage=data[i:i+mF,j:j+nF]
    12. edgeImX=abs(sum(sum(localImage*filterX)))
    13. edgeImY=abs(sum(sum(localImage*filterY)))
    14. edgeim[i,j]=max( edgeImX,edgeImY)
    15. edgeim=edgeim.astype(np.uint8)
    16. if edgeImX == 0:
    17. theta[i, j] = np.pi / 2
    18. else:
    19. theta[i, j] = np.arctan(edgeImY/ edgeImX)
    20. return edgeim,theta

    测试:

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

    结果如图所示:

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

    To begin with,我们看函数:

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

    参数解释:

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

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

    ksize是Sobel算子的大小

    Next

    对应项相乘在求和=p3+2*p6+p9-p1-2p4-p7(这这里我们会发现在x方向是右减左,那我们运行一下程序看结果如何。

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

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

     结果如图所示:

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

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

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

     结果如图所示:

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

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

     结果如图所示:

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

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

    结果如图所示:

     三、Scharr算子、Laplacian算子

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

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

    1. #不同算子的差异
    2. im=cv2.imread('C:/Users/bwy/Desktop/lena.bmp',cv2.IMREAD_GRAYSCALE)
    3. sobelxx=cv2.Sobel(im,cv2.CV_64F,1,0,ksize=3)
    4. sobelyy=cv2.Sobel(im,cv2.CV_64F,0,1,ksize=3)
    5. sobelyy=cv2.convertScaleAbs(sobelyy)
    6. sobelxx=cv2.convertScaleAbs(sobelxx)
    7. sobelxxyy=cv2.addWeighted(sobelxx,0.5,sobelyy,0.5,0)
    8. scharrx=cv2.Scharr(im,cv2.CV_64F,1,0)
    9. scharry=cv2.Scharr(im,cv2.CV_64F,0,1)
    10. scharrx=cv2.convertScaleAbs(scharrx)
    11. scharry=cv2.convertScaleAbs(scharry)
    12. scharrxy=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
    13. laplacian=cv2.Laplacian(im,cv2.CV_64F)
    14. laplacian=cv2.convertScaleAbs(laplacian)
    15. RR=np.hstack((im,sobelxxyy,scharrxy,laplacian))
    16. cv_show("RR",RR)

     结果如图所示:

    神奇吧! 

  • 相关阅读:
    挑战10个最难的Java面试题(附答案)【上】
    Linux常用命令解析
    【毕业设计】27-基于单片机的家庭监控及防盗报警_热释电报警_人体系统工程设计(原理图+源代码+仿真+实物照片+答辩论文)
    python的自定义函数的用法和实例
    使用Python 3脚本自动化Harbor镜像复制
    牛客练习赛106 E(二分图捏)
    selenium 根据【关键词】获取知网文献信息
    经典算法之折半查找法
    一些好玩的小游戏
    LeetCode 双周赛 103(2023/04/29)区间求和的树状数组经典应用
  • 原文地址:https://blog.csdn.net/m0_72662900/article/details/126712811