美文网首页
opencv+python求图像梯度

opencv+python求图像梯度

作者: 1直领悟不够 | 来源:发表于2019-03-28 21:25 被阅读0次

    由于对图像求导后,结果有正有负,且有可能超出255,所以求梯度时要注意像素的数值类型,这里给出两种解决方法:

    1. 求梯度时将像素的数值类型转换为cv2.CV_16S来存放可能超出范围的结果,求导结束后再将其转回uint8
    import cv2
    import math
    import numpy as np
    
    img = cv2.imread("d:\\dmx.bmp",0)
    h,w = img.shape[:2]
    x=cv2.Sobel(img, cv2.CV_16S, 1, 0, ksize=3)
    y=cv2.Sobel(img, cv2.CV_16S, 0, 1, ksize=3)
     
    absX=cv2.convertScaleAbs(x)   # 在经过处理后,需要用convertScaleAbs()函数将其转回原来的uint8形式,否则将无法显示图像,而只是一副灰色的窗口。
    absY=cv2.convertScaleAbs(y)
    
    dst = cv2.addWeighted(absX,0.5,absY,0.5,0)  #由于Sobel算子是在两个方向计算的,最后还需要用cv2.addWeighted(...)函数将其组合起来
    cv2.imshow('dst',dst)
    cv2.waitKey()
    
    src.jpg
    dst.jpg
    1. 求梯度时直接用cv2.CV_32F类型保存结果,这样更精确,但结果会超出范围,所以无法显示中间结果(图片是花的),imshow时可能会报错,求导结束后将cv2.CV_32F转为uint8
    sobelX = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=3)
    sobelY = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=3)
    mag, ang = cv2.cartToPolar(sobelX, sobelY)
    

    相关文章

      网友评论

          本文标题:opencv+python求图像梯度

          本文链接:https://www.haomeiwen.com/subject/eqhhbqtx.html