見出し画像

ポケモンSV レイド結晶の出やすい箇所を調べたい

前回の続きです。

前回差分検出用のテンプレート画像の生成に成功したので、結晶出現率を調べたいと思います。

前回テンプレート画像作成に使用した画像をそのまま使用します。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
from PIL import Image, ImageDraw
import numpy as np
import collections

anchor = "center"

def open_image(path: str) -> Image.Image:
    if anchor in path:
        image = Image.open(f"MapImageProcces/image/{path}")
    else:
        image = Image.open(f"MapImageProcces/image/{anchor}/{path}")
    return image

template = np.array(open_image(f"{anchor}_result.png"))
map_images = os.listdir(f"MapImageProcces/image/{anchor}")
image = open_image(map_images[0])
array = [[[] for i in range(image.size[0])] for i in range(image.size[1])]
for num, path in enumerate(map_images):
    diff = template.astype(np.int16) - np.array(open_image(path)).astype(np.int16)
    diff = ((diff + 256) // 2)
    diff = diff.astype(np.uint8)
    threshold = 128
    threshold_num = 10
    diff = np.where(diff >= threshold + threshold_num, 255, np.where(diff <= threshold - threshold_num, 255, 0))
    for index, y in enumerate(diff):
        for column, x in enumerate(y):
            if x != 0:
                array[index][column].append(x)

max_x = 0
for index, y in enumerate(array):
    for column, x in enumerate(y):
        if max_x < len(x):
            max_x = len(x)

for index, y in enumerate(array):
    for column, x in enumerate(y):
        ratio = (len(x) / max_x) * 100
        color = (ratio * 255) / 100
        array[index][column] = int(color)

new_image = Image.fromarray(np.array(array).astype(np.uint8))
new_image.save(f"MapImageProcces/image/{anchor}_diff_result.png")
print(max_x)

テンプレート画像との濃度が+-10以上の箇所を白、それ以外を黒にした配列を生成します。

各画像から生成した配列を3次元配列でまとめて、白の最多出現数を調べます。

各ピクセルの白の出現数 / 最多出現数 * 100を白色の濃さとして新しい画像を生成します。

それっぽい画像が生成されました。

結果の画像をマスクにして赤単色の画像を合成したもの。
赤が濃いほど出現率が高くなります。


比較用にパルデアで出力したもの。
こう見るとキタカミは出現場所の候補が多く、分散してますね。


この記事が気に入ったらサポートをしてみませんか?