본문 바로가기
책갈피

[오선 제거] 소스 설명

이성훈 |2010.05.26 12:28
조회 467 |추천 0

강좌가 늦었습니다.

 

3일에 강좌 설명 (http://www.cyworld.com/seonghun/3233109)을 했으니 벌써 20일이 훌쩍 지났네요.

요즘 지난 2달간 뭐했나라는 후회가 많이 밀려와요. 너무 안일하게 살았던 과거를 반성하고 다시금 열을 올리기로 했습니다.

처음에 강좌할때는 누가 관심이라도 있을까? 어차피 일반인들은 관심이 없을건데라고 생각했는데, 그래도 관심을 가져주시고 질문해주시고 얼른 강좌 올려달라고 재촉하시는 분들이 있어서 행복한 마음에 글을 계속 쓰기로 했습니다. 아직 버그가 있는데 그냥 한데까지 올렸습니다. 하시다가 죽을 수도 있는데, 혹시 어디가 죽었거나 문제가 있다는걸 알려주시면 고맙겠습니다. 쉬운 이미지는 잘 되는데 어떤건 잘 안되네요. 소스 받아서 직접 실행해보신분이 있나요? 얼마나 많은 분들이 직접 소스 받아서 실행해보시는지 궁금하네요.

 

지난번에 오선 제거한 것에 대해서 간략하게 소개를 해드렸는데 이번 시간에는 직접 소스를 보면서 설명 드리겠습니다.

 

이제 소스에서 보시든 오선을 찾고 제거하는 과정이 대략적으로 정해졌습니다.

오선을 제거하는 함수는 StaffRemoval로, 이진화된 영상, 그리고 오선의 위치 정보 (y값들의 위치를 담은 벡터 5개), 수직 에지 정보 영상을 입력으로 받습니다.

그리고 출력으로 오선이 제거된 영상을 결과로 반환합니다.

 

image 

 

앞 과정에서 오선의 위치를 찾았으니까 각 오선의 y 값에서 위 아래로 검정색들을 모두 제거하면 그것이 오선이 제거된 영상입니다.

그렇게 하다보면 오선에 음표가 걸릴때 음표도 같이 제거될 수 있는데, 이를 방지할 수 있는 방법이 없을까 고민을 하다가 수직 에지 성분이 강한 부분은 남겨두는 방법을 택했습니다.

 

그럼 먼저 수직 에지를 찾는 것부터 알아볼까요?

2006년 당시 OpenCV에 친숙하지 않아서 그냥 생으로 에지 찾는걸 구현했습니다.

3*3 MASK를 모든 pixel에 씌워서 그 값을 계산을 했고, 이미지의 edge magnitude의 값의 최대 최소를 찾아서

모든 값을 이 최대-최소를 가지고 정규화를 했습니다.

그러면 에지 값의 차이가 각 이미지마다 확연하게 나타나겠지요.

 

 

image

 

오늘 시범을 보여줄 이미지입니다.

 

image

 

수직 에지를 구한 이미지입니다.

음표 머리부분에 에지 성분이 좀 강하게 나타나는걸 볼 수 있죠.

그래서 가급적 오선을 제거해도 음표는 제거를 안하려고 이렇게 에지 성분을 구해보았습니다.

더 좋은 방법도 있을텐데 혹시 생각나시면 아이디어를 주세요.

 

image

 

이제 제거하는 함수를 좀더 살펴볼까요?

 

기본 철학은 오선의 위치를 아니까 그 부분을 위.아래로 훝어가면서 검정색 점이 이어진부분을 모두 제거하는 것입니다.

빨간선이 LineDetection을 구한 라인입니다. 두번째 소절의 중간에 좀 삑사리가 난거 외에는 대체적으로 잘 찾았네요.

 

image

 

오선을 제거할때 음표는 제거하면 안되니까, 먼저 오선의 두께를 측정을 합니다.

이게 BlackRunLength 함수인데, BlackRun은 해당 위치에서 검정색 화소가 끊어지지 않고 이어진게 몇 개의 점인지 count하는 함수입니다.

사람이 오선을 그리다보니 어떤 부분은 세게 긋고 어떤 부분은 약하게 그으면 두께가 일정하지는 않겠지요.

그래서 각 두께의 히스토그램을 구해서 가장 많이 나타나는 두께를 해당 오선의 두께로 정하고

그 두께보다 * LINETHRESHOD보다 큰 것들은 음표의 머리나 줄기랑 연결된거라 보고 남겨둡니다.

 

그리고 이전에 구한 에지 정보를 이용해서 마지막으로 실제로 검정색을 제거할지 말지 판단합니다.

즉 에지 성분이 강한 부분에는 오선 제거하지 않고 그냥 지나갑니다.

 

image

 

아까 삑사리 난 부분 외에는 대체적으로 잘 제거하면서 음표 모양도 잘 유지하는 것 같네요.

노이즈도 있고, 음표가 끊어진 부분도 있는데, 이 부분은 좀더 고민을 해봐야할 것 같습니다.

 

image

 

제 강좌가 도움이 되셨나요?

도움이 되셨다면 아래 추천 버튼을 꾹~ 눌러주세요.

추천이 많아질수록 얼른 다음 강좌도 나와요 ㅋㅋ

추천수0
반대수0

공감많은 뉴스 시사

더보기

뉴스 플러스