티스토리 뷰

텍스처 패턴 인식(texture pattern recognition)이 뭐지?



텍스처 패턴을 인식하는 것을 소개해드리려고 합니다.

먼저 제가 소개해드릴 텍스처 패턴 인식(texture pattern recognition)은 다음 과정을 의미합니다.


1. 아래와 4개의 패턴처럼 같은 모양이 주기적으로 반복되는 텍스처 패턴을 미리 정합니다.

2. 컴퓨터가 이 패턴을 학습하도록 합니다.

3. 학습한 패턴의 중 하나가 아래 이미지 처럼 입력으로 주어지면, 학습된 데이터를 바탕으로 중 가장 가까운 패턴을 계산합니다.

4. 입력으로 주어진 패턴과 가장 가까운 패턴을 출력합니다.


(앞으로 소개할 과정은 논의를 단순화 하기 위해 흑백 이미지(Grey Scale)에서 진행할 것입니다.)


이 문제가 어려운 이유는 뭘까?



이 문제의 어려운 점은 입력 패턴 이미지가 단순하게 미리 정한 패턴의 부분을 자른 것이 아니라는 점입니다.

즉 입력 패턴 이미지는 어두울 수도 있고, 크기를 줄인 것일 수 있고, 잡티가 있을 수도, 흐릿할 수도 있다는 것입니다.

(예시 이미지 : 순서대로 주어진 패턴의 일부분인 이미지, 어두운 이미지, 작은 이미지, 잡티가 있는 이미지, 흐릿한 이미지)


이런 상황에서도 높은 정확도로 가장 유사한 패턴을 찾아야합니다.

따라서 이 문제는 단순히 이미지 픽셀 값의 일치라는 기준으로 유사함을 판별했을 때 해결할 수 없습니다.

유사함에 대한 새로운 기준을 정의해야합니다. 

어떤 기준이 이런 악 조건 속에서도 유사한 패턴을 정확하게 찾아줄 수 있을까요?


이미지 패턴을 인식한다니 내가 할 수 있을까?


저는 이미지를 코딩으로 직접 다뤄본 경험도 기계 학습 알고리즘을 사용해본 경험도 없었습니다.

그래서 이 과제가 나왔을 때 도대체 어떻게 할 수 있을까 막막했습니다.

그런데 조금씩 알아가면서 처음부터 끝까지 보고 나니 생각보다 간단하다고 느꼈습니다.


한번 도전해보면 코딩과 알고리즘을 문제를 위한 문제를 풀기 위해 사용하는 것에서 벗어나

현실에 직접 적용해보는 좋은 경험이 될거라고 생각합니다.


어떤 개념들이 사용되나?


1. 이미지를 코드로 다루기 위해 C++언어에서 OpenCV 라이브러리를 사용합니다.

2. 텍스처 이미지의 특징을 추출하기 위해 2차원 푸리에 변환을 사용합니다.

3. 추출된 특징을 컴퓨터가 학습하기 위해 K-Means Clustering 알고리즘을 사용합니다.


위 3가지 하나 하나가 무거운 주제로 느껴질 수 있습니다. 

그러나 텍스처 패턴 인식을 위해 필요한 최소한의 지식과 개념을 사용할 것이기 때문에 

충분히 이해하고 과정을 따라갈 수 있을 것이라고 생각합니다.


저도 이 과제를 하기 전에는 위의 OpenCV 라이브러리,  2차원 푸리에 변환, K-Means Clustering 알고리즘 중 아무것도 몰랐습니다.

필요한 개념을 그때 그때 구글에 검색하여 습득하고 진행했었습니다.


(텍스처 패턴 인식의 과정에 집중하기 위해 2차원 푸리에 변환과 K-Means Clustering 알고리즘은 직접 구현하지 않고 개념만 살펴본 뒤 이미 구현된 OpenCV 라이브러리의 함수를 이용할 것입니다.)


먼저 이 세가지에 대한 개념을 간단하게 소개하려 합니다.


OpenCV 소개


첫번째로 OpenCV 입니다.

OpenCV는 Open Computer Vision의 약자로 영상, 이미지를 처리하기 위해 

필요한 여러 함수들이 포함되어 있는 오픈소스 C라이브러리입니다.


대부분 윈도우의 visual studio와 맥의 xcode를  이용해서 C++ 코딩을 하실텐데

라이브러리를 설치할 때 생각보다 설정해줄 것이 많습니다. 여기서 포기하지 말고 도전해주세요!

설치 방법은 구글에 검색하면 이 과정을 소개하는 글이 많습니다. 스스로 검색해서 해결해주세요.


OpenCV 첫 번째 예시


OpenCV를 이용한 첫번째 이미지 처리 예시를 소개하겠습니다.

아래 이미지는 20*20 픽셀로 구성된 이미지를 가상으로 매우 확대해서 표현 한것입니다. 

