์ค๋๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ฃ์ง ๊ฒ์ถ ๊ธฐ๋ฒ ์ค ํ๋์ธ Canny Edge Detection์ ๋ํด์ ์์๋ณด๋๋ก ํ์.
Canny Edge Detector๋ ์์ ๋ด ์๋ฏธ ์๋ ๊ฒฝ๊ณ๋ฅผ ์์ ์ ์ผ๋ก ๊ฒ์ถํ๊ธฐ ์ํ ๊ณ ์ ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ด ๋ฐฉ์์ ๊ธฐ์กด์ ์์๋ดค๋ ๋ฐฉ์๋ค ์ฒ๋ผ gradient๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ ๊ทธ์น์ง ์๊ณ , ๋ค์ํ ํ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ์ถ๊ฐํด์
๋ ธ์ด์ฆ์ ๊ฐํ๋ฉด์๋ ์๊ณ ๋ช ํํ ์ฃ์ง๋ฅผ ์ถ์ถํ ์ ์๋๋ก ์ค๊ณ๋์๋ค.
1. Edge Detection์ Criteria
์ด์์ ์ธ ์ฃ์ง ๊ฒ์ถ ๊ธฐ์ค์ ํฌ๊ฒ ์ธ ๊ฐ์ง๋ก ์์ฝ๋๋ค.
์ฒซ์งธ, ๊ฒ์ถ ์ค์ฐจ์จ์ด ๋ฎ์์ผ ํ๋ค.
์ด๋ ๊ฐ๋ฅํ ๋ชจ๋ ์ง์ง ์ฃ์ง๋ฅผ ๋์น์ง ์๊ณ ํ์งํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๋์งธ, ๊ฒ์ถ๋ ์ฃ์ง๋ ์ค์ ์ฃ์ง์ ์์น์ ์ต๋ํ ๊ทผ์ ํด์ผ ํ๋ค.
์ฆ, Localization์ด ์ ๋์ด์ผ ํ๋ค. ์ด๋ฅผ ํตํด ๊ฒฝ๊ณ์ ์ ํํ ์์น๋ฅผ ๋ณด์ฅํ ์ ์๋ค.
๋ง์ง๋ง์ผ๋ก, ํ๋์ ์ฃ์ง์ ๋ํด ๋ค์์ ์๋ต์ด ์๋ ๋จ์ผ ํฝ์ (single response)๋ก ํํ๋์ด์ผ ํ๋ค.
์ด๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ก์์ด๋ ์ค๋ณต ์ฃ์ง๋ฅผ ์ค์ด๋ ๋ฐ ๊ธฐ์ฌํ๋ค.
์ด๋ฐ ๊ธฐ์ค์ ๋ง์กฑํ๊ธฐ ์ํด์ Canny Edge Detector๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ํฌํจํ๊ฒ ๋๋ค.

2. Canny Edge Detector
์์์ ์ ์๋ Edge Detection์ ๊ธฐ์ค์ ๋ง์กฑ์ํค๊ธฐ ์ํด์
Canny Edge Detector๊ฐ ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์น๋์ง ์กฐ๊ธ ๋ ์์ธํ, ์์๋๋ก ์ดํด๋ณด์.
Step 1) Image Filtering
์์ ํฌ์คํ ์์ ๋ดค๋ Low-pass Filter์ High-pass Filter๋ฅผ ์ฌ์ฉํด์ ์ฃ์ง๋ฅผ ๊ฒ์ถํ๋ ๊ณผ์ ์ด๋ค.
์ฆ, Gaussian Filter์ Sobel Filter๋ฅผ ์ฌ์ฉํด์(DoG) ์ฃ์ง๋ฅผ ๊ฒ์ถํ๋ค.
์ด ๊ณผ์ ์ ํตํด์ ์ด๋ฏธ์ง์ edge์, edge ์ ๊ฐ๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.


์ฃ์ง์ ํฌ๊ธฐ์ ๋ฐฉํฅ์ ๋ณด๋ ์ดํ์ Non-Maximum Suppression๊ณผ Double Thresholding์ ์ฌ์ฉ๋๋ค.

