8. 에지 검출과 응용

OpenJR·2022년 4월 11일
0
post-custom-banner

에지 검출

Sobel 연산자를 이용한 미분과 그래디언트

void Sobel (InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize = 3,
            double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT);

Mat dx, dy;
Sobel(src, dx, CV_32FC1, 1, 0);
Sobel(src, dy, CV_32FC1, 0, 1);

src: 입력 영상

dst: 출력 영상. src와 같은 크기, 같은 채널 수.

ddepth: 출력 영상 깊이

dx, dy: x 방향과 y 방향으로의 미분 차수

ksize: 커널 크기

  • 1: 3x1 또는 1x3 커널 사용
  • CV_SCHARR: 3x3 Scharr 커널 사용. Scharr() 함수 사용과 같음.
  • 3, 5, 7 Зx3, 5x5, 7x7 7

scale: (Optional) 연산 결과에 추가적으로 곱할 값

delta: (Optional) 연산 결과에 추가적으로 더할 값

borderType: 가장자리 픽셀 확장 방식

2D 벡터의 크기 계산 함수

void magnitude(InputArray x, InputArray y, OutputArray magnitude);

Mat mag;
magnitude(dx, dy, mag);
mag.convertTo(mag, CV_8UC1);

X: 2D 벡터의 x 좌표 행렬. 실수형.

y: 2D 벡터의 y 좌표 행렬. x와 같은 크기. 실수형.

magnitude: 2D 벡터의 크기 행렬. x와 같은 크기, 같은 타입.

  • magnitude(II) = x(I)2+y(I)2\sqrt{x(I)^2+y(I)^2}

2D 벡터의 방향 계산 함수

void phase(InputArray x, InputArray y, OutputArray angle, bool angleInDegrees = false);

Mat phs;
phase(dx, dy, phs);

X: 2D 벡터의 x 좌표 행렬. 실수형.

y: 2D 벡터의 y 좌표 행렬. x와 같은 크기. 실수형.

angle: 2D 벡터의 크기 행렬. x와 같은 크기, 같은 타입.

  • angle(II) = atan2(y(I),x(I))atan2(y(I), x(I))

anglelnDegrees: true이면 각도 단위, false이면 래디언 단위.

캐니 에지 검출기

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

Mat src = imread ("circuit.bmp", IMREAD_GRAYSCALE);
Mat dst;
Canny (src, dst, 50, 150);

image: 입력 영상.

edges: 에지 영상.

threshold1: 하단 임계값

threshold2: 상단 임계값. threshold 1과 threshold2의 비율은 1:2 또는 1:3을 권장.

apertureSize: 소벨 연산을 위한 커널 크기

L2gradient: L2 norm 사용 여부.

  • L2=(dI/dx)2+(dI/dy)2L_2 = \sqrt{(dI/dx)^2 + (dI/dy)^2} , L1=dI/dx+dI/dyL_1= |dI/dx| + |dI/dy|

직선 검출

허프변환 직선 검출

void HoughLines (InputArray image, OutputArray lines, double rho, double theta,
                 int threshold, double srn = 0, double stn = 0,
                 double min_theta = 0, double max_theta = CV_PI);

Canny (src, src_edge, 50, 200);
vector<Vec2f> lines1;
HoughLines(src_edge, lines1, 1, CV_PI / 180, 250);

image: 그레이스케일 에지 영상

lines: 직선의 파라미터(rho, theta) 저장할 출력 벡터. vector\.

rho:축적 배열에서 rho 값의 간격. (e.g.) 1.0 → 1픽셀 간격.

theta: 축적 배열에서 theta 값의 간격. (e.g.) CV_PI / 180 → 1° 간격.

threshold: 축적 배열에서 직선으로 판단할 임계값

stn, srn: 멀티스케일 허프 변환에서 rho 해상도를 나누는 값.

  • srn에 양의 실수를 지정하면 rho 해상도와 rho/srn 해상도를 각각 이용하여 멀티스케일 허프 변환을 수행.
  • srn과 stn이 모두 0이면 일반 허프 변환을 수행.

srn: 멀티스케일 허프 변환에서 theta 해상도를 나누는 값

min_theta: 검출할 직선의 최소 theta 값

max_theta: 검출할 직선의 최대 theta 값

확률적 허프 변환에 의한 선분 검출 함수

void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta,
                 int threshold, double minLineLength = 0, double maxLineGap = 0);

vector<Vec4i> lines2;
HoughLinesP(src_edge, lines2, 1, CV_PI / 180, 100, 50, 5);

image: 그레이스케일 에지 영상

lines: 선분의 시작, 끝 좌표(x1, y1, x2, y2) 저장할 출력 벡터. vector.

rho: 축적 배열에서 rho 값의 해상도.픽셀 단위. (e.g.) 1.0 → 1픽셀 간격.

theta: 축적 배열에서 theta 값의 간격. 라디안 단위. (e.g.) CV_PI / 180 → 1° 간격.

threshold: 축적 배열에서 직선으로 판단할 임계값

minLineLength: 검출할 선분의 최소 길이

maxLineGap: 직선으로 간주할 최대 에지 점 간격

profile
Jacob
post-custom-banner

0개의 댓글