简单记录一下OpenCV的几种边缘检测函数的用法。
边缘检测算法
以Sobel边缘检测算法为例。
Sobel卷积核模板为:
偏导公式为:
卷积核模板的图片又是从网上抄来的,实际上我都不是很确定
不过到这里其实还只是做了一半,因为还只是算出来了
公式(8.1)是梯度向量,梯度幅值为用公式(8.2)。但在实际使用中,为了提高计算的速度,我们可以用式(8.3)、(8.4)(8.5)来近似。(8.6)是梯度向量的方向角公式。
所以,在计算出(i,j)处的
边缘检测大体都是这样,不同的算子只是卷积核不同。其实只要理解了图像数据是怎么进行卷积计算的,都可以自己设计算子,当然效果要好才有用。
附上一个OpenCV的几个边缘检测函数的简单使用的栗子。
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main(int argc, char* argv[])
{
Mat src = imread("F:\picture\cv53.jpg");
Mat dst;
//输入图像
//输出图像
//输入图像颜色通道数
//x方向阶数
//y方向阶数
//Sobel(src,dst,src.depth(),1,1);
//imwrite("sobel.jpg",dst);
//输入图像
//输出图像
//输入图像颜色通道数
//Laplacian(src,dst,src.depth());
//imwrite("laplacian.jpg",dst);
//输入图像
//输出图像
//彩色转灰度
cvtColor(src,src,CV_BGR2GRAY); //canny只处理灰度图
//输入图像
//输出图像
//低阈值
//高阈值,opencv建议是低阈值的3倍
//内部sobel滤波器大小
Canny(src,dst,50,150,3);
imwrite("canny71.jpg",dst);
imshow("dst",dst);
waitKey();
return 0;
}
想测试那种边缘检测,就把注释修改一下即可。