Canny() 함수

사용방법

cv::Canny(src, dst, 30, 127, 3, false);
cv::Canny(src[입력영상], dst[결과 영상이 저장될 Mat 형식], 30[낮은 경곗값 1], 127[높은 경곗값 2], 3[Sobel 커널크기], false[정교하게 작동여부]);

Sobel 커널 크기와 정교하게 작동 여부는 기본 설정이 되어있으므로 다음과 같이 간략하게 나타낼 수 있다.

cv::Canny(src, dst, 30, 127);

낮은 경곗값은 전 처리 후 남은 경계선에서 우리가 지정한 낮은 경곗값 보다 작은 값을 가지는 경계선은 약한 경계선으로 인식한다.
높은 경곗값은 전 처리 후 남은 경계선에서 우리가 지정한 높은 경곗값 보다 높은 값을 가지는 경계선을 확실한 경계선으로 인식한다.

확실한 경계선으로 인식된 부분에 연결된 모든 경계선은 경계선으로 인식하여, 결과 창에 표현된다.
확실한 경계선과 붙어있지 않은 약한 경계선들은 경계선에서 제외하고 배경으로 인식한다.

두 경곗값의 중간에 있는 경계선도 확실한 경계선으로 연결되어 있어야 표현된다.

소스코드

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(void) {

	Mat src;
	Mat dst_127, dst_200;
	Mat dst_0, dst_100;
	Mat kernel3, kernel5;
	Mat accurate_true, accurate_false;

	src = imread("wheat.jpg", IMREAD_COLOR); // IMREAD_COLOR 형식으로 초기화

	if (src.empty()) { // 예외처리
		cout << "Could not open or fine the image" << endl;
		return -1;
	}

	// Canny 함수 (Edge detection)

	/* 높은 경곗값 설정 */
	Canny(src, dst_127, 100, 127, 3, false);
	Canny(src, dst_200, 100, 200);

	/* 낮은 경곗값 설정 */
	Canny(src, dst_0, 0, 200, 3, false);
	Canny(src, dst_100, 100, 200);

	/* Sobel kernel 설정 */
	Canny(src, kernel5, 100, 127, 5, false);
	Canny(src, kernel3, 100, 127);

	/* 정교하게 작동여부 */
	Canny(src, accurate_true, 100, 127, 3, true);
	Canny(src, accurate_false, 100, 127);

	imshow("src", src);
	imshow("dst_127", dst_127);
	imshow("dst_200", dst_200);
	imshow("dst_0", dst_0);
	imshow("dst_100", dst_100);
	imshow("kernel3", kernel3);
	imshow("kernel5", kernel5);
	imshow("accurate_true", accurate_true);
	imshow("accurate_false", accurate_false);

	waitKey(0);
	return 0;
}

실행결과

image-20220327231052381
원본이미지

image-20220327231101738
dst_127

image-20220327231110345
dst_200 높은 경곗값이 높아져 경계선이 더욱 줄어들었다.

image-20220327232111798 dst_0 약한 경계로 확정된 것들이 줄어들어 훨씬 많은 경계선들이 보인다.

image-20220327232151225 dst_100

image-20220327232631571 kernel3

image-20220327232641505 kernel5 Sobel 함수에서 kernel5를 적용했더니 지저분한 경계면이 나타난다.

image-20220327232959108 accurate_true 정교하게 작동하면 좀 더 확실한 경계선을 찾고자 하는지, false에서 발견된 경계선들 중 일부가 사라진 것을 볼 수 있다.

image-20220327233013587 accurate_false

댓글남기기