본문 바로가기
C++ 200제/코딩 IT 정보

C# 모폴로지(morphology) 외곽선 검출 소스 (영상처리)

by vicddory 2017. 8. 30.

C# 모폴로지(morphology) 외곽선 검출 소스 (영상처리)


영상처리에서 외곽선을 말끔하게 정리해주는 방법의 하나인 모폴로지(morphology) 기법을 C#의 그리드 패턴과 접목한 예제입니다.


일단 모폴로지morphology의 이론적 개념에 대해선 모폴로지 기법_Morphology 이 포스트를 참조하세요. 아래는 위 포스트에서 발췌했습니다.


모폴로지morphology기법


- 영상 내에 존재하는 특정 객체의 형태를 변형시키는 용도로 사용되는 영상처리기법.

- 이진 영상처리에 주로 사용됨.

- 영상에서 잡음을 제거하거나, 영상에서 객체의 모양을 기술하는 용도로 사용됨. (예: 모폴로지morphology의 대표적인 예로 침식과 팽창연산이 있음.)


침식연산 : 필터의 크기 및 사용 횟수에 따라 작은 덩어리의 객체들을 사라지게 할 수 있다(깎아나간다는 뜻).

팽창연산 : 침식연산과 반대로 영역을 넓혀가는 연산이며 최대값 필터의 역할을 한다.

이 영상처리 예제는 외곽선을 찾아야 하는데, 오브젝트의 표면이 매끄럽지 못할 경우에 사용할 수 있습니다. 외곽선을 찾아야 오브젝트의 크기와 위치를 알아낼 수 있으나, 외곽선을 찾지 못하면 이런 정보를 알아낼 수 없습니다.


아래 그림처럼, 오브젝트 표면을 깔끔하게 다듬어야 하는 상황이 있습니다.


(모폴로지morphology 적용 전)


C Sharp Gridpattern - 모폴로지 적용 전[C# 영상처리] 모폴로지 예제


(모폴로지morphology 외곽선 검출 결과)


모폴로지 적용 후 외곽선 찾기[C# 영상처리] 모폴로지 예제


필요하지 않은 부분은 없애고, 필요한 부분만 남길 필요가 있는 것이죠. 그럴 때 필요한 기법의 하나가 모폴로지입니다.


모폴로지morphology와 외곽선 찾는 기능이 포함된 이 프로젝트 파일은 바로 아래에 있고, 회사에서 샘플로 만들었기에 그리드 뷰로 보여질 오브젝트는 엑셀로 저장되어 있습니다.


두 파일 모두 받으셔야 전체 기능을 사용할 수 있습니다.


프로젝트 : GridPattern-Contour tracing.zip

샘플 엑셀 : binary_ex1.xls

binary_ex1.xls 파일은 C 드라이브 바로 아래에 두세요. 그리고 이 예제의 바탕이 되는 그리드 패턴 예제는 이전에 올려놨던 샘플을 그대로 사용했습니다.


이제, 소스를 살펴보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
private void Mophology_Click(object sender, EventArgs e)
{
    #region 모폴로지 적용
    int h = 23;
    int w = 274;
 
    int[,] array = new int[h, w];
    int[,] array2 = new int[h, w];
 
    for (int i = 0; i < h; i++)
    {
        for (int j = 0; j < w; j++)
        {
            Color tmp = grid_view_.Rows[i].Cells[j].Style.BackColor;
 
            if (Color.FromArgb(000!= tmp)
                array[i, j] = 0;
            else
                array[i, j] = 1;
        }
    }
 
    int x, y;
    int pmax;
 
    for (int j = 0; j < h; j++)
    {
        for (int i = 0; i < w; i++)
        {
            pmax = 0;
 
            for (int n = -1; n <= 1; n++)
            {
                for (int m = -1; m <= 1; m++)
                {
                    x = i + m;
                    y = j + n;
 
                    if (x >= 0 && y >= 0 && x < w && y < h)
                    {
                        if (array[y, x] > pmax)
                        {
                            pmax = array[y, x];
                        }
                    }
                }
            }
            array2[j, i] = pmax;
        }
    }
 
    btn_set_.PerformClick();
 
 
    for (int i = 0; i < h; i++)
    {
        for (int j = 0; j < w; j++)
        {
            if (array2[i, j] >= 1)
                grid_view_.Rows[i].Cells[j].Style.BackColor = Color.FromArgb(000);
        }
    }
    #endregion
}
cs


그리드 패턴을 이용하기 때문에, grid_view의 각 셀에 접근해 RGB 값이 0, 0, 0인지, 255, 255, 255인지, 이것만으로 팽창 지점을 확인합니다. (영상처리 응용)


array 배열은 그리드 뷰의 각 셀의 값과 크기가 똑같으며, 흑색, 백색을 구분해 값을 담습니다(0, 1). 반드시 array1과 array2의 배열 크기는 그리드 뷰의 것과 같아야 합니다.


모폴로지morphology 결과는 array2 배열에 저장되며, 모폴로지 연산이 끝나면, btn_set_ 버튼의 클릭 이벤트를 강제로 발생시켜 외곽선 찾기 알고리즘도 구동합니다. 이때도, array2의 값을 기준으로 외곽선을 찾게 됩니다.


아래는 순차적으로 이 예제 프로그램을 구동했을 때의 결과입니다.


정렬되지 않은 데이터 로딩 -> 모폴로지로 표면 매끄럽게 -> 외곽선을 찾아 오브젝트를 인지


C Sharp Gridpattern - 모폴로지 적용 전 2C Sharp Gridpattern - 모폴로지 적용 전


모폴로지 적용 후모폴로지 적용 후


모폴로지 적용 후 외곽선 찾기 결과모폴로지 적용 후 외곽선 찾기


이 영상처리 예제는 아주 단순한 것으로 복잡한 알고리즘 구현을 위한 사전 준비 단계에 불과합니다.


첨부된 프로젝트를 보시면 소스가 깔끔하지 못하고 중복 소스도 많은데, 귀찮아서 정리 안 했습니다. 외곽선 찾기 코드는 8방향이 아니라 4방향이라 표면이 지저분할 경우엔 잘 찾지도 못하죠.


저는 이 코드로 대충 감만 잡고 실제 프로젝트를 진행했습니다. 혹시, 감을 잡을 용도의 가벼운 프로그램을 원하신다면 간단히 훑어보세요.


C# 모폴로지(morphology) 외곽선 검출 소스 (영상처리)

댓글