Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

ビンゴカードを作る

 ビンゴカードを作ります。リストからランダムに値を取り出す関数random.sampleを用いて、1~70までの数字の入ったリストから25個の数字をランダムに取り出し、それを5X5のマスに表示し、ビンゴカードを作ります。
 こちらの記事の内容を使っています。
画像にグリッド線を引く
カラー画像を作成する

やること
  • 単色の画像に線を引き、5 x 5の25マスのマス目画像を作成
  • 1~70までの数字の入ったリストを作成
  • リストから25個の数字を重複なく取り出す
  • 取り出した数字をマス目画像に表示する
  • 名前を付けてビンゴカードを保存
  • 指定された枚数処理を繰り返す
使った関数
  • numpy.zeros : 要素が0のndarrayの生成
  • numpy.copy : ndarrayを複製
  • random.sample : リストからランダム・重複なしに要素を取得
  • numpy.array : リストをndarrayに変換
  • ndarray.reshape : ndarrayの変形
  • cv2.putText : 画像に文字を表示
  • cv2.imwrite : 画像を保存する
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、ファイル名"twins.jpg"で、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。

コード
import random #randomのインポート
import numpy as np #numpyのインポート
import cv2  #OpenCVのインポート

img=np.zeros((500, 500, 3), np.uint8) #500x500x3要素の3次元ndarrayを生成し値を0に
img[:,:,0:3]=[51,40,92]  #全画素にBGR=51,40,92(ダークブラウン)を設定
#横線を引く:y100からy400まで100ピクセルおきに白い(BGRすべて255)横線を引く
img[100:500:100, :, :] = 255
#縦線を引く:x100からx400まで100ピクセルおきに白い(BGRすべて255)縦線を引く
img[:, 100:500:100, :] = 255

bingo = list(range(1,71)) #1~70まで70個の連続した数値からなるリスト'bingo'を生成

for i in range(3): #作るビンゴカード枚数分、繰り返す
    
    bingo_img=np.copy(img) #縦横線を引いた画像ingをbingo_imgにコピー   
    
    #リスト'bingo'からランダムに25個の要素を重複なしに選択、リスト'bingo_25'に代入
    bingo_25=random.sample(bingo, 25) 
    bingo_25n=np.array(bingo_25) #リスト'bingo_25'をndarray'bingo_25n'に変換
    bingo_5x_5x=bingo_25n.reshape(5,5) #ndarray'bingo_25n'を5行5列に変換

    text_y=70 #文字表示位置のy座標
    for y in range(5): #yを0~4まで繰り返す
        text_x=10  #文字表示位置のx座標
        for x in range(5): #xを0~4まで繰り返す
            bingo_number=str(bingo_5x_5x[y,x])
            #文字列bingo_numberを座標(text_x, text_y)にサイズ2、白、文字太さ3で描画
            cv2.putText(bingo_img, bingo_number, (text_x, text_y), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 255, 255), thickness=3)
            text_x=text_x+100 #文字表示位置のx座標を100ピクセルずらす
        text_y=text_y+100 #文字表示位置のy座標を100ピクセルずらす
    
    save_filename='bingocard'+str(i)+'.png' #保存用ファイル名設定 bingocard0.png,bingocard1.pngのような連番
    cv2.imwrite(save_filename,bingo_img) #bingo_imgを保存

実行結果

3枚のビンゴカードが画像ファイルとして保存されました f:id:T_A_T:20190330181245p:plain
bingocard0.png

f:id:T_A_T:20190330181314p:plain
bingocard1.png

f:id:T_A_T:20190330181352p:plain
bingocard2.png


生成したデータは次のように画像まで変換しています。

1~70までのリスト

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70]

そこから25個の数字をランダムに重複なしに取得したリスト

[21, 39, 33, 23, 24, 10, 17, 28, 5, 65, 18, 11, 22, 3, 43, 63, 27, 8, 13, 58, 46, 38, 69, 4, 35]

ndarrayに変換

[21 39 33 23 24 10 17 28 5 65 18 11 22 3 43 63 27 8 13 58 46 38 69 4 35]

5x5の二次元ndarrayに変換

[[21 39 33 23 24]
[10 17 28 5 65]
[18 11 22 3 43]
[63 27 8 13 58]
[46 38 69 4 35]]

画像に表示

f:id:T_A_T:20190330181352p:plain
bingocard2.png

以下のサイトを参考にさせていただきました

note.nkmk.me >> Pythonでリストからランダムに要素を選択するchoice, sample, choices
OpenCV-Python Tutorials >> 画像にテキストを書き加える

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村