Opencv(C++) 학습 시리즈---캐니 에지 감지 알고리즘

목차

【1】엣지 검출 알고리즘 프로세스

【2】캐니 오퍼레이터 소개

【3】완전한 코드


【1】엣지 검출 알고리즘 프로세스

  1. 가우시안 필터를 사용하여 이미지를 매끄럽게 만들어 노이즈를 필터링합니다. (소음 감소)
  2. 이미지의 각 픽셀의 그래디언트 크기와 방향을 계산합니다. 그래디언트를 찾는 것은 그래디언트를 찾는 소벨 알고리즘과 일치합니다.
  3. 비최대 억제를 사용하여 가장자리 감지의 역효과 제거(비최대 억제)
  4. 이중 스레드 모니터링(이중 스레드 감지)을 사용하여 실제 및 잠재적 가장자리를 결정합니다.
  5. 고립된 약한 에지를 억제하여 에지 검출을 수행합니다(약한 에지 억제).   

특정 알고리즘 프로세스에 대해서는 다음 문서를 참조하세요.

https://zhuanlan.zhihu.com/p/494567705

【2】캐니 오퍼레이터 소개

void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
                         int apertureSize = 3, bool L2gradient = false );

 특정 매개변수 소개:

첫 번째 매개변수는 InputArray 타입의 이미지로, 입력 이미지, 즉 소스 이미지는 Mat 클래스의 객체만을 채우는 것으로 3채널 컬러 이미지 또는 단일 채널 그레이스케일 이미지가 될 수 있다.
두 번째 매개변수인 OutputArray 유형의 edge는 단일 채널 에지 이미지인 출력 에지 이미지입니다.
세 번째 파라미터인 double형의 Threshold1은 첫 번째 히스테리시스 임계값입니다.
네 번째 파라미터인 double형의 Threshold2는 두 번째 히스테리시스 임계값입니다.

Canny는 두 가지 임계값을 사용하는데, 에지 반응의 회색조 이미지에 따르면 높은 임계값보다 큰 것이 강한 에지이고, 낮은 임계값보다 작은 것이 약한 에지이며, 강한 에지와 약한 에지 사이의 값은 검색 알고리즘. 8개 영역에 강한 엣지가 있는지 여부, 강한 엣지가 있는 경우 해당 포인트를 강한 엣지로 설정할 수 있습니다.

int 형식의 다섯 번째 매개 변수인 조리개 크기는 기본값이 3인 Sobel 연산자를 적용하기 위한 조리개 크기를 나타냅니다.
여섯 번째 파라미터인 bool 타입의 L2gradient는 영상의 기울기 진폭을 계산하기 위한 식별자로, 기본값은 false입니다.

【3】완전한 코드

#include<opencv2\opencv.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>

using namespace cv;
using namespace std;

int main(int argc,char** argv)
{
	//载入原始图
	Mat src = imread("E:\\乔大花进度\\11-28\\边缘检测\\2.jpg");
	Mat src1 = src.clone();
	Mat src2(src.size(),CV_8UC1);
	//第一种直接使用边缘检测canny算法
	//blur(src2,src2,Size(3,3));
	Canny(src,src2,150,180);
	imshow("边缘检测1",src2);

	//第二种高阶边缘检测算法,转为灰度图,降噪,用Canny得到最后的边缘作为掩码,转到原图得到效果图,得到色彩的边缘图
	Mat dst, edge, gray;

	//【1】创建与src同类型和大小的矩阵(dst)
	dst.create(src1.size(),src1.type());
	//【2】将彩色图转为灰度图
	cvtColor(src1,gray,COLOR_BGR2GRAY);
	//【3】先使用3x3的内核用来降噪
	blur(gray,edge,Size(3,3));
	//【4】运行canny算法
	Canny(edge, edge, 3, 9);
	//【5】将dst中的像素都置为0
	dst = Scalar::all(0);
	//【6】与edge为掩码,将src2复制到dst中
	src1.copyTo(dst,edge);

	//【7】显示效果图
	imshow("边缘检测2",dst);

	//显示原始图
	imshow("原图",src);

	waitKey(0);
	system("pause");
	destroyAllWindows();

	return 0;

}

작업 결과:

0971b4d0603c4555bcf677aa2731bae0.png

추천

출처blog.csdn.net/qiaodahua/article/details/128078825