Python、Pillowで画像の最頻値を取る!
どうも、Johnです。 テスト期間なんですが、進捗出したい欲がすごかった上、インターンのエントリーシートに「自分ブログやってまっせ!」と言ってしまったので書きたいと思います。
何やったのか
今回画像の最頻値を取るのですが、実はブログ始めたての頃に一度やっています。
このときはPython始めたてで何もわかんなかったので、入力画像3枚でしかできませんでしたが、今回は何枚でも出来るようにしました。
ソース(適当)
numpy使いてぇ、ってなって書き始めたのにそうでもなくなって悲しい。 あと英語できないのでネーミング勘弁して。
# coding:utf-8 import statistics as st from PIL import Image, ImageDraw import numpy as np def stmode(matrix): #最頻値が存在しない時、1番はじめの画像に準ずる try: mode=st.mode(matrix) except Exception:#statistics.StatisticsError mode=matrix[0] finally: res=(int(mode[:3]), int(mode[3:6]), int(mode[6:])) return res images=[] almost_images=13 num=0 while num < almost_images: image=Image.open("./tikuma/"+str(num)+".JPG", "r") #imagesに各画像のRGB値が入れられる images.append(np.array(image)) if not num: x_range=image.convert("RGB").size[0] y_range=image.convert("RGB").size[1] num+=1 #白いキャンバス作成 target=Image.new("RGB", ((x_range, y_range)), (255, 255, 255)) white_canvas=ImageDraw.Draw(target) y=0 while y < y_range: x=0 while x < x_range: before_mode=[] num=0 while num < almost_images: #各画像の[x][y]の要素(例,[1,14,514])を9桁の文字列(例,"001014514")に変換する before_mode.append(str(images[num][y][x][0]).zfill(3)+str(images[num][y][x][1]).zfill(3)+str(images[num][y][x][2]).zfill(3)) num+=1 #その最頻値を出し、白いキャンバスに色を置いて行く white_canvas.point((x, y), stmode(before_mode)) x+=1 y+=1 target.save("./tikuma/ans/ans"+str(almost_images)+".jpg", "JPEG", quality=100, optimize=True)
入力に使った画像
可愛いでしょ?
☆とGET、帰ボタンが違うので、これの除去を目標としました。
こんな感じに0~13.JPGとして使ってます。
結果
入力3枚 入力5枚 入力7枚 入力9枚 入力11枚 入力13枚
ちなみに処理にかかった時間は入力3枚~7枚までは2空3分。 11枚や13枚になると4分30秒と言ったところでした。
まとめ
艦これ楽しい!!!!!
まとめ改
GETと帰ボタンが枚数多くするごとにずれていっていたが、おそらく入力誤差であろう。もしかしたらこのぐらいの小さい変化であったら、平均を取った方がきれいになるかもね。
次からはちゃんとnumpy使うもん!