이진 영상의 모폴로지는 기본적인 침식과 팽창 연산만 알고 있어도 충분하다그러나 그레이스케일 또는 컬러 영상의 경우유용한 모폴로지 연산들이 더 존재한다모폴로지 연산들은 모두 하나의 함수 Cv.MorphologyEx()를 이용한다.

 

public static void MorphologyEx(CvArr src, CvArr dst, CvArr temp, IplConvKernel element, MorphologyOperation operation, int iterations);

 

Cv.MorphologyEx() 함수는 두개의 새로운 매개변수를  받는다하나는 temp 배열이고다른 하나는 operation이다. Temp 배열이 선택적으로 사용된다, temp 배열이 사용되는 경우 배열은 입력 영상과동일한 크기여야 한다.

 

Operation 인자에 지정할  있는 

Operation

모폴로지 연산

Temp 영상의 필요 유무

MorphologyOperation.Open

열기

불필요

MorphologyOperation.Close

닫기

불필요

MorphologyOperation.Gradient

모폴로지 그래디언트

항상필요

MorphologyOperation.Tophat

탑 

바꿔치기 전용(src = dst)

MorphologyOperation.Blackhat

블랙 

바꿔치기 전용(src = dst)


열기와 닫기 연산

열기와 닫기 연산은 침식과 팽창 연산을 조합하여 사용함으로써 이루어진다열기 연산의 경우침식 연산을 수행한 후 팽창 연산을 수행한다열기 연산은 종종 이진 영상에서 독립된 영역들의 개수를 세기 위해서 사용된다예를 들어현미경으로 관찰한 세포 영상을 임계값을 이용하여 이진화한 후열기 연산을 수행하여 가까이 붙어 있는 세포들을 서로 떨어뜨리려 놓고 나서 세포의 수를 세곤 한다닫기 연산은 팽창을 먼저 하고 침식 연산을 수행한다닫기 연산은 연결된 구성 요소 알고리즘 등에서 잡음에 의한 원치 않은 분할을 최소한으로 줄이고자 사용한다연결된 구성 요소 레이블링을 수행하기 위해 보통 침식 또는 닫기 연산을 수행하여 잡음을 먼저 제거하고열기 연산을 수행하여 다시 가까이 인접한 큰 영역들을 합쳐준다열기 또는 닫기 연산의 결과는 침식 또는 팽창 연산의 결과와 유사하지만열기 및 닫기 연산이 연결된 영역을 보다 정확하게 보존해준다.

 

IplImage tempimage = src.Clone();

 

            IplConvKernel element = Cv.CreateStructuringElementEx(3,322ElementShape.Rect, null);

 

            Cv.MorphologyEx(src, dst, tempimage, element, MorphologyOperation.Open, 3);



모폴로지 열기 연산의 결과작은 크기의 밝은 영역은 사라지고남아 있는 밝은 역역의 크기는 유지된채 고립되어 있다.


모폴로지 닫기 연산의 결과밝은 영역들이 서로 합쳐졌지만 기본 크기는 유지하고 있다.

 

Iterations 2를 전달하여 닫기 연산을 두 번 수행하는 것은 팽창-침식-팽창-침식 연산을 수행하는 것 같은 효과를 나타낸다그러나 이러한 연산은 그다지 유용하지 않다보통의 경우팽창-팽창-침식-침식 같은 연산을 원할 것이다팽창-팽창-침식-침식과 같은 방식으로 모폴로지 연산을 수행해야 팽창-침식을 한 번 수행하는 것보다 더 큰 잡을을 제거하는 효과가 있다.

 

모폴로지 그래디언트

이 연산을 이진 영상에 적용하면 영역의 외곽선만 남기는 효과가 있다.

Gradient(src) = dilate(src) - erdoe(src)



모폴로지 그래디언트 연산의 결과주변부 엣지가 밝게 표현된다.

 

