zoukankan      html  css  js  c++  java
  • Python+OpenCV图像处理之图像梯度

    图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导

    OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Lapacian。Sobel,Scharr其实就是求一阶或二阶导。Scharr是对Sobel的部分优化。Laplacian是求二阶导。

    python实现

    import cv2
    import numpy as np
    
    
    __author__ = "boboa"
    
    # Sobel算子
    def sobel_demo(image):
        gray_x = cv2.Sobel(image, cv2.CV_32F, 1, 0)  # x方向一阶导数
        gray_y = cv2.Sobel(image, cv2.CV_32F, 0, 1)  # y方向一阶导数
        gradx = cv2.convertScaleAbs(gray_x)  # 转回原来的uint8形式
        grady = cv2.convertScaleAbs(gray_y)
        gradxy = cv2.addWeighted(gradx, 0.5, grady, 0.5, 0)  # 图像融合
        cv2.imshow("gradient-x", gradx)
        cv2.imshow("gradient-y", grady)
        cv2.imshow("gradient_xy", gradxy)
    
    
    # Scharr算子是Sobel算子的增强版本
    def scharr_demo(image):
        grad_x = cv2.Scharr(image, cv2.CV_32F, 1, 0)
        grad_y = cv2.Scharr(image, cv2.CV_32F, 0, 1)
        gradx = cv2.convertScaleAbs(grad_x)
        grady = cv2.convertScaleAbs(grad_y)
        cv2.imshow("gradient_x", gradx)
        cv2.imshow("gradient_y", grady)
        gradxy = cv2.addWeighted(gradx, 0.5, grady, 0.5, 0)
        cv2.imshow("gradient_xy", gradxy)
    
    
    def lapalian_demo(image): #拉普拉斯算子
        dst = cv2.Laplacian(image, cv2.CV_32F)
        lpls = cv2.convertScaleAbs(dst)
        # 自己定义卷积核
        # kernel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
        # dst = cv2.filter2D(image, cv2.CV_32F, kernel=kernel)
        lpls = cv2.convertScaleAbs(dst) #单通道
        cv2.imshow("lapalian", lpls)
    
    
    if __name__ == "__main__":
        img = cv2.imread("image/img8.jpg")
        cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
        cv2.imshow("input image", img)
        lapalian_demo(img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

    Sobel算子x和y方向的梯度,xy方向的梯度

    Scharr算子

     拉普拉斯算子

    cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
    参数:src-需要处理的图像

         ddepth-图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度

         dx-x方向上的差分阶数,1或0

         dy-y方向上的差分阶数,1或0

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

    参数:src-输入需要处理的图像

         ddepth-输出图像深度,针对不同的输入图像,输出目标图像有不同的深度

         dst-输出与src相同大小和相同通道数的图像

         ksize-用于计算二阶导数滤波器的孔径大小,大小必须是正数和奇数

         scale-计算拉普拉斯算子值的比例因子,默认情况下没有伸缩系数

         delta-一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中

         borderType-判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT

    cv2.convertScaleAbs(src[, dst[, alpha[, beta]]]) -> dst使用线性变换转换输入数组元素成8位无符号整型

    参数:src-原数组

         dst-输出数组 

         alpha-比例因子

         beta-原数组元素按比例缩放后添加的值

    cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst

    参数:src1-需要加权的第一个输入数组

         alpha-第一个数组的权重

         src2-第二个输入数组,它和第一个数组拥有相同的尺寸和通道数

         beta-第二个数组的权重

         gamma-一个加到权重总和上的标量值

         dst-输出的数组,它和输入的两个数组拥有相同的尺寸和通道数

         dtype-输出数组的可选深度。当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()

  • 相关阅读:
    Oracle 分区表管理之组合分区(分区索引失效与性能比较以及12.2c分区表新特性)
    博客搬家了
    Java中文件操作
    Java中的LinkedList介绍
    Android数据缓存
    Android QQ空间浏览图片动画特效的实现(※)
    关于android中线性布局的layout_gravity属性
    Android中AutoCompleteTextView的使用
    Android中GridView使用总结
    Android实现自适应正方形GridView(陌陌引导页面效果)
  • 原文地址:https://www.cnblogs.com/qianxia/p/11096993.html
Copyright © 2011-2022 走看看