どーっもーー
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()

こんな感じで、上下の真ん中の棒の長さは一緒です。
ただ上の棒の方がやや少しだけ長く見えます。
カフェウォール錯視
横に引いた線の近くに
交互に四角を配置すると
横の線が斜めになっているように
見えるというものです。
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()

横線は斜めに傾いて見えますかね?
エビング錯視
同じ大きさの円を用意して
その周囲に大きい円と小さい円を配置します。
大きい円の中の円が小さく見えて
小さい円の中の円が大きく見えるという錯視です
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()

右のオレンジ円の方が
左のオレンジ円よりも
大きく見えませんか?
ヘリング錯視
中央から放射状に線を描き
それをまたがるように横線を描くと
横線が中央から出る線をまたぐ部分が
膨らんで見えるという錯視です。
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()

中央の横線部分が
膨らんで見えませんかね?
デルブーフ錯視
円の過小視、過大視
青い円の大きさは同じですが
その中や外に円を描くと
元の円の大きさが小さく見えたり
大きく見えたりします。
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()
青い円の大きさは一緒ですが
違和感を覚えませんか?
このような錯視は
まだまだ他にもたくさんあります。
今回は一旦PILライブラリで画像を作成して
それをmatplotlibで描画するという方法をとりました。
こうすると簡単に線を引いたりして
錯視画像を作成できます。
みなさまも錯視ができると
とっても錯xyじゃないですかー!!!
って言いたいだけのネタでした。
