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

+ Recent posts