Step 2) Non-maximum Suppression
Gradient ๊ณ์ฐ์ ํตํด ์ป์ด์ง ์ฃ์ง ํ๋ณด๋ ๋๊ป๊ณ ๋ถ๋ช ํํ ๊ฒฝ๊ณ์ ์ ํฌํจํ ์ ์๋ค.
์ด์ ํฌ์คํ https://he-kate1130.tistory.com/145 ์์ ์ดํด๋ณด์๋ฏ์ด
์ค๋ฌด๋ฉ์ ์ ์ฉํ๊ณ ๋ฏธ๋ถํ์ฌ edge๋ฅผ ๊ฒ์ถํ๋ฉด Edge์ ๋ฒ์๊ฐ ๋๊ฒ ๊ฒ์ถ๋์ด Localization์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.

์ด์ฒ๋ผ ๊ฒ์ถ๋ Gradient Magnitude๊ฐ ์ผ์ ๋ฒ์ ๋ด์์ ๋๊ฒ ๋ถํฌ๋์ด ์์ ๊ฒฝ์ฐ, ํ๋์ ์ฃ์ง๊ฐ ์ฌ๋ฌ ํฝ์ ์ ๊ฑธ์ณ ํํ๋๋ ํ์์ด ๋ฐ์ํ๋ค.
์ด๋ฌํ ์ค๋ณต ํํ์ ์ฃ์ง ๊ฒ์ถ ๊ฒฐ๊ณผ์ ์ ๋ฐ๋๋ฅผ ๋จ์ด๋จ๋ฆฌ๋ฏ๋ก
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Non-Maximum Suppression(NMS) ๊ธฐ๋ฒ์ด ์ ์ฉ๋๋ค.
Non-Maximum Suppression์ ํต์ฌ ๋ชฉ์ ์ Gradient Angle์ ๊ธฐ์ค์ผ๋ก ์ฃผ๋ณ ํฝ์ ๋ค๊ณผ์ ๋น๊ต๋ฅผ ํตํด ๊ฐ์ฅ ๊ฐํ ์๋ต์ ๊ฐ์ง๋ ๋จ ํ๊ฐ์ ํฝ์ ๋ง์ ๋จ๊ธฐ๊ณ , ๋๋จธ์ง๋ ์ ๊ฑฐํจ์ผ๋ก์จ ์ฃ์ง๋ฅผ ๊ฐ๋ฅํ ํ ์๊ฒ ์ ์งํ๋ ๊ฒ์ด๋ค.
์ด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์งํ๋๋ค.

- ์์ window (์๋ฅผ ๋ค์ด 3x3) ์ ๋ง๋ ๋ค.
- ์ด window์ ์ค์ฌ์ (x,y)์ ๋๋ค.
- A(x,y)์ ๋ฐฉํฅ์ผ๋ก ์ด์ ํฝ์ ์ ์ฐพ๋๋ค.
- ์ฐพ์ ์ด์ํฝ์ ๊ฐ Gradient์ Magnitude(M)๋ฅผ ๋น๊ตํ๋ค.
- ์ด ์ค์์ ๊ฐ์ฅ ๋์ ๊ฐ๋ง edge๋ก ์ ํํ๋ค.


์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ํ๋ ๋ ์๊ธด๋ค.
์์์ ์ด์ฐ ์๊ทธ๋๋ก ๋์ด์์ผ๋
A(x,y)๋ฐฉํฅ์ ์ผ์น๋๋ ์ด์ ํฝ์ ์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ค์์ด๋ค... (์ผ์ชฝ ์ฌ์ง)
์ด ๋ฌธ์ ๋๋ฌธ์ A(x,y) ๊ฐ์ Quantizationํด์ ์ฌ์ฉํ๋ค. (์ค๋ฅธ์ชฝ ์ฌ์ง)
์ด๋ ๊ฒ ํด์ Edge์ ๋๋น๋ฅผ 1๊ฐ์ ํฝ์ ๋ก ์ ํํ์๋ค.


