import numpy as np
import cv2
defmodel(X,Y,N,a,b):
for i inrange(N):
a,b=a**2-b**2+X,2*a*b+Y
c=a**2+b**2
c[c<4]=0
c[c>4]=255return(a,b,c)
defmand_plot(a,b,M):
for N inrange(2,20):
#print("now process is step ",N)
mdl_tpl=model(X,Y,1,a,b)
a,b=mdl_tpl[0],mdl_tpl[1]
if N//5%2==0:
img[mdl_tpl[2]==255]=N%5*41else:
img[mdl_tpl[2]==255]=255-N%5*41#1000枚の画像をmand_plptというファイルに保存するのでfilename定義.
filename="./mand_plot/"#画像の枚数1000枚
img_num=1001#画像のサイズは1000*1000.後でresizeして良いが,計算中はサイズそのままじゃないとプロットの精度が悪くなるので,保存時にresizeしましょう.
M=1000#極座標形の長さrの初期値
r=0.0#極座標形の角度thetaの初期値
theta=0.0for l inrange(1,img_num,1):
#rとthetaを少しずつ増加させる.thetaは全部で5pi回転する.
r+=1.0/(img_num-1)
theta+=5*np.pi/(img_num-1)
a=r*np.cos(theta)
b=r*np.sin(theta)
x,y=[np.linspace(-2,2,M)]*2
X,Y=np.meshgrid(x,y)
mdl_tpl=model(X,Y,1,a,b)
a,b,img=mdl_tpl[0],mdl_tpl[1],mdl_tpl[2]
mand_plot(a,b,M)
#画像を保存前にresize
img=cv2.resize(img,(500,500))
if l<10:
cv2.imwrite(filename+"mad"+"00"+str(l)+".png",img)
elif l<100:
cv2.imwrite(filename+"mad"+"0"+str(l)+".png",img)
else:
cv2.imwrite(filename+"mad"+str(l)+".png",img)
print("now process is ",l,"\n")
画像を動画に書き出すプログラム.↓
import cv2
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
#(500,500)は画像のサイズ.
video = cv2.VideoWriter('video_c4_M1000.mov', fourcc, 20.0, (500, 500))
for i inrange(1, 1001,1):
if i<10:
img = cv2.imread('mad'+"00"+str(i)+'.png')
elif i<100:
img = cv2.imread('mad'+"0"+str(i)+'.png')
else:
img = cv2.imread('mad'+str(i)+'.png')
#img = cv2.resize(img, (500,500))
video.write(img)
video.release()