opencv Canny函数

Canny 原理

  1. 先经过高斯平滑,目的是去噪声
  2. 寻找图像强度梯度
  3. 非极大抑制
    • 【opencv Canny函数】这一步的目的是将模糊(blurred)的边界变得清晰(sharp)。通俗的讲,就是保留了每个像素点上梯度强度的极大值,而删掉其他的值。对于每个像素点,进行如下操作:
      • 将其梯度方向近似为以下值中的一个(0,45,90,135,180,225,270,315)(即上下左右和45度方向)
      • 比较该像素点,和其梯度方向正负方向的像素点的梯度强度
      • 如果该像素点梯度强度最大则保留,否则抑制(删除,即置为0)
      • opencv Canny函数
        文章图片

  4. 双阈值
    • 经过非极大抑制后图像中仍然有很多噪声点。Canny算法中应用了一种叫双阈值的技术。即设定一个阈值上界和阈值下界(opencv中通常由人为指定的),图像中的像素点如果大于阈值上界则认为必然是边界(称为强边界,strong edge),小于阈值下界则认为必然不是边界,两者之间的则认为是候选项(称为弱边界,weak edge),需进行进一步处理。经过双阈值处理的图像如下图所示
  5. 利用滞后的边界跟踪
    • 体思想是,和强边界相连的弱边界认为是边界,其他的弱边界则被抑制
函数
void Canny(cv::InputArray src, cv::OutputArray dst, double threshold1, double threshold2, int aperture_size=3 );

  • src: 原图像, 单通道灰度图像
  • dst: 生成的图像
  • threshold1,threshold2
    函数的两个阀值。
demo
#include #include using namespace std; using namespace cv; Mat dst, gray_src, src; int value = https://www.it610.com/article/1; void Callback(int, void*); int main() { src = imread("f:/1.png"); if (src.empty()) { cout << "can not find the image" << endl; return -1; } imshow("原图像", src); cvtColor(src, gray_src, CV_BGR2GRAY); imshow("灰度图像", gray_src); namedWindow("结果", CV_WINDOW_AUTOSIZE); createTrackbar("bar", "结果", &value, 150, Callback); Callback(0, 0); waitKey(0); return 0; } void Callback(int, void*) { Canny(gray_src, dst, value, value*2); imshow("结果", dst); }

    推荐阅读