GOTOキャンペーンと言うことで
各都道府県の標章の中で

ケツに入れたら痛そうな奴を
プログラムで探してみました。

解説動画はこちら





まずは画像ですが

県章一覧

この画像を使ってみます。
Japanese_Prefectural_Emblem

これが県の標章だそうです。
そんなものがあるとは知りませんでしたが
これをケツに入れるには
ケツの穴の大きさが間に合わないので
仮想で考えます。


どうやってケツに入れたら
痛いかどうかを考えればよいでしょうか?

画像の輪郭から角度を求めてあげて
その角度が少ないやつが痛そうですよね。

と言うわけで
この画像を縦横で切り分けて保存しました。
(6x8画像)

1県ずつ
輪郭を求めてみます。

輪郭を求めるコードは次の通りで
opencvを用いています。

%matplotlib inline
import cv2
import numpy as np
import matplotlib.pyplot as plt

file_path = 'img/5_7.png'
img = cv2.imread(file_path)

# 領域抽出
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binarized = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
contours, _ = cv2.findContours(binarized, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 領域描画
line_color , line_size = (0, 255, 0),1
plt.figure(figsize=(16,9))
cv2.drawContours(img, contours, -1, line_color , line_size)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
download

こんな形で輪郭が抽出されます。
findContoursで輪郭を求めることが出来ます。

輪郭を描画するには各点の座標がなければ
出来ないので、複数の座標が取得できています。

あとは3点があれば角度の計算ができますよね。
download-3

角度を求めて、その平均を各県で計算します。

次のようなコードで角度の計算をしています。

res = {}
for x in range(6):
    for y in range(8):
        file_path = 'img/{0}_{1}.png'.format(x,y)
        img = cv2.imread(file_path)
        img = img[10:140,10:145]

        # 領域抽出
        gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        _, binarized = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
        contours, _ = cv2.findContours(binarized, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        tmp = []
        for i in range(len(contours[0])-2):
            a,b,c = contours[0][i][0],contours[0][i+1][0],contours[0][i+2][0]
            ba = [abs(a[0]-b[0]),abs(a[1]-b[1])]
            bc = [abs(c[0]-b[0]),abs(c[1]-b[1])]
            cos_s = (ba[0]*bc[0] +  ba[1]*bc[1]) / (np.sqrt(ba[0]**2 + bc[0]**2) * np.sqrt(ba[1]**2 + bc[1]**2))
            
            dig = np.degrees(np.arccos(cos_s))
            if dig>5:
                tmp.append(dig)
        
        if not np.isnan(np.mean(tmp)):
            res[file_path]=np.mean(tmp)

さて
これで全県の県章の
平均角度が求まりました。

あとはこれのいっちゃんちっさい奴が
ケツに入れたら痛い奴のはずです。

結果は・・・

download-1

デーーん

第一回
ケツに入れたら痛そうな県章選手権の覇者は
千葉県に決まりました!!!!!


千葉県人として
誇り高いですねーーー
素晴らしい

森田さーーん
見てますかーーwwww

と言うわけで
無事、千葉県が
ケツに入れたら痛いそうでした。

今回はこれまでです。

それでは。