边缘检测一般步骤:
第一步:滤波;常用滤波方法为高斯滤波。
第二步:增强;可以将图像有显著变化的地方凸显出来。
第三步:检测;通过阈值化的方法检测。
注:Laplacian算子、sobel算子和Scharr算子都带方向,可获得X方向、Y方向和最终合成的效果图。
函数调用:
void Canny ( InputArray image,OutputArray edges,double threshold1,double threshold2,int apertureSize = 3,bool L2gradient = false )
参数详解如下:
image - 8位输入图像。
edges - 输出边缘图; 单通道8位图像,与图像大小相同 。
threshold1 - 滞后过程的第一个阈值。
threshold2 - 滞后过程的第二个阈值。
apertureSize - Sobel()运算符的孔径大小。
L2gradient - 一个标志,指示是否 应使用更准确的 L_2 范数 = \ sqrt {(dI / dx)^ 2 +(dI / dy)^ 2}来计算图像梯度幅度(L2gradient = true),或者默认 L_1 范数 = |的dI / DX | + |的dI / DY | 是否足够(L2gradient = false)。
实际应用:
Canny(pGrayImage, pCannyImage, pos, pos*3, 3);
函数调用:
cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) → edges
实际应用-----Python:
edges = cv2.Canny(img,100,200)
函数调用:
void Sobel ( InputArray src,OutputArray dst,int ddepth,int dx,int dy,int ksize = 3,double scale = 1,double delta = 0,int borderType = BORDER_DEFAULT )
参数详解如下:
src - 输入图像。
dst - 输出与src相同大小和相同通道数的图像 。
ddepth -
输出图像深度; 支持以下src.depth()和ddepth组合:
src.depth() = CV_8U, ddepth = -1 / CV_16S / CV_32F / CV_64F
src.depth() = CV_16U / CV_16S, ddepth = -1 / CV_32F / CV_64F
src.depth() = CV_32F, ddepth = -1 / CV_32F / CV_64F
src.depth() = CV_64F, ddepth = -1 / CV_64F
当ddepth = -1时,目标图像将具有与源相同的深度; 在8位输入图像的情况下,它将导致截断的导数。
xorder - 导数x的顺序。
yorder - 导数y的顺序。
ksize - 扩展Sobel内核的大小; 它必须是1,3,5或7。
scale - 计算导数值的可选比例因子; 默认情况下,不应用缩放(有关详细信息,请参阅 getDerivKernels())。
delta - 在将结果存储在dst之前添加到结果中的可选delta值。
borderType - 像素外推方法(有关详细信息,请参阅 borderInterpolate)。
实际应用:
Sobel(src, dst, -1,0,1);
函数调用:
cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst
实际应用-----Python:
cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst
函数调用:
void Laplacian ( InputArray src,OutputArray dst,int ddepth,int ksize = 1,double scale = 1,double delta = 0,int borderType = BORDER_DEFAULT )
参数详解如下:
src - 源图像。
dst - 与src相同大小和相同通道数的目标图像 。
ddepth - 目标图像的所需深度。
ksize - 用于计算二阶导数滤波器的孔径。有关详细信息,请参阅 getDerivKernels()。大小必须是正面和奇数。
scale - 计算的拉普拉斯算子值的可选比例因子。默认情况下,不应用缩放。有关详细信息,请参阅 getDerivKernels()。
delta - 在将结果存储在dst之前添加到结果中的可选增量值 。
borderType - 像素外推法。有关详细信息,请参阅 borderInterpolate。
实际应用:
Laplacian( src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT );
函数调用:
cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst
实际应用-----Python:
cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst
函数调用:
void Scharr ( InputArray src,OutputArray dst,int ddepth,int dx,int dy,double scale = 1,double delta = 0,int borderType = BORDER_DEFAULT )
参数详解如下:
src - 输入图像。
dst - 输出与src相同大小和相同通道数的图像。
ddepth - 输出图像深度(有关src.depth()和ddepth支持的组合列表,请参阅Sobel()。
dx - 导数x的阶数。
dy - 导数y的顺序。
scale - 计算导数值的可选比例因子; 默认情况下,不应用缩放(有关详细信息,请参阅 getDerivKernels())。
delta - 在将结果存储在dst之前添加到结果中的可选delta值。
borderType - 像素外推方法(有关详细信息,请参阅 borderInterpolate)。
实际应用:
Laplacian( src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT );
函数调用:
Scharr(src, grad_y, CV_8U, 0, 1, 1, 0, BORDER_DEFAULT);
实际应用-----Python:
cv2.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]]) → dst
python
import cv2
import numpy as np
img = cv2.imread('github1.jpg')
cv2.imshow("res", img)
res = cv2.resize(img,(400, 400), interpolation = cv2.INTER_CUBIC)
gray=cv2.cvtColor(res,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)
canny = cv2.Canny(gray,50,100)
cv2.imshow("canny", canny)
sobel = cv2.Sobel(gray, cv2.CV_64F, 1, 1, ksize=3)
cv2.imshow("sobel", sobel)
Laplacian=cv2.Laplacian(gray,cv2.CV_16S,ksize=1)
#cv2.imshow("Laplacian", Laplacian)这时输出没有任何图形,需要进行下一步变换
Laplacian_result = cv2.convertScaleAbs(Laplacian)
cv2.imshow("Laplacian", Laplacian_result)
x = cv2.Scharr(gray, cv2.CV_32F, 1, 0) #X方向
y = cv2.Scharr(gray, cv2.CV_32F, 0, 1) #Y方向
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Scharr = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
cv2.imshow("Scharr", Scharr)
cv2.waitKey(0)
cv2.destroyAllWindows()