譜面画像からテト譜を起こす

この記事は、譜面画像からテト譜を起こすの技術資料です。 画像からどのような方法を使ってテト譜を起こすのか興味がある人が対象です。 手法に興味はなく、ただ使ってみたいという人は、譜面画像からテト譜を起こすに移動してください。


きっかけ

この配信を見たとき、画像から自動的にテト譜を起こせたら効率よく分析できるんじゃないかと思った。

需要あるのかな?と適当に調べるとまずテトリスの画面をテト譜に起こしたかった が見つかり、その中で

というツイートを見つけた。2年前から需要があったことがわかり、作ってみることにした。

認識手法

入力画像の前提条件の設定

まず、入力画像はキャプチャボードからのみを前提とした。 カメラからの撮影画像の場合、どう撮影しても譜面がまっすぐにはならず、ゆがみ補正が必須になる。 色補正も必要だったり、場合によってはノイズを消さないといけなかったりと、 前処理がどうしても必要になり、これでは画像認識の本質にたどりつかず本末転倒となる。

次に、キャプチャボードの画像から縦20ブロック、横10ブロックの譜面画像のみを切り出したものを入力画像とすることとした。 キャプチャボードの画像全体からの場合、譜面を認識させるという前処理が必要で、 この場合も画像認識の本質にたどり着けなくなる恐れがある。

以上から、入力画像の前提条件は

  • キャプチャボードからのみ
  • 縦20ブロック、横10ブロックの画像のみを切り出した譜面画像を入力とする

とした。

入力画像から20x10ブロックを特定する

前提条件を満たした入力画像は、縦横比が2:1となっているはずで、1ブロックが正方形となっているはずである。 1ブロックあたりのピクセル数は、画像の縦ピクセル ÷ 20画像の横ピクセル ÷ 10の大きい方とする。 これは、縦横比がぴったり2:1となっているとは限らず、もし小さい方を採用すると認識するべき位置にずれが生じて別のブロックの色を 誤って読み取ってしまい、認識率が低下するためである。

ブロックごとに色を調べる

まず、特定したブロックのピクセルのうち中央50%を取り、ピクセルのRGBカラーの値のそれぞれの平均を求める。 これを、ブロックの色とみなす。

次に、ブロックの色について、テトリミノの色と一致する条件を決定していく。 条件は、RGBの色差関係やRGBの数値の大小関係で決定する。 以下、赤の色値をr、緑の色値をg、青の色値をbとする。

せり上がりブロック (灰色)

r+g+b>200,|rg|<25,|rb|<25,|gb|<25

Iミノ (水色)

b>160,rb<80,gb<10

Sミノ (黄緑色)

35<r160,g>120,b<80,rg>30,gb>80

Zミノ (赤色)

r>160,rg>20,rb>20,|gb|<40

Jミノ (青色)

g<110,b>160,rb<80,gb<80

Lミノ (橙色)

r>160,g>80,b<60

Oミノ (黄色)

r>160,g>160,b<90,|rg|<80

Tミノ (紫色)

g<120,|rg|>70,|gb|>70,|rb|<100

テト譜へのリンクを生成する

テト譜の仕様は、参考資料2.を参照。 テト譜のフィールドの大きさは認識する譜面より大きいため、はみ出している部分は全て空白扱いとする。

今後の課題

RGBの色差関係やRGBの数値の大小関係を調べることにより、色を区別する手法を使用した。しかし、この手法には限界がある。

テトリスにはテトリミノの見た目が大きく変わるテーマを用意していることが多く、 全体的に明るめの色となる場合や、全体的に暗めの色となる場合がある。 両者ではRGBの色差関係やRGBの数値の大小関係が大きく異なることがあるが、それぞれについて別の閾値を定義することはできない。 これは、ブロック単位で色情報を見ている現時点での手法に問題があり、 ブロック全体の明るさの傾向などを新たに調査し適合させる必要がある。そのような方法をいかに実装するかが、今後の課題である。


YouTube用のテト譜ジェネレーターがリリースされています

SoRA_X7さんが、Chrome拡張機能YouTube用のテト譜ジェネレーターを既にリリースしています。 その拡張機能の方が便利で、認識精度も高いので是非ご利用ください。

参考資料

  1. https://crize.blog.jp/archives/16752321.html
  2. https://docs.google.com/presentation/d/1V4PNyt41to81phK9u0iXnIkAfp-nV3g3xcl7c5qW-FI/edit#slide=id.g21adbcaeda_0_87