그래이스케일 영상에 대한 모폴로지 그래디언트 연산 결과는 영상에서 밝기값 변화량의 정도를 알려준다모폴로지 그래디언트는 밝은 영역 주위를 고립시켜서 이를 하나의 객체로써 다룰 수 있도록 해준다영역의 완전한 외곽선은 확정된 영역으로부터 수축된 영역을 빼는 차연산을 통해 쉽게 구할 수 있다이는 객체의 그래디언트를 계산 하는 것과는 다르다.(그래디언트 관한 소벨샤르 연산)

 

-햇 연산과 블랙-햇 연산

이들 연산은 주변보다 밝거나 어두운 영역을 고립시키는 효과가 있기 때문에 특정 객체 내부에서 밝기 변화가 두드러진 부분을 찾아내기 위해 사용된다예를 들어생체조직 또는 세포를 촬영한 현미경 영상을 다룰 때 사용되기도 한다.

TopHat(src) = src - open(src)

BlackHat(src) = close(src) - src

 

-햇 연산은 입력 영상에서 열기 연산이 수행된 영상을 빼는 연산이다열기 연산은 영상에서 밝기값이 크게 튀는 작은 덩어리를 제거하는 효과가 있다그러므로 src에서open(src)를 빼게 되면 결과적으로 원본 src영상에서 주변보다 밝았던 부분만 남아서 강조되어 보인다이러한 효과는 커널의 크기에 의존적이다이와 반대로 블랙-햇 연산은 원본 영상에서 주변보다 어두운 영역만 강조한다.


모폴로지 탑-햇 연산의 결과주변보다 밝은 영역들이 강조되었다.


모폴로지 블랙-햇 연산 결과주변보다 어두운 영역들이 강조되었다.

'Programing > OpenCV' 카테고리의 다른 글

제스쳐 인식  (0) 2016.11.30
플러드필  (0) 2016.11.30
영상 모폴로지 자체 커널 만들기  (0) 2016.11.30
영상 모폴로지  (0) 2016.11.30
스무딩(블러링)  (0) 2016.11.30

OpenCV에서는 IplConvKernel 구조체를 사용하여 자체적인 모폴로지 커널을 사용할 수 있다이 커널은 Cv.CreateStructuringElementEx() 함수를 통해서 생성하고,ReleaseStructuringElement() 함수를 이용하여 해제한다

 

public static IplConvKernel CreateStructuringElementEx(int cols, int rows, int anchor_x, int anchor_y, ElementShape shape, int[,] values);

모폴로지 커널은 컨볼루션 커널과 달리 수치값을 필요로 하지 않는다모폴로지 커널의 모양은 커널이 영상을 스캔하는 동안 최대값 또는 최소값 계산에 필요한 픽셀 위치를 알려주는 역할만 할 뿐이다고정점은 커널이 원본 영상에 어떻게 정렬되어야 하는지 알려주는 역할을 하고또한 모폴로지 연산의 결과값이 원본 영상의 어느 픽셀에 대입되어야 하는지 알려준다커널을 새로 생성하려면 구성요소를 감싸는 사각형을 표현하는 cols rows를 지정해주어야 한다그 다음으로 고정점의 좌표 (x,y)를 나타내는 anchor_xanchor_y를 지정한다. CV_SHAPE_CUSTOM 값이 사용되면 정수형 배열 values에 의해 지정된 형태의 커널이 생성된다이 배열은 rows x cols 크기의 1차원 배열이며 0이 아닌 값으로 지정된 위치의 원소는 커널에서 사용되는 픽셀이다. Values null이면 모든 원소값이 0이 아닌 것으로 간주되어 사각형 형태의 커널이 생성된다.

 

다섯 번째 인자 shape 

Shape 

의미

CV_SHAPE_RECT

사각형 커널

CV_SHAPE_CROSS

십자 모양의 커널

CV_SHAPE_ELLIPSE

타원형 커널

CV_SHAPE_CUSTOM

Values 값으로 지정하는 사용자 정의 커널


'Programing > OpenCV' 카테고리의 다른 글

플러드필  (0) 2016.11.30
Opencv C# 모폴로지  (0) 2016.11.30
영상 모폴로지  (0) 2016.11.30
스무딩(블러링)  (0) 2016.11.30
영상 파일 포맷의 종류  (0) 2016.11.30

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