Canny 算子源码见我的下载资源
下面是我对Canny 算子源码部分细节功能的注释,代码详见源码。
void cv::Canny( InputArray _src, OutputArray _dst,
double low_thresh, double high_thresh,
int aperture_size, bool L2gradient )
{
Mat src = _src.getMat();
CV_Assert( src.depth() == CV_8U );
_dst.create(src.size(), CV_8U);
Mat dst = _dst.getMat();
....
//aperture--空隙大小/尺寸
if ((aperture_size & 1) == 0 || (aperture_size != -1 && (aperture_size < 3 || aperture_size > 7)))
CV_Error(CV_StsBadFlag, "");
if (low_thresh > high_thresh)
std::swap(low_thresh, high_thresh);
....
//CV_16SC--#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n)),其中CV_16S表示16位短整型,详见types_c.h中
const int cn = src.channels();
Mat dx(src.rows, src.cols, CV_16SC(cn));
Mat dy(src.rows, src.cols, CV_16SC(cn));
//这里两次计算x轴,y轴方向上的像素点的导数估计值并存在dx ,dy 数组中
Sobel(src, dx, CV_16S, 1, 0, aperture_size, 1, 0, cv::BORDER_REPLICATE);
Sobel(src, dy, CV_16S, 0, 1, aperture_size, 1, 0, cv::BORDER_REPLICATE);
//L2gradient这里用于指示梯度估计使用的公式
1-- = \sqrt{(dI/dx)^2 + (dI/dy)^2}
if (L2gradient)
0/default-- = |dI/dx|+|dI/dy|
{
low_thresh = std::min(32767.0, low_thresh);
high_thresh = std::min(32767.0, high_thresh);
//平方
if (low_thresh > 0) low_thresh *= low_thresh;
if (high_thresh > 0) high_thresh *= high_thresh;
}
int low = cvFloor(low_thresh);
int high = cvFloor(high_thresh);
//这里以及后面对行,列扩展2表示图像边缘扩展
ptrdiff_t mapstep = src.cols + 2;
AutoBuffer<uchar> buffer((src.cols+2)*(src.rows+2) + cn * mapstep * 3 * sizeof(int));
//初始化图像中三行数据,并分配存储空间
int* mag_buf[3];
mag_buf[