OpenCV는 빠르고 사용하기 쉬운 영상의 모폴로지 변환을 제공한다. 기본적인 모톨로지 연산은 팽창과 침식이다. 이들 기법은 영상 내에서 잡음 제거, 또는 구성 요소들의 결합 또는 분리 등의 폭넓은 분야에서 널리 사용된다. 모폴로지는 밝기값이 뭉쳐있는 영역이나 영상의 그래디언트를 구하는 용도로도 사용될 수 있다.
팽창과 침식
팽창연산도 영상과 커널과의 컨볼루션이다. 이때 영상을 A라고 하고, 커널을 B라고 하면 커널은 임의의 모양과 크기를 가질 수 있고, 고정점을 하나 갖는다. 대부분의 경우 커널은 중앙에 고정점을 가지고 있는 작은 정사각형 또는 원형으로 구성된다. 커널은 템플릿 또는 마스크의 일종이라고 생각할 수 있으며 팽창 연산은 국지적 최대값을 선택하는 효과가 있다. 영상 A를 커널 B로 스캔하면서 B와 겹치는 영역에서 최대 픽셀값을 구하고, 이 값을 고정점 아래에 있는 픽셀의 값으로 설정한다.
참조 :한빛미디어 Learining OpenCV 제대로 배우기
침식은 팽창과 반대되는 개념이다. 침식 연산은 커널 아래에서 국지적 최소값을 계산하는 것과 유사하다. 침식 연산 알고리즘은 영상 A를 커널 B로 스캔하면 B와 겹치는 영역에서 최소 픽셀값을 구하고, 이 값을 고정점 아래에 있는 픽셀의 값으로 설정한다.
영상 모톨로지는 임계값 연산 후 얻어지는 이진 영상에 대해서도 자주 실행된다. 그러나 팽창은 단지 최대값 연산이고 침식은 단지 최소값 연산이기 때문에 모폴로지는 일반 영상에서도 사용될 수 있다.
일반적으로 팽창은 영역 A를 확장시키는 반면, 침식은 영역 A를 축소시킨다. 또한 팽창은 영역 A에서 오목하게 들어간 부분을 채우는 효과가 있고, 침식은 볼록 튀어나온 부분을 제거하는 효과가 있다. 물론 이러한 결과는 커널의 모양에 따라 달라지기는 하지만 속이 꽉 채워져 있는 컨백스 형태의 커널이 사용될 경우에는 일반적으로 참이다. OpenCV에서는 침식을 위한 cvErode()와 팽창을 위한 cvDilate() 함수를 제공한다.
public static void Erode(CvArr src, CvArr dst, IplConvKernel element, int iterations); |
public static void Dilate(CvArr src, CvArr dst, IplConvKernel element, int iterations); |
cvErode() 와 cvDilate() 함수는 입력과 출력 영상을 인자로 받으며 바꿔치기 호출을 지원한다. 즉, 입력과 출력 영상을 동일한 영상으로 지정할 수 있다. 세번쨰 인자 B에는 커널을 전달할 수 있으며, 기본값으로 null이 설정된다. 커널이 null이면 중앙에 고정점이 있는 3x3 크기의 커널이 자동으로 사용된다. 마지막 인자 iterations에는 반복 횟수를 지정한다. 만약 iterations가 기본값 1이 아니면 함수 내부에서 해당 연산을 여러 번 반복하게 된다.
침식 또는 최소값 연산의 결과, 밝은 영역은 고립되거나 줄어든다.
Cv.Erode(src, dst,null,3); |
침식연산은 영상에서 얼룩 잡음을 제거하기 위해 종종 사용되곤 한다. 얼룩은 침식으로 인해 없어지고, 중요한 큰 영역들은 영향을 받지 않고 그대로 남아있게 된다. 팽창 연산은 종종 연결된 구성 요소를 찾고자 할 때 사용된다. 잡음, 그림자 등 다양한 이유로 인하여 하나의 큰 영역이 여러 개의 구성 요소로 분리되는 경우가 발생하기 때문에 팽창 연산은 종종 필요하다.
팽창 또는 최대값 연산의 결과, 밝은 영역은 확장되어 합쳐지기도 한다.
'Programing > OpenCV' 카테고리의 다른 글
Opencv C# 모폴로지 (0) | 2016.11.30 |
---|---|
영상 모폴로지 자체 커널 만들기 (0) | 2016.11.30 |
스무딩(블러링) (0) | 2016.11.30 |
영상 파일 포맷의 종류 (0) | 2016.11.30 |
영상처리 컬러모델 (0) | 2016.11.30 |