이 이미지를 아래 코드에서 사용해서 이미지의 각 픽셀을 수치로 나타낸 다음 출력을 얻었습니다. 

해당 픽셀이 밝을 수록 255에 가까운 수를 어두울 수록 5에 가까운 수를 얻은 것을 확인할 수 있습니다.



이 이미지를 OpenCV의 imread함수를 사용해서 불러온 후  OpenCV에서 행렬을 표현하는 Mat 클래스에 저장했습니다.

Mat 클래스에 이미지를 저장하면 이미지의 각 픽셀이 수치로 표현되어 행렬 형태로 저장됩니다. 

위 코드에서는 반복문으로 행렬을 순회하며 각 픽셀에 접근하여 저장된 값을 출력했습니다.



OpenCV 두 번째 예시


OpenCV를 이용한 두 번째 예시는 가우시안 필터를 적용해서 이미지에 있는 noise를 제거하는 것입니다.

아래 이미지에 있는 nosie(희고 검은 점)를 제거할 것입니다.

어떻게 이 이미지에 있는 noise들, 즉 희고 검은 점들을 제거할 수 있을까요?

희고 검은 점들의 특징은 주변 픽셀값과 조화를 이루이 않는 다는 것입니다. 

즉 noise가 나타난 곳은 픽셀 값의 급격한 변화가 나타나는 지점 입니다.


급격한 변화가 나타나지 않도록 하려면 주변 픽셀값의 평균으로 이미지를 다시 나타내면 되지 않을까요?

다음 코드로 한번 시도해봤습니다.



위 코드를 실행한 결과 입니다. (w=5일 때)

잡음이 제거되긴 했으나 주변 값의 평균을 이용했기 때문에 경계선도 같이 흐려졌습니다.


경계선을 살리면서 이미지의 잡음을 제거할 수는 없을까요?

있습니다! 중심에 더 많은 가중치를 주는 가중치 평균으로 새로운 이미지를 구성하면 됩니다.

왜냐하면 현재 픽셀 위치에서 멀어질 수록 유사하지 않은 두 영역(ex. 모자 영역과 머리카락 영역)의 픽셀값이 선택 될 가능성이 크기 때문입니다.


가중치는 중심을 기준으로 3*3마스크에 대해 다음과 같이 설정할 수도 있고

 1

 2

4

 2

 1

 1


5*5 마스크에서는 이렇게 설정할 수도 있습니다.

 1

 2

 2

 3

 4

 6

 4

 3

 2

 3

 4

 2

 1

 2

 3

 2

 1


즉 중심에 가까울 수록 더 큰 가중치를 가지도록 하면 됩니다.

n*n 마스크에 대해 가중치를 일반화하기 위해서 중심에 가까울 수록 더 큰 값을 가지는 함수를 사용할 것입니다.

이러한 특성을 지닌 잘 알려진 함수로 정규분포의 확률밀도함수인 가우시안 함수를 사용하려 합니다.

가우시안 함수(출처 : 위키피디아)

우리는 2차원인 이미지에서 마스크를 생성해야 하므로 2차원에서 함수를 표현해야 합니다.

가우시안 함수를 2차원에 표현하면 다음과 같은 개형을 같습니다.


다음 코드로 2차원 가우시안 함수로 가중치 평균을 일반화해서 필터를 적용했습니다.


가우시안 함수의 표준 편차를 1.5로 설정하여 때 위 코드를 실행한 결과 입니다. 

잡음 제거 전 원본 이미지

가우시안 필터를 적용해서 잡음 제거 한 결과(표준 편차 = 1.5)


이렇게 가우시안 함수를 가중치로 사용한 필터를 가우시안 필터라고 합니다.

앞의 두 예시를 통해서 OpenCV의 기본적인 적용 사례를 살펴봤습니다.


푸리에 변환(fourier transform)


이번에 소개할 개념은 푸리에 변환입니다.


푸리에 변환의 원리를 수학적으로 이해하는 것은 이 글의 주제를 벗어나기 때문에 (사실 잘 몰라서)

텍스처 패턴 인식을 위해 필요한 푸리에 변환의 개념만을 직관적으로 소개하겠습니다.


두 개념을 이렇게 표현할 할 수 있습니다.


푸리에 급수(fourier series)주기 신호 복소정현파의 무한합으로 표현한 것입니다.

푸리에 변환(fourier transform)이란 비주기적인 신호를 주기 신호의 주기가 무한대로 확장된 것으로 생각하여 복소정현파의 무한합으로 표현한 것입니다.


따라서 푸리에 변환은 푸리에 급수의 확장된 개념입니다.


푸리에 급수와 푸리에 변환에 대해 처음 접한다면 어렵고 모호한 말을 한다고 느낄 수 있습니다.

그러나 위에 어려운말을 하나씩 따져보면 직관적으로는 쉽게 이해할 수 있습니다.


(계속 작성중입니다.)
































댓글
최근에 달린 댓글
Total
Today
Yesterday