Step 3) Double Thresholding
์์ ๊ณผ์ ์ ํตํด์ ์์ ์ฃ์ง ํ๋ณด๋ค์ด ์ ํ๋์๋๋ฐ, ์ฌ์ ํ ์ด ์ค์ ์ผ๋ถ๋ ์ค์ ๋ก๋ Edge๊ฐ ์๋ ์ ์๋ค.
๋ฐ๋ผ์ Canny ์๊ณ ๋ฆฌ์ฆ์ ๋ง์ง๋ง ๋จ๊ณ์์๋ ์ด๋ฌํ ์ฃ์ง ํ๋ณด๋ค ์ค ์ค์ ๋ก ์๋ฏธ ์๋ ์ฃ์ง๋ฅผ ์ต์ข ์ ์ผ๋ก ํ์ ํ๋ ์ ์ฐจ๊ฐ ํ์ํ๋ค.
์ด๋ฅผ ์ํด ์ฌ์ฉ๋๋ ๊ฒ์ด ๋ฐ๋ก Double Thresholding๊ณผ Hysteresis ๊ธฐ๋ฒ์ด๋ค.
Double Thresholding์ gradient magnitude์ ๊ธฐ๋ฐํ์ฌ ํฝ์ ์ ์ธ ๊ฐ์ง ๋ฒ์ฃผ๋ก ๋๋๋ ๋ฐฉ์์ด๋ค.

๋์ ์๊ณ๊ฐ T_H๋ณด๋ค ํฐ gradient ๊ฐ(M)์ ๊ฐ์ง ํฝ์ ์ ๊ฐํ ์ฃ์ง(strong edge)๋ก ๊ฐ์ฃผ๋๊ณ , ํ์คํ ์ฃ์ง๋ก ๋ฐ๋ก ์ฑํ๋๋ค.
๋ฎ์ ์๊ณ๊ฐ T_L๋ณด๋ค ์์ M๊ฐ์ ๊ฐ์ง๋ ํฝ์ ์ ์ฃ์ง๊ฐ ์๋ ๊ฒ์ผ๋ก ํ๋จ๋์ด ์ฆ์ ์ ๊ฑฐ๋๋ค.
๋ฌธ์ ๋ ์ค๊ฐ ๋ฒ์์ ํด๋นํ๋ M ๊ฐ์ ๊ฐ์ง ํฝ์ ๋ค์ธ๋ฐ, ์ด๋ค์ gradient ํฌ๊ธฐ๋ง์ผ๋ก๋ ํ์ ์ ์ธ ํ๋จ์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ฃผ๋ณ ๋งฅ๋ฝ์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋๋ค.
์ฃผ๋ณ ๋งฅ๋ฝ์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๋ค๋ ์๋ฏธ๋ ํ์คํ ๋ฆฌ์์ค(Hysteresis)๋ฅผ ์ ์ฉํ๋ค๋ ๊ฒ์ด๋ค.
ํ์คํ ๋ฆฌ์์ค๋ Edge Connectivity ํ๋จ์ ๊ธฐ๋ฐํ ๋ณด์ ๊ธฐ๋ฒ์ผ๋ก, ์ฝํ ์ฃ์ง ํฝ์ ์ด ์ฃผ๋ณ์ ๊ฐํ ์ฃ์ง ํฝ์ ๊ณผ ์ฐ๊ฒฐ๋์ด ์์ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ ํจํ ์ฃ์ง๋ก ์ธ์ ํ๋ค.
๋ฐ๋๋ก ์ฃผ๋ณ์ ๊ฐํ ์ฃ์ง๊ฐ ์์ผ๋ฉด, ํด๋น ํฝ์ ์ ์ก์์ผ๋ก ํ๋จ๋์ด ์ ๊ฑฐ๋๋ค.
์ด์ ๊ฐ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ํตํด ์ง์ง ์ฃ์ง๋ฅผ ๋์น์ง ์์ผ๋ฉด์๋ ๋ ธ์ด์ฆ์ ๊ธฐ์ธํ ์๋ชป๋ ์ฃ์ง๋ ํจ๊ณผ์ ์ผ๋ก ์ ๊ฑฐํ ์ ์๊ฒ ๋๋ค.
์ฆ, ์ค์ ํ ๋ Threshold์ฌ์ด์ M๊ฐ์ ๊ฐ์ง ํฝ์ ๋ค์ ์ด์์ด Edge๋ผ๋ฉด ๋์ผํ๊ฒ Edge ๋ก ์ฑํ๋๋ค.
์ด ๋จ๊ณ๋ Canny ์๊ณ ๋ฆฌ์ฆ์ด ์ถ๊ตฌํ๋ Low Error Rate์ Single Response ๊ธฐ์ค์ ๋ง์กฑ์ํค๋ ๋ฐ ํต์ฌ์ ์ธ ์ญํ ์ ํ๋ค. ํ์คํ ๋ฆฌ์์ค๋ฅผ ํตํ ์ฐ๊ฒฐ์ฑ ๊ธฐ๋ฐ ํ๋จ์ ์ฝํ ์ฃ์ง๋ฅผ ์๋ฏธ ์๋ ๊ตฌ์กฐ๋ก ํตํฉํจ์ผ๋ก์จ ์ง์ง ์ฃ์ง๋ฅผ ์ต๋ํ ๋์น์ง ์๋๋ก ๋ณด์(Low Error Rate)ํ์ฌ ์ต์ข ์ฃ์ง ๊ฒฐ๊ณผ๋ฅผ ๋ช ํํ๊ฒ ์ ๋ฆฌํ๋ค.


