Opencv Sobel算子用法
先贴官方文档:Sobel API文档
opencv 版本 4.0.1
Sobel API 用法
-
彩色图像由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)
-
使用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')
- 转换为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为通道索引 - 显示结果
先把对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')
- 注意结果格式,其类型为uint8,值范围在[0,255]
Sobel API 理论
待更新