Canny
原理
- 先经过高斯平滑,目的是去噪声
- 寻找图像强度梯度
- 非极大抑制
- 【opencv Canny函数】这一步的目的是将模糊(blurred)的边界变得清晰(sharp)。通俗的讲,就是保留了每个像素点上梯度强度的极大值,而删掉其他的值。对于每个像素点,进行如下操作:
- 将其梯度方向近似为以下值中的一个(0,45,90,135,180,225,270,315)(即上下左右和45度方向)
- 比较该像素点,和其梯度方向正负方向的像素点的梯度强度
- 如果该像素点梯度强度最大则保留,否则抑制(删除,即置为0)
-
文章图片
- 将其梯度方向近似为以下值中的一个(0,45,90,135,180,225,270,315)(即上下左右和45度方向)
- 【opencv Canny函数】这一步的目的是将模糊(blurred)的边界变得清晰(sharp)。通俗的讲,就是保留了每个像素点上梯度强度的极大值,而删掉其他的值。对于每个像素点,进行如下操作:
- 双阈值
- 经过非极大抑制后图像中仍然有很多噪声点。Canny算法中应用了一种叫双阈值的技术。即设定一个阈值上界和阈值下界(opencv中通常由人为指定的),图像中的像素点如果大于阈值上界则认为必然是边界(称为强边界,strong edge),小于阈值下界则认为必然不是边界,两者之间的则认为是候选项(称为弱边界,weak edge),需进行进一步处理。经过双阈值处理的图像如下图所示
- 利用滞后的边界跟踪
- 体思想是,和强边界相连的弱边界认为是边界,其他的弱边界则被抑制
void Canny(cv::InputArray src, cv::OutputArray dst,
double threshold1, double threshold2,
int aperture_size=3
);
- src: 原图像, 单通道灰度图像
- dst: 生成的图像
- threshold1,threshold2
函数的两个阀值。
#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);
}
推荐阅读
- 人脸识别|【人脸识别系列】| 实现自动化妆
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- opencv|图像处理之椒盐噪声的添加与去除
- 人脸识别|【人脸识别系列】| 实现人脸截图保存并编写128维特征向量
- opencv|网络爬虫入门练习
- OpenCV|【OpenCV 完整例程】89. 带阻滤波器的传递函数
- OpenCV|【OpenCV 完整例程】90. 频率域陷波滤波器
- OpenCV|【OpenCV 完整例程】22. 图像添加非中文文字
- OpenCV|【OpenCV 完整例程】91. 高斯噪声、瑞利噪声、爱尔兰噪声
- opencv|python+opencv车道线,实线虚线的检测