Opencv Sobel算子用法


先贴官方文档:Sobel API文档

opencv 版本 4.0.1

Sobel API 用法

  1. 彩色图像由opencv读入,并转为灰度图。此时图像格式为uint8,值范围在[0,255]

    IMAGE = cv2.imread(IMAGE_PATH, 1)#读入彩色图像
    IMAGE = cv2.resize(IMAGE, (W, H), interpolation=cv2.INTER_CUBIC)#缩放
    IMAGE_GRAY = cv2.cvtColor(IMAGE,cv2.COLOR_BGR2GRAY)#转为灰度图
     
    IMAGE.dtype -> dtype('uint8')
    IMAGE.shape -> (H,W,C)
    IMAGE_GRAY.dtype -> dtype('uint8')
    IMAGE_ GRAY.shape -> (H,W)
  2. 使用Sobel算子API,对两个方向求导
    第一个参数为待处理的灰度图像
    第二个参数没有找到很好的解释,我理解是Sobel算子运算过程中用什么类型保存临时结果,因为Sobel计算时值的范围会超出[0,255](也就是uint8的范围),直接影响到保存值的位
    第三、四、五参数为选择求导的两个方向,和卷积核大小

    x = cv2.Sobel(IMAGE_GRAY, cv2.CV_16S, dx=1, dy=0,ksize=3)  # x方向求导
    y = cv2.Sobel(IMAGE_GRAY, cv2.CV_16S, dx=0, dy=1,ksize=3)  # y方向求导
    
    
    x.dtype - > dtype('int16')
    y.dtype - > dtype('int16')
  3. 转换为uint8类型
    经过Sobel算子API计算的结果,值范围会越过[0,255]的区间。因此首先要将结果转为uint8类型的范围内,便于后续操作和显示。
    x = cv2.convertScaleAbs(x)
    y = cv2.convertScaleAbs(y)
    要注意的是convertScaleAbs函数只是取了绝对值(alpha和beta为默认值时),和限制值的类型为uint8和范围区间[0,255]。
    # 函数接口及参数
    cv2.convertScaleAbs(scr,dst,alpha=1,beta=0) -> dst
    dst[I]
    = uint8(abs|scr[I] * alpha + beta|) 计算公式,其中i为通道索引
  4. 显示结果
    先把对x、y方向求导的结果,按权重合并在一起,第五个偏执参数为gamma。result = x * x_weight + y * y_weight + gamma
    result = cv2.addWeighted(x,0.5,y,0.5,0)
    result.dtype -> dtype('uint8')

  5. 注意结果格式,其类型为uint8,值范围在[0,255]

 Sobel API 理论
待更新