边缘检测:最优边缘检测算子Canny算子。
API函数:Canny()函数
void Canny(InputArray image,//输入图像,必须为单通道8位
OutputArray edges,//输出的边缘图
double threshold1,//低阈值
double threshold2,//高阈值
int apertureSize = 3,//默认为3,Sobel算子的孔径大小
bool L2gradient = false);//默认
一、c++示例代码
//包含头文件
#include <opencv2/opencv.hpp>
//命名空间
using namespace cv;
using namespace std;
//全局函数声明部分
//主函数
int main()
{
//【1】载入图像
Mat image = imread("F:\\opencvtest\\testImage\\beauty.png");
//【2】检查是否载入成功
if (image.empty())
{
printf("读取图片错误,请确认目录下是否有imread函数指定图片存在! \n ");
return 0;
}
//【3】转换为灰度图像
Mat grayImage;
cvtColor(image, grayImage, COLOR_BGR2GRAY);
//【4】图像平滑降噪
Mat result;
blur(grayImage, result, Size(3,3));
//【5】Canny算子进行边缘检测
Mat edge;
Canny(result, edge, 20, 60, 3);
//【6】阈值化处理生成二值图像
Mat binaryImage;
threshold(edge, binaryImage, 20, 255, THRESH_BINARY_INV);
//【7】显示图像
imshow("16-边缘检测图", edge);
imshow("16-二值图像", binaryImage);
//【8】保持窗口显示
waitKey(0);
return 0;
}
二、运行截图
1.灰度原图
2.边缘检测图
3.阈值化处理生成二值图像
三、数字图像处理知识
1.边缘特征
“边缘”通常定义为影像局部特征不相同的那些区域间的分界线,表现为局部影像的不连续,例如呈现出灰度级的突变,纹理结构突变等。
2.Canny算子
一般基于Sobel算子。
低阈值:小于低阈值的边缘像素被排除。
高阈值:大于高阈值的边缘像素被保留。
介于两个阈值之间的:需要判断是否保留。若像素与高阈值图像中的边相连接,则保留。