Techブログ

Tech blog

Pythonの話

pythonで楽譜画像認識

カテゴリ:Pythonの話

2020.07.14

このエントリーをはてなブックマークに追加

こんにちは。inglowの開発担当です。
今回は、近年超キテる「python」を使って、楽譜の画像から音符を認識する処理を作ってみました。
本当は音名を出すところまでやってみたかったのですが、時間の都合で断念しました……。
五線の位置と音符の位置を検出するところまでを紹介しています。

開発環境は下記です。

  • バージョン:python3.8.3
  • ライブラリ:oepnCV4.2
  • エディタ:notepad++

今回作るもの

音符の位置と五線の位置から、その音符が何の音なのかというのを判定するものを作りたかったのですが…。
五線の位置の取得がおもうようにいかず、今回は音名の表示は断念しました…。
ですが、音符の検出と、五線の検出位置の表示までは割とうまくいったので、今回はここまでをブログ記事にしました。
楽譜の著作権等の問題で、今回のテスト画像は、手書きの何の曲でもない楽譜を作成し、撮影しました。

画像の中の境界線を探す

まずは、画像の中の物体検出を行います。
検出するため、濃淡をはっきりさせて輪郭をくっきりさせて検出をします。

影や音符等、「何か」ということは関係なく境界線を検出します。

音符を検出する

先ほど検出した物体を、今度は大きすぎるものと小さすぎるものを除いていきます。

音符を検出していくのですが、八分音符が4つつながっているところが一つと認識されて、
うまく音符の玉の部分が検出できません…。また、二分音符(白い玉の音符)が線をまたがっているのですが、二つに分裂されてしまっています…。

まずは、4つ連なっている八分音符を一つずつ認識してもらうため、細い線がなくなるようにぼかしの処理を入れます。

さらに、二分音符が分割されないよう、認識させるエリアのサイズを調整します。

これで再度試してみたところ、うまくできました!

五線を検出する

五線の取得は、線を検出する関数を利用して検出をします。先ほどの音符を検知する時の画像は、線が消えてしまっているので、五線の検知用に新しくファイルを開きなおして、フィルタリングをしていきます。
フィルタリングした際に、線の濃淡の関係で途切れてしまったりする部分があるので、これもぼかし処理をしてつながるようにしていきます。

影のところや音符が連なっているところにもめっちゃ線が出てきます…。
線の検出関数の数値を調整して、なんとか五線の部分だけを認識させることができました。

認識した音符と五線の位置を描画する

最後に、検出した音符と五線を描画していきます。
五線の方が手前にきてほしかったので、処理順を、五線認識→音符認識という順番にしました。
全体のソースと、出力結果です。

さいごに

ここまでくればあともう一息!と思ったのですが、五線の検出データが、線1本につきたくさんあり、どこの範囲からどこの範囲までが該当エリアか、という集約で躓いてしまいました…。
時間の関係で今回はここまでで打ち止めです。くやしい…。
ですが、音符の検出まではできたので、音符のデータを学習させれば行けるんじゃないか…?と思っています。
この場合は、一つの音符を五線ごとぬきだし、学習させたデータと照合して何の音なのかを検出するという流れになるのかなと思っています。
データを学習させるために、12×1000枚(ヘ音記号も加味する場合はこれの2倍)の画像が必要なので、これまたハードルが高いですが……。
機会があれば試してみたいです。

一覧へ戻る

記事をカテゴリから探す