opencv Canny函数

Canny

原理

  1. 先经过高斯平滑,目的是去噪声

  2. 寻找图像强度梯度

  3. 非极大抑制

    • 这一步的目的是将模糊(blurred)的边界变得清晰(sharp)。通俗的讲,就是保留了每个像素点上梯度强度的极大值,而删掉其他的值。对于每个像素点,进行如下操作:

      • 将其梯度方向近似为以下值中的一个(0,45,90,135,180,225,270,315)(即上下左右和45度方向)

      • 比较该像素点,和其梯度方向正负方向的像素点的梯度强度

      • 如果该像素点梯度强度最大则保留,否则抑制(删除,即置为0)

      • opencv Canny函数_第1张图片

  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 = 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);
}

你可能感兴趣的:(opencv)