Tutorial
ํด๋น ํํ ๋ฆฌ์ผ๊ณผ ๋์ผํ๊ฒ ์งํํ๋ค.
https://docs.opencv.org/4.11.0/da/d22/tutorial_py_canny.html
OpenCV: Canny Edge Detection
Goal In this chapter, we will learn about Concept of Canny edge detection OpenCV functions for that : cv.Canny() Theory Canny Edge Detection is a popular edge detection algorithm. It was developed by John F. Canny in It is a multi-stage algorithm and we wi
docs.opencv.org
์คํ ๊ฒฐ๊ณผ


#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main() {
// ์ด๋ฏธ์ง ์ฝ๊ธฐ (Grayscale)
Mat img = imread("bridge.jpg", IMREAD_GRAYSCALE);
if (img.empty()) {
std::cerr << "Image load failed!" << std::endl;
return -1;
}
// ๊ฒฐ๊ณผ ์ ์ฅ ํด๋
std::string output_dir = "./output/";
imwrite(output_dir + "original.png", img);
Mat canny_edges;
Canny(img, canny_edges, 100, 200);
imwrite(output_dir + "canny.png", canny_edges);
std::cout << "All processing done. Check output folder." << std::endl;
return 0;
}
https://github.com/mingyung-park/CV_Study/tree/main/07_EdgeCornerDetection
CV_Study/07_EdgeCornerDetection at main ยท mingyung-park/CV_Study
OpenCV์ C++, Python์ ํ์ฉํ ์ปดํจํฐ ๋น์ ์ด๋ก ๋ฐ ๊ตฌํ ์ ๋ฆฌ ๋ ํฌ์งํ ๋ฆฌ์ ๋๋ค. ๊ธฐ์ด ์ด๋ก ๋ถํฐ ์ค์ต ์ฝ๋๊น์ง ๋จ๊ณ๋ณ๋ก ํ์ตํ๋ฉฐ ์ ๋ฆฌํฉ๋๋ค. - mingyung-park/CV_Study
github.com
'๐ฆAI > Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Computer Vision/OpenCV] 19. Corner Detection - Harris Corner Detection (0) | 2025.04.24 |
---|---|
[Computer Vision/OpenCV] 17. Edge Detection(1) - Sobel, Laplacian of Gaussian Filter (0) | 2025.04.22 |
[Computer Vision/OpenCV] 16. Edge Detection ๊ณผ Smoothing Tradeoff (0) | 2025.04.10 |
[Computer Vision/OpenCV] 15. Segmentation (1) | 2025.04.06 |
[Computer Vision/OpenCV] 14. Image Denoising (0) | 2025.04.05 |