梯度运算
import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
def cvshow(name, ndarray):
# 第一个参数表示显示窗口的名字,第二个参数表示数据
cv2.imshow(name, ndarray)
# 表示等待多久窗口关闭,毫秒单位。0表示按任意键结束
cv2.waitKey(0)
cv2.destroyAllWindows()
Sobel算子
dst = cv2.Sobel( src, ddepth, dx, dy[,ksize[, scale[, delta[, borderType]]]] )
- ddepth:代表输出图像的深度
- dx和dy分别表示水平和竖直方向
- ksize 代表 Sobel 核的大小。该值为-1 时,则会使用 Scharr 算子进行运算
- scale 代表计算导数值时所采用的缩放因子,默认情况下该值是 1,是没有缩放的
- delta 代表加在目标图像 dst 上的值,该值是可选的,默认为 0
- borderType 代表边界样式
rec = cv2.imread("rectangle.png", cv2.IMREAD_GRAYSCALE)
cvshow("rec", rec)
# Sobel算子获取边缘
rec_sobel_x = cv2.Sobel(rec, -1, 1, 0)
cvshow("sobel_x", rec_sobel_x)
从程序可以看出,当参数 ddepth 的值为-1 时,只得到了内层的两条边界。这是因为,黑色框减去左边的白色像素值为负数,其在显示时被调整为 0,如果处理的图像是 8 位图类型,则在 ddepth
的参数值为-1 时,意味着指定运算结果也是 8 位图类型,那么所有负数会自动截断为 0,发生
信息丢失。为了避免信息丢失,在计算时要先使用更高的数据类型 cv2.CV_64F,再通过取绝
对值将其映射为 cv2.CV_8U(8 位图)类型。所以,通常要将函数 cv2.Sobel()内参数 ddepth 的
值设置为“cv2.CV_64F”。
在 OpenCV 中,使用函数 cv2.convertScaleAbs()对参数取绝对值
dst = cv2.convertScaleAbs( src [, alpha[, beta]] )
- dst 代表处理结果
- src 代表原始图像
- alpha 代表调节系数,该值是可选值,默认为 1
- beta 代表调节亮度值,该值是默认值,默认为 0
# Sobel算子获取边缘的标准步骤
rec_x = cv2.Sobel(rec, cv2.CV_64F, 1, 0)
rec_x = cv2.convertScaleAbs(rec_x)
rec_y = cv2.Sobel(rec, cv2.CV_64F, 0, 1)
rec_y = cv2.convertScaleAbs(rec_y)
res_sobel = cv2.addWeighted(rec_x, 0.5, rec_y, 0.5, 0)
cvshow("sobel", res_sobel)
Scharr算子
Scharr算子可以看成是sobel算子的改良版
laplacian算子
#不同算子的差异
lena = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(lena,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(lena,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
scharrx = cv2.Scharr(lena,cv2.CV_64F,1,0)
scharry = cv2.Scharr(lena,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
laplacian = cv2.Laplacian(lena,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
res = np.hstack((sobelxy,scharrxy,laplacian))
cvshow("res",res)