John(筋肉)の備忘録的な何か

備忘録的な何かであり、進捗そのものでもあるよ!!怖い人は見ないで!

Python、Pillowで画像の最頻値を取る!

どうも、Johnです。 テスト期間なんですが、進捗出したい欲がすごかった上、インターンエントリーシートに「自分ブログやってまっせ!」と言ってしまったので書きたいと思います。

何やったのか

今回画像の最頻値を取るのですが、実はブログ始めたての頃に一度やっています。

john-bardera.hatenablog.com

このときは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として使ってます。 f:id:julia-bardera-jb:20170730001714j:plain

結果

入力3枚 f:id:julia-bardera-jb:20170730000505j:plain 入力5枚 f:id:julia-bardera-jb:20170730000554j:plain 入力7枚 f:id:julia-bardera-jb:20170730000604j:plain 入力9枚 f:id:julia-bardera-jb:20170730000617j:plain 入力11枚 f:id:julia-bardera-jb:20170730000626j:plain 入力13枚 f:id:julia-bardera-jb:20170730000636j:plain

ちなみに処理にかかった時間は入力3枚~7枚までは2空3分。 11枚や13枚になると4分30秒と言ったところでした。

まとめ

艦これ楽しい!!!!!

まとめ改

GETと帰ボタンが枚数多くするごとにずれていっていたが、おそらく入力誤差であろう。もしかしたらこのぐらいの小さい変化であったら、平均を取った方がきれいになるかもね。

次からはちゃんとnumpy使うもん!