乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

可視化


どーっもーー
AKBの錯視原りのでーーっす

ということで
今回は
「錯視」をやっていきたいと思います。



動画はこちら




さて 
錯視は色々な種類があり
今回紹介するのは
同じ長さや大きさのものだけど
歪んで見える感じの画像を作成していきます。

まずは必要なライブラリの読み込みです。
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
import numpy as np

%matplotlib inline



それでは有名どころの錯視はらいってみましょうーー

ミュラー・リヤー錯視

同じ大きさの線に少し手を加えると
長く見えたり短く見えたりするやつです。
plt.figure(figsize=(20,9))
size = (800, 400)
color1,color2,width = (150, 100, 220), (200, 120, 200),5

im = Image.new("RGB", size, color=(255, 255, 255))
draw = ImageDraw.Draw(im)

x1,x2,y1,y2 = size[0]//3,size[0]//3*2,size[1]//3,size[1]//3*2

draw.line([(x1,y1),(x2,y1)] , width = width, fill = color2)
draw.line([(x1,y1),(x1-x1//3,y1-y1//3)] , width = width, fill = color1)
draw.line([(x1,y1),(x1-x1//3,y1+y1//3)] , width = width, fill = color1)
draw.line([(x2,y1),(x2+x1//3,y1-y1//3)] , width = width, fill = color1)
draw.line([(x2,y1),(x2+x1//3,y1+y1//3)] , width = width, fill = color1)
draw.line([(x1,y2),(x2,y2)] , width = width, fill = color2)
draw.line([(x1,y2),(x1+x1//3,y2-y1//3)] , width = width, fill = color1)
draw.line([(x1,y2),(x1+x1//3,y2+y1//3)] , width = width, fill = color1)
draw.line([(x2,y2),(x2-x1//3,y2-y1//3)] , width = width, fill = color1)
draw.line([(x2,y2),(x2-x1//3,y2+y1//3)] , width = width, fill = color1)

plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
plt.tick_params(bottom=False,left=False,right=False,top=False)
plt.imshow(np.array(im))
plt.show()

1

こんな感じで、上下の真ん中の棒の長さは一緒です。
ただ上の棒の方がやや少しだけ長く見えます。


カフェウォール錯視

横に引いた線の近くに
交互に四角を配置すると
横の線が斜めになっているように
見えるというものです。

def draw_image(im):
    draw = ImageDraw.Draw(im)
    width = im.size[0]
    box_size = width//5
    half,margin = box_size//2,0
    for j in range(5):
        margin = half//2 if j%2==0 else 0
        for i in np.array(range(5)) * box_size :
            draw.rectangle(((i+margin,j*half),(i+half+margin ,j*half+half)) , outline = None, fill = (0,0,0))
            #pass
    for j in range(1,5):
        
        draw.line([(0,j*half),(size[0],j*half+1)] , width = 3, fill = (160,160,160))
    return im

plt.figure(figsize=(20,9))
size = (800,400)
im = Image.new("RGB", size , color=(255,255,255))

im = draw_image(im)
plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
plt.tick_params(bottom=False,left=False,right=False,top=False)
plt.imshow(np.array(im))
plt.show()


2

横線は斜めに傾いて見えますかね?


エビング錯視

同じ大きさの円を用意して
その周囲に大きい円と小さい円を配置します。

大きい円の中の円が小さく見えて
小さい円の中の円が大きく見えるという錯視です

plt.figure(figsize=(20,9))
size = (640, 320)
im = Image.new("RGB", size, color=(255, 255, 255))

draw = ImageDraw.Draw(im)
c1,c2 = np.array([200, 160]),np.array([500, 160])
r1,r2,r3 = 30,50,15
draw.ellipse(((tuple(c1 - r1)), (tuple(c1 + r1))),fill=(228, 127, 66), outline=None)
draw.ellipse(((tuple(c2 - r1)), (tuple(c2 + r1))),fill=(228, 127, 66), outline=None)
for i in np.radians(range(0,360,60)):
    x2,y2 = np.cos(i)* 120,np.sin(i)* 120
    draw.ellipse((tuple(np.array([x2, y2]) + c1 - r2), 
                  tuple(np.array([x2, y2]) + c1 + r2)),fill=(146, 164, 184), outline=None)
for i in np.radians(range(0,360,45)):
    x2,y2 = np.cos(i)* 60,np.sin(i)* 60
    draw.ellipse((tuple(np.array([x2, y2]) + c2 - r3), 
                  tuple(np.array([x2, y2]) + c2 + r3)),fill=(146, 164, 184), outline=None)
plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
plt.tick_params(bottom=False,left=False,right=False,top=False)
plt.imshow(np.array(im))
plt.show()
3

右のオレンジ円の方が
左のオレンジ円よりも
大きく見えませんか?


ヘリング錯視


中央から放射状に線を描き
それをまたがるように横線を描くと
横線が中央から出る線をまたぐ部分が
膨らんで見えるという錯視です。

plt.figure(figsize=(20,9))
size = (800, 400)
im = Image.new("RGB", size, color=(255, 255, 255))

draw = ImageDraw.Draw(im)
num = 24
times = size[0]//num
color = (150, 100, 220)
for i in range(num):
    draw.line([(i*times,0),(size[0]-i*times,size[1])] , width = 2, fill = (100,100,100))
draw.line([(0,size[1]//3 ),(size[0],size[1]//3 )] , width = 5, fill = color)
draw.line([(0,size[1]//3*2),(size[0],size[1]//3*2)] , width = 5, fill = color)

plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
plt.tick_params(bottom=False,left=False,right=False,top=False)
plt.imshow(np.array(im))
plt.show()
4

中央の横線部分が
膨らんで見えませんかね?



デルブーフ錯視
円の過小視、過大視


青い円の大きさは同じですが
その中や外に円を描くと
元の円の大きさが小さく見えたり
大きく見えたりします。

plt.figure(figsize=(20,9),dpi=300)
size = (640, 320)
im = Image.new("RGB", size, color=(255, 255, 255))

draw = ImageDraw.Draw(im)
color = (0, 200, 220)
draw.arc((150 , 100 , 250 , 200), start=0, end=360, fill=color)
draw.arc((160 , 110 , 240 , 190), start=0, end=360, fill=(0, 0, 0))
draw.arc((350 , 100 , 450 , 200), start=0, end=360, fill=color)
draw.arc((340 , 90   , 460 , 210), start=0, end=360, fill=(0, 0, 0))

plt.tick_params(labelbottom=False,labelleft=False,labelright=False,labeltop=False)
plt.tick_params(bottom=False,left=False,right=False,top=False)
plt.imshow(np.array(im))
plt.show()

5

青い円の大きさは一緒ですが
違和感を覚えませんか?


このような錯視は
まだまだ他にもたくさんあります。

今回は一旦PILライブラリで画像を作成して
それをmatplotlibで描画するという方法をとりました。

こうすると簡単に線を引いたりして
錯視画像を作成できます。

みなさまも錯視ができると
とっても錯xyじゃないですかー!!!

って言いたいだけのネタでした。

どうも
乙pyです。

1966年から2019年まで
高校別での
東大合格者数で
ランキングレースを作ってみました。


 
動画はこちら




今と昔で大分顔ぶれが変わるのが面白い!!

知らない高校とかも
いっぱいある

東大に合格するには
やはり有名な進学校の方が
有利なのでしょうか?

学力には
周りの環境もある程度の
影響が出て来るのではないかと
推測します。

周りができる子ばかりだと
それに釣られてやる気が出たり

周りが悪い子ばかりだと
全然勉強しなくなったりとか

ある程度上の大学に
進学を考えている親御さんは
小学校の段階で

中学受験対策をしっかりして
結構良さげな中高に行かないと
周りの環境に流されてしまうんでは
なかろうかと思う次第です。

きゃー
大変ですねーー

そんな訳で
この動画に出て来るような
高校であれば

当然進学に期待が
できるようなところばかりですので

そう言う高校を目指して
小中のうちから勉学に励みまくれば
いい大学いけるんではないんですかねーー(人事www)

それでは
動画をお楽しみくださいませ!!

どうも乙pyです。

面白い可視化ツールを見つけたので
レース動画を作ってみました。

動画はこちら


さて
二位はどこでしょうか?

東京がずっと一位と言うことでも
なかったみたいで
なかなか面白いデータでした。

元は政府の人口統計データを使っていますので
こちらです。

統計データ

こう言う統計データってただ眺めるよりは
このように推移をみていくと
とても面白いと感じますが

この政府の統計データは
ほんと酷くって
すんごい使いづらい

カラムやデータの整備の仕方が
ほんと素人で
二次加工しないと使えないと言う
クソデータです。

統計を疎かにする政府は
いづれ破綻します。

まともになるように
税金を使ってほしいものです。

このページのトップヘ