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

錯視

今回は新しい錯視が見つかったそうなので
作図してみました。


解説動画はこちら



さて今回見つかった錯視は
その名も「膨張する穴」
だそうです。

英語だと「expanding hole」
だそうで、そのままですねえ。

中央にある暗い部分が
膨張しているように見える錯視だそうです。


早速作図してみましょう。

コードはこちら
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

# im_base
im = Image.new('RGB', (1000, 600), (255, 255, 255))
draw = ImageDraw.Draw(im)
width , height = im.size
sw , sh = 20 , 10

# Hole1
for i in range(300,1,-1):
    if i>50:
        a = i-50
        draw.ellipse((width//2-int(i*1.5) , height//2-i , width//2+int(i*1.5),  height//2+i) , fill=(0+a, 0+a, 0+a))
    else:
        draw.ellipse((width//2-int(i*1.5) , height//2-i , width//2+int(i*1.5),  height//2+i) , fill=(0, 0, 0))
        break

# Hole2
for j in range(height//sh):
    for i in range(width//sw):
        if (i%2==0 and j%2==0) or (i%2==1 and j%2==1):
            draw.ellipse((i*sw , j*sh , i*sw+sw,  j*sh+sh) , fill=(0, 0, 0))

# im_show
plt.figure(figsize=(20,12))
plt.imshow(np.asarray(im))
plt.axis('off')
plt.show()

実行すると画像が出来上がります

・・・
download


うひょーーー
目がおかしくなりそうですねえ

やっているのは
単純に楕円を描いているだけなんですが
中央のブラックホールっぽいのが
だんだん広がっているようにも見えます。

こんなに大きくなっちゃっていいんでしょうか

今回は目がおかしくなりそうな
新しい錯視の作図方法のご紹介でした
それでは。




はいどうも

また錯視です。


動画はこちら



今回は
色違いに見えるボールを
描いてみましょう。

まずはライブラリを用意します。
from PIL import Image, ImageDraw, ImageFilter

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

次にソースはこちら


plt.figure(figsize=(16,9))
size ,c_y,c_v = (320, 320),(255, 241, 0),(170, 68, 153)
im1,im2 = Image.new("RGB", size, color=c_y),Image.new("RGB", size, color=c_v)
dst = Image.new('RGB', (im1.width + im2.width, im1.height))
dst.paste(im1, (0, 0))
dst.paste(im2, (im1.width, 0))
draw = ImageDraw.Draw(dst)
draw.ellipse(((  30,30,290,290)),fill=(0, 127, 127), outline=None)
draw.ellipse(((350,30,610,290)),fill=(0, 127, 127), outline=None)

r = 8
for x in range(0,320,12):
    for y in range(0,320,12):
        draw.ellipse((x,y,x+r,y+r),fill=c_v, outline=None)
for x in range(320,640,12):
    for y in range(0,320,12):
        draw.ellipse((x,y,x+r,y+r),fill=c_y, 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(dst))
plt.show()


実行していただくと
こんな感じの画像が出力されます。

ball

右と左の大きな円は
実は同じ色なんです!!!!!!

一同「えーーー、なんだってーー」

円が
同じ色に
みえん!!

なんちってね

背景の黄色と紫
その上に乗せた緑色の円

その上に小さな円を載せると
元の円の色が明るく見えたり
暗く見えたりするので

二つの円が違って見えるんだそうな

ソースの

r = 8

を小さくしてもらうと
上に重ねた円の大きさが変わり、
大きな円の色が同じであるということが
わかっていくと思います。

試しにやってみてください

それでは。



 


どーっもーー
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じゃないですかー!!!

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

このページのトップヘ