음표 분할

이성훈2010.06.14
조회262

지난 시간까지 오선을 제거하는 것에 대해서 설명을 드리고 관련 소스도 올렸습니다.

오늘은 제거된 오선 이미지를 가지고 음표를 추출하는 것에 대해서 설명을 드리겠습니다.

수학적인 방법을 이용해서 음표를 분할하면 좋을텐데 전부다 휴리스틱으로 임의로 영역을 추출하는거라 잘 안되는 경우가 많네요.

여러가지 발생 상황에 대해서 고민하고 각각의 케이스에 대해서 처리를 해보았습니다.

 

먼저 다음과 같은 영상을 입력으로 받는다고 봅시다.

 

단순한 이진화 방법으로 이렇게 0/255 값만을 가지는 영상으로 변환합니다

 

지난 시간 설명드렸던 오선 제거 방법으로 제거된 영상입니다.

 

 

1. 각각의 connected component를 bounding box로 보여주고 있습니다.

하나의 연결된 점들의 집합을 한 component로 보고 이 각각의 component가 음표 후보가 됩니다.

 

2. 오선 젤 윗 줄 위에 있는 component는 모두 제거합니다. ‘점점빠르게’와 같은 표시나 기타 노이즈 등을 제거할 수 있습니다.

 

 

3. component 크기가 최대 높이와 길이의 1/15도 안 되는 경우는 조그마한 잡영으로 보고 제거합니다.

 

4. component안에 또 다른 component가 있는 경우 두개를 하나로 합쳐줍니다.

 

 

5. 높이가 너무 작은 것들도 노이즈로 보고 제거합니다.

 

 

6. 위 아래 겹치는 box를 하나로 합칩니다. 머리와 줄기가 떨어져있는 경우 합쳐지겠지요.

여기에서는 쉼표가 하나로 합쳐진 걸 볼 수 있는데, 2/4 박자 표시도 합쳐버렸네요

 

7. 머리가 분리 된 경우를 찾아서 그것을 합칩니다.

 

 

8. 꼬리가 떨어진 경우를 찾아서 합칩니다.

가운데 8분 음표들이 제대로 합쳐졌네요. b와 2/4도 합쳐지는 오류가 발생하는군요.

 

 

9. 너비가 너무 작은 박스를 노이즈라고 생각하고 제거합니다.

 

 

이런식으로 rule을 적용해서 음표를 찾는데 잘 되는 경우도 있지만 보시는 바와 같이 부작용도 생기네요.

좋은 방법이 있음 좋겠는데 아쉽습니다. =.=