티스토리 뷰
목차
C# 모폴로지(morphology) 외곽선 검출 소스 (영상처리)
영상처리에서 외곽선을 말끔하게 정리해주는 방법의 하나인 모폴로지(morphology) 기법을 C#의 그리드 패턴과 접목한 예제입니다.
일단 모폴로지morphology의 이론적 개념에 대해선 모폴로지 기법_Morphology 이 포스트를 참조하세요. 아래는 위 포스트에서 발췌했습니다.
모폴로지morphology기법
- 영상 내에 존재하는 특정 객체의 형태를 변형시키는 용도로 사용되는 영상처리기법.
- 이진 영상처리에 주로 사용됨.
- 영상에서 잡음을 제거하거나, 영상에서 객체의 모양을 기술하는 용도로 사용됨. (예: 모폴로지morphology의 대표적인 예로 침식과 팽창연산이 있음.)
침식연산 : 필터의 크기 및 사용 횟수에 따라 작은 덩어리의 객체들을 사라지게 할 수 있다(깎아나간다는 뜻).
팽창연산 : 침식연산과 반대로 영역을 넓혀가는 연산이며 최대값 필터의 역할을 한다.
이 영상처리 예제는 외곽선을 찾아야 하는데, 오브젝트의 표면이 매끄럽지 못할 경우에 사용할 수 있습니다. 외곽선을 찾아야 오브젝트의 크기와 위치를 알아낼 수 있으나, 외곽선을 찾지 못하면 이런 정보를 알아낼 수 없습니다.
아래 그림처럼, 오브젝트 표면을 깔끔하게 다듬어야 하는 상황이 있습니다.
(모폴로지morphology 적용 전)
[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(0, 0, 0) != 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(0, 0, 0); } } #endregion } | cs |
그리드 패턴을 이용하기 때문에, grid_view의 각 셀에 접근해 RGB 값이 0, 0, 0인지, 255, 255, 255인지, 이것만으로 팽창 지점을 확인합니다. (영상처리 응용)
array 배열은 그리드 뷰의 각 셀의 값과 크기가 똑같으며, 흑색, 백색을 구분해 값을 담습니다(0, 1). 반드시 array1과 array2의 배열 크기는 그리드 뷰의 것과 같아야 합니다.
모폴로지morphology 결과는 array2 배열에 저장되며, 모폴로지 연산이 끝나면, btn_set_ 버튼의 클릭 이벤트를 강제로 발생시켜 외곽선 찾기 알고리즘도 구동합니다. 이때도, array2의 값을 기준으로 외곽선을 찾게 됩니다.
아래는 순차적으로 이 예제 프로그램을 구동했을 때의 결과입니다.
정렬되지 않은 데이터 로딩 -> 모폴로지로 표면 매끄럽게 -> 외곽선을 찾아 오브젝트를 인지
C Sharp Gridpattern - 모폴로지 적용 전
모폴로지 적용 후
모폴로지 적용 후 외곽선 찾기
이 영상처리 예제는 아주 단순한 것으로 복잡한 알고리즘 구현을 위한 사전 준비 단계에 불과합니다.
첨부된 프로젝트를 보시면 소스가 깔끔하지 못하고 중복 소스도 많은데, 귀찮아서 정리 안 했습니다. 외곽선 찾기 코드는 8방향이 아니라 4방향이라 표면이 지저분할 경우엔 잘 찾지도 못하죠.
저는 이 코드로 대충 감만 잡고 실제 프로젝트를 진행했습니다. 혹시, 감을 잡을 용도의 가벼운 프로그램을 원하신다면 간단히 훑어보세요.
C# 모폴로지(morphology) 외곽선 검출 소스 (영상처리)