• OpenCV图像处理——图像梯度


    总目录

    图像处理总目录←点击这里

    七、图像梯度

    7.1、图像梯度-Sobel算子

    原图
    在这里插入图片描述

    直接计算

    不建议这么算

    sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
    sobelxy = cv2.convertScaleAbs(sobelxy) 
    cv_show(sobelxy,'sobelxy')
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    分别计算——合并

    当前位置的像素值等于sobel算子与(当前位置与周边位置8个点)进行对应位置相乘并相加操作,作为当前位置的像素点
    在这里插入图片描述
    G x = ( − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ) ∗ ( p 1 p 2 p 3 p 4 p 5 p 6 p 7 p 8 p 9 ) = ( p 3 − p 1 ) + ( 2 p 6 − 2 p 4 ) + ( p 9 − p 7 ) G_x=\left( 10+120+210+1 \right) *\left( p1p2p3p4p5p6p7p8p9 \right) =\left( p_3-p_1 \right) +\left( 2p_6-2p_4 \right) +\left( p_9-p_7 \right) Gx=121000+1+2+1p1p4p7p2p5p8p3p6p9=(p3p1)+(2p62p4)+(p9p7)

    dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

    • ddepth:图像的深度(有可能负数,cv2.convertScaleAbs解决)
    • dx和dy分别表示水平和竖直方向
    • ksize是Sobel算子的大小(一般3X3)

    Gx (右边减左边)cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)中1,0为取Gx

    deep可能有负值,白到黑是正数,黑到白就是负数了,所有的负数会被截断成0,效果如下

    img = cv2.imread('./image/pie.png',cv2.IMREAD_GRAYSCALE)
    def cv_show(img,name):
        cv2.imshow(name,img)
        cv2.waitKey()
        cv2.destroyAllWindows()
    sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
    cv_show(sobelx,'sobelx')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    deep的值要取绝对值cv2.convertScaleAbs,效果如下

    sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
    sobelx = cv2.convertScaleAbs(sobelx)
    cv_show(sobelx,'sobelx')
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    Gy(下面减上面)cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3) 中为0,1为

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

    在这里插入图片描述
    Gx和Gy求和

    sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
    cv_show(sobelxy,'sobelxy')
    
    • 1
    • 2

    在这里插入图片描述

    应用

    原图

    img = cv2.imread('./image/lena.jpg',cv2.IMREAD_GRAYSCALE)
    cv_show(img,'img')
    
    • 1
    • 2

    在这里插入图片描述
    Sobel算子,轮廓效果

    img = cv2.imread('./image/lena.jpg',cv2.IMREAD_GRAYSCALE)
    sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
    sobelx = cv2.convertScaleAbs(sobelx)
    sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
    sobely = cv2.convertScaleAbs(sobely)
    sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
    cv_show(sobelxy,'sobelxy')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    7.2、图像梯度-Scharr算子

    cv2.Scharr(src, ddepth, dx, dy, ksize)

    • ddepth:图像的深度(有可能负数,cv2.convertScaleAbs解决)
    • dx和dy分别表示水平和竖直方向
    • ksize是Sobel算子的大小(一般3X3)

    在这里插入图片描述

    img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
    scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
    scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
    scharrx = cv2.convertScaleAbs(scharrx)   
    scharry = cv2.convertScaleAbs(scharry)  
    scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 
    cv_show(scharrxy,'scharrxy')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    7.3、图像梯度-laplacian算子

    cv2.Scharr(src, ddepth, ksize)

    • ddepth:图像的深度(有可能负数,cv2.convertScaleAbs解决)
    • ksize是Sobel算子的大小(一般3X3)
      在这里插入图片描述
    laplacian = cv2.Laplacian(img,cv2.CV_64F)
    laplacian = cv2.convertScaleAbs(laplacian)
    cv_show(laplacian,'laplacian')
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    7.4、图像梯度-对比

    #不同算子的差异
    img = cv2.imread('./image/lena.jpg',cv2.IMREAD_GRAYSCALE)
    sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
    sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
    sobelx = cv2.convertScaleAbs(sobelx)   
    sobely = cv2.convertScaleAbs(sobely)  
    sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  
    
    scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
    scharry = cv2.Scharr(img,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(img,cv2.CV_64F)
    laplacian = cv2.convertScaleAbs(laplacian)
    
    res = np.hstack((sobelxy,scharrxy,laplacian))
    cv_show(res,'res')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

  • 相关阅读:
    Kotlin基础认知 - 为何Kotlin文件有的带.kt后缀,有的不带?
    开发模式学习
    C++鸟瞰(个人心得)
    redis 事务,深入解读
    2022-09-09 mysql数据库连接池的1.0实现
    【Redis专题】大厂生产级Redis高并发分布式锁实战
    第六章:接口
    Unity中国成立,以应对国内日益严格的数据处理法规
    LLaMA模型系统解读
    Linux编辑器-gcc/g++使用
  • 原文地址:https://blog.csdn.net/weixin_44635198/article/details/127850837