目录
1.Laplacian算子边缘检测
原理:
Laplacian边缘检测函数Laplacian()
示例代码:
2.Canny算子边缘检测
原理:
Canny算法函数Canny()
示例代码:
Laplacian算子的原理基于图像的二阶导数。一阶导数可以帮助我们检测图像中的边缘,而二阶导数则可以检测边缘的交叉点,即图像中的角点。
Laplacian算子定义为二阶空间导数的和,在二维情况下用于图像处理,其离散形式如下:
L(x, y) = d^2(I(x, y)) / dx^2 + d^2(I(x, y)) / dy^2
其中,I(x, y)表示图像中的像素值,d^2表示偏导数,dx表示在X方向上的导数,dy表示在Y方向上的导数。
Laplacian算子可以通过应用离散卷积来计算。一种常见的离散Laplacian算子模板如下:
通过将该模板与图像进行卷积操作,我们可以计算图像中每个像素的Laplacian响应。
具体步骤如下:
Laplacian算子的输出结果是一个表示边缘的高频分量图像。边缘通常显示为明亮像素与暗亮像素之间的边界。边缘的宽度和强度取决于Laplacian算子的大小和图像中的灰度变化。
void cv::Laplacian ( InputArray src,
OutputArray dst,
int ddepth,
int ksize = 1,
double scale = 1,
double delta =0,
int borderType = BORDER DEFAULT
)
void Laplacian_f(Mat image){
Mat gray;
cvtColor(image,gray,COLOR_BGR2GRAY);
Mat result,result_g,result_G;
//未滤波提取边缘
Laplacian(gray,result,CV_16S,3,1,0);
convertScaleAbs(result,result);
//滤波后提取边缘
GaussianBlur(gray,result_g,Size(3,3),5,0);//高斯滤波
Laplacian(result_g,result_G,CV_16S,3,1,0);
convertScaleAbs(result_G,result_G);
//显示图像
imwrite("/sdcard/DCIM/result.png",result);
imwrite("/sdcard/DCIM/result_G.png",result_G);
}
(未滤波提取边缘图像) (滤波后提取边缘图像)
void cv::Canny ( InputArray image,
OutputArray edges,
double threshold1,
double threshold2,
int apertureSize = 3,
bool L2gradient = false
)
void Canny_f(Mat image){
Mat gray;
cvtColor(image,gray,COLOR_BGR2GRAY);
Mat resultHigh,resultLow,resultG;
//大阈值检测图像边缘
Canny(image,resultHigh,100,200,3);
//小阈值检测图像边缘
Canny(image,resultLow,20,40,3);
//高斯模糊后检测图像边缘
GaussianBlur(gray,resultG,Size(3,3),5);
Canny(resultG,resultG,100,200,3);
//显示图像
imwrite("/sdcard/DCIM/resultHigh.png",resultHigh);
imwrite("/sdcard/DCIM/resultLow.png",resultLow);
imwrite("/sdcard/DCIM/resultG.png",resultG);
}
(大阈值检测图像边缘) (小阈值检测图像边缘) (高斯模糊后检测图像边缘)