Opencv图像处理系列(六)—— 图像梯度

栏目: 编程工具 · 发布时间: 5年前

内容简介:下面的例子,分别用不同尺寸的高斯内核,利用sobel算子/scharr算子计算图像x/y方向的梯度,并将xy方向的梯度简单的混合一下求个近似梯度:laplacian算子内部以sobel算子,在图像的x/y方向求二阶导数来检测边缘部分

Sobel算子在使用高斯平滑的情况下对图像像素进行x/y方向上的微分一阶求导,具有一定的抗噪性。opencv提供的sobel求导函数可以指定求导函数的x/y方向,还可以通过参数ksize指定内核的大小。如果ksize=-1,则使用3x3 Scharr算子,由于使用了不同的高斯内核,其效果优于3x3 Sobel滤波器,求导结果更为精确,梯度更为灵敏。

sobel的高斯内核:

Opencv图像处理系列(六)—— 图像梯度

scharr的高斯内核:

Opencv图像处理系列(六)—— 图像梯度

下面的例子,分别用不同尺寸的高斯内核,利用sobel算子/scharr算子计算图像x/y方向的梯度,并将xy方向的梯度简单的混合一下求个近似梯度:

def testSobel():
    img = cv2.imread('test2.jpg', 0)

    sobelx_3 = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
    sobely_3 = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)

    sobelx_5 = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
    sobely_5 = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)

    scharrx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=-1)
    scharry = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=-1)

    sobelxy_3 = cv2.addWeighted(sobelx_3, 0.5, sobely_3, 0.5, 0)
    sobelxy_5 = cv2.addWeighted(sobelx_5, 0.5, sobely_5, 0.5, 0)
    scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)

    # plt.subplot(121), pltShow(sobelx_3), plt.title("sobelx_3")
    # plt.subplot(122), pltShow(sobely_3), plt.title("sobely_3")

    # plt.subplot(121), pltShow(sobelx_5), plt.title("sobelx_5")
    # plt.subplot(122), pltShow(sobely_5), plt.title("sobely_5")

    # plt.subplot(121), pltShow(scharrx), plt.title("scharrx")
    # plt.subplot(122), pltShow(scharry), plt.title("scharry")

    # plt.subplot(121), pltShow(sobelxy_3), plt.title("sobelxy_3")
    # plt.subplot(122), pltShow(sobelxy_5), plt.title("sobelxy_5")

    plt.subplot(121), pltShow(scharrxy), plt.title("scharrxy")
    plt.subplot(122), pltShow(img), plt.title("origin")

    plt.show()

Opencv图像处理系列(六)—— 图像梯度 Opencv图像处理系列(六)—— 图像梯度 Opencv图像处理系列(六)—— 图像梯度 Opencv图像处理系列(六)—— 图像梯度 Opencv图像处理系列(六)—— 图像梯度

2.Laplacian算子

laplacian算子内部以sobel算子,在图像的x/y方向求二阶导数来检测边缘部分

计算公式为:

Opencv图像处理系列(六)—— 图像梯度

def testLaplacian():
    img = cv2.imread('test2.jpg', 0)
    laplacian = cv2.Laplacian(img, cv2.CV_64F)
    plt.subplot(121), pltShow(img), plt.title("origin")
    plt.subplot(122), pltShow(laplacian), plt.title("laplacian")
    plt.show()

Opencv图像处理系列(六)—— 图像梯度

3. 输出值类型问题

sobel算子输出结果的时候有个问题,图像像素灰度值由低到高的时候,一阶导数为正值,由高到底的时候,则是负值,此时如果输出结果是uint8类型,则负值会被丢弃,丢失掉这部分信息。

这点要注意,如果实在需要uint8的结果,可以用其它字段类型如64f等,得到最终结果后取绝对值转为uint8。

def testOutputType():
    img = cv2.imread('box.png', 0)
    # Output dtype = cv2.CV_8U
    sobelx8u = cv2.Sobel(img, cv2.CV_8U, 1, 0, ksize=5)
    # Output dtype = cv2.CV_64F. Then take its absolute and convert to cv2.CV_8U
    sobelx64f = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
    abs_sobel64f = np.absolute(sobelx64f)
    sobel_8u = np.uint8(abs_sobel64f)
    plt.subplot(1, 3, 1), plt.imshow(img, cmap='gray')
    plt.title('Original'), plt.xticks([]), plt.yticks([])
    plt.subplot(1, 3, 2), plt.imshow(sobelx8u, cmap='gray')
    plt.title('Sobel CV_8U'), plt.xticks([]), plt.yticks([])
    plt.subplot(1, 3, 3), plt.imshow(sobel_8u, cmap='gray')
    plt.title('Sobel abs(CV_64F)'), plt.xticks([]), plt.yticks([])
    plt.show()

Opencv图像处理系列(六)—— 图像梯度


以上所述就是小编给大家介绍的《Opencv图像处理系列(六)—— 图像梯度》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大数据供应链

大数据供应链

娜达·R·桑德斯 (Nada R. Sanders) / 丁晓松 / 中国人民大学出版社 / 2015-7-1 / CNY 55.00

第一本大数据供应链落地之道的权威著作,全球顶级供应链管理专家娜达·桑德斯博士聚焦传统供应链模式向大数据转型,助力工业4.0时代智能供应链构建。 在靠大数据驱动供应链处于领先地位的企业中,45% 是零售商,如沃尔玛、亚马逊,而22%是快消企业,如戴尔电脑。他们都前所未有地掌控了自己的供应链。在库存管理、订单履行率、原材料和产品交付上具有更为广阔的视野。利用具有预见性的大数据分析结果,可以使供需......一起来看看 《大数据供应链》 这本书的介绍吧!

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具