티스토리 뷰

목차

    반응형

    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) 외곽선 검출 소스 (영상처리)

    반응형