모폴로지 연산

nugurii0·2022년 9월 24일
0

다중차로인식

목록 보기
9/11

주로 이진화된 영상에서 객체의 모양을 변형하는 용도로 사용된다.

이진 영상의 침식과 팽창

영상 처리에서 모폴로지는 영상속 객체의 형태 및 구조를 분석하고 처리하는 기법이다.

주로 이진 영상에서 객체의 모양을 단순화시키거나 잡음을 제거하는 용도로 사용한다.

먼저 구조 요소를 정의한다. 이는 마스크처럼 연산의 동작을 결정하는 작은 크기의 행렬로 보통 3*3 정방형 구조 요소를 사용한다. 보통 요소 행렬의 중심을 고정점(anchor point)이라 하고 고정점에 연산 결과를 저장한다.

침식 연산은 객체 영역의 외곽을 골고루 깎아 내는 연산으로 객체 영역은 축소되고 배경은 확대된다.

구조 요소를 영상 전체에 대해 스캔하여 객체 영역 내부에 포함될 경우엔 고정점 위치 픽셀을 255로 설정한다.

팽창 연산은 반대로 객체 영역을 확대하고 배경 영역을 줄인다.

구조 요소가 객체 영역과 한 픽셀이라도 만날 경우 고정점 위치 픽셀을 255로 설정한다.

OpenCV getStructuringElement() , erode() , dilate()

구조 요소 행렬을 생성하는 함수이다.

Mat getStructuringElement(int shape, Size ksize, 
									Point anchor = Point(-1,-1));

각각 구조 요소의 모양, 크기, anchor의 좌표를 의미한다. anchor를 Point(-1, -1)로 지정하면 구조 요소 중앙을 중심 좌표로 사용한다.

모양은 MORPH_RECT, MORPH_CROSS, MORPH_ELLIPSE가 있다.

다음은 침식 연산을 하는 erode() 함수이다.

void erode(InputArray src, OutputArray dst, InputArray kernel,
				Point anchor = Point(-1,-1), int iterations = 1,
				int borderType = BORDER_CONSTANT,
		const Scalar& borderValue = morphologyDefaultBorderValue());

kernel은 구조 요소로 Mat()을 지정하면 3*3 사각형 구조를 사용하고 그 외에는 getStructuringElement() 를 통해 지정할 수 있다.

iterations는 반복 횟수를, borderType은 가장자리 픽셀 확장 방식, borderValue는 borderType이 BORDER_CONSTANT일 경우 확장된 가장 자리를 채울 값으로, 기본 값은 모든 멤버 변수가 DBL_MAX로 채워진 Scalar 객체를 반환한다.

다음은 팽창 연산을 수행하는 dilate() 함수이다.

void dilate(InputArray src, OutputArray dst, InputArray kernel,
				Point anchor = Point(-1,-1), int iterations = 1,
				int borderType = BORDER_CONSTANT,
        const Scalar& borderValue = morphologyDefaultBorderValue());

사용법은 erode() 와 동일하다.

이진 영상의 열기와 닫기

침식 연산을 수행한 후 팽창 연산을 수행하는 연산을 열기 연산이라고 한다.

반대로 팽창 후 침식 연산을 수행하는 것을 닫기 연산이라고 한다.

열기와 닫기 연산 모두 객체의 크기가 크게 바뀌지는 않지만 열기 연산은 외곽의 돌출된 픽셀을, 닫기 연산은 객체 내부의 작은 구멍을 없애는 효과가 있다.

OpenCV morphologyEx()

열기와 닫기 뿐만 아니라 일반적인 모폴로지 연산도 수행할 수 있는 함수이다.

void morphologyEx(InputArray src, OutputArray dst,
                  int op, InputArray kernel,
                  Point anchor = Point(-1,-1), int iterations = 1,
  				  int borderType = BORDER_CONSTANT,
    	const Scalar& borderValue = morphologyDefaultBorderValue());

op는 모폴로지 연산 타입(침식, 팽창, 열기, 닫기, 그래디언트 계산)

나머지는 erode, dilate와 동일하다.

profile
개발과 보안을 공부하는 학생

0개의 댓글