MIS.W 公式ブログ

早稲田大学公認、情報系創作サークル「早稲田大学経営情報学会」(MIS.W)の公式ブログです!

MIS.Wは自動でレポートを書く機械を作るサークルとして認知されているらしい【カウントダウンカレンダー2020冬2日目】

タイトルはnysyo談 筆者はプログラム的な発表をしたことが無かった →引退前に、pythonで絵を関数に変換しよう!

したごしらえ

まずは画像を用意する。54代のS氏のみすちゃんだと思う。違ったらごめん f:id:Leimen0:20201214184833p:plain

仰々しくフォトショでみすちゃんだけ抜いて解像度を下げる f:id:Leimen0:20201214185849p:plain

ほい(124*124) f:id:Leimen0:20201214190333p:plain

import cv2
# グレースケールで読み込み
gray_img = cv2.imread("image0.png", 0)

# エッジ検出
canny_img = cv2.Canny(gray_img, 150, 150)  # canny

# 書き込み
cv2.imwrite("cannyG.jpg", canny_img)

f:id:Leimen0:20201214191147j:plain

巡回セールスマン問題を解いて一筆書きに変換しよう!

参考↓ tony-mooori.blogspot.com

さてさて、かわいいみすちゃんが出来上がってるはずだぜ。 う、うわぁ。上下反転してるしなんかきもいw 完全ランダムの点群だとこのように最適化が難しい。 f:id:Leimen0:20201214192159p:plain

仕方がないのでアウトラインで試してみよう。上下逆なのは面倒なので素材を変更して対応する。 アウトラインなら綺麗に一筆書きにできました。

f:id:Leimen0:20201214192339p:plain

f:id:Leimen0:20201214192413j:plain

f:id:Leimen0:20201214192451p:plain

フーリエ変換をして関数にしよう!

フーリエ変換をしてx軸y軸それぞれの方向で時間軸と周波数軸の変換を行う(軸軸うるせえ!) ついでに数式処理ソフトウェアに読み込める文字列にする。

import numpy as np
import cmath
import matplotlib.pyplot as plt

data = np.loadtxt("bestofbest.csv",       # 読み込みたいファイルのパス
                  delimiter=",",    # ファイルの区切り文字
                  skiprows=1       # 先頭の何行を無視するか(指定した行数までは読み込まない)
                  )


def dft(f):
    n = len(f)
    Y = []
    N = 20  # 解像度
    for t in range(N):
        y = 0j
        for x in range(n):
            a = 2 * cmath.pi * t * x / n
            y += f[x] * cmath.e**(-1j * a)
        Y.append(y)
    return Y


x_list = data[:, 0]
y_list = data[:, 1]

x_dft = dft(x_list)
y_dft = dft(y_list)

x_dft_real = np.real(x_dft)
y_dft_real = np.real(y_dft)

x_dft_imag = np.imag(x_dft)
y_dft_imag = np.imag(y_dft)

w = np.fft.irfft(x_dft)
h = np.fft.irfft(y_dft)


"""np.sqrt(x_dft_real[j]*x_dft_real[j] +x_dft_imag[j]*x_dft_imag[j])/len(x_dft)*2
np.arctan2(x_dft_real[j],-1*x_dft_imag)"""

with open("x_dft.txt", mode='w') as f:

    f.write("x := ")
    for i in range(len(x_dft_real)):
        f.write("("+str(np.sqrt(x_dft_real[i]*x_dft_real[i] + x_dft_imag[i]*x_dft_imag[i]))+")sin("+str(
            np.arctan2(x_dft_real[i], -1*x_dft_imag[i]))+"+"+str(i)+"*theta)")
        if i == len(x_dft_real)-1:
            f.write(":")
            break
        f.write("\n+")

with open("y_dft.txt", mode='w') as f:

    f.write("y := ")
    for i in range(len(y_dft_real)):
        f.write("("+str(np.sqrt(y_dft_real[i]*y_dft_real[i] + y_dft_imag[i]*y_dft_imag[i]))+")sin("+str(
            np.arctan2(y_dft_real[i], -1*y_dft_imag[i]))+"+"+str(i)+"*theta)")
        if i == len(y_dft_real)-1:
            f.write(":")
            break
        f.write("\n+")

print("Created files.")

plt.plot(w, h)
plt.show()

これがみすちゃん関数だ!!!!

x軸

x := (34974.0)sin(1.5707963267948966+0*theta)
+(9050.138822799194)sin(2.267341587806863+1*theta)
+(886.0316851060844)sin(0.38851646264756323+2*theta)
+(749.2401368765334)sin(0.5291512692729754+3*theta)
+(425.14205310513)sin(1.5710726987170058+4*theta)
+(317.13684727971656)sin(1.0283562611064785+5*theta)
+(739.8248124270011)sin(-2.0019596536842266+6*theta)
+(266.3313976870815)sin(1.3627798014631836+7*theta)
+(423.36328086129333)sin(-0.565448034946528+8*theta)
+(296.37318897452417)sin(1.876110950173759+9*theta)
+(413.43427978373956)sin(-1.7689167446954908+10*theta)
+(266.32523918330764)sin(-2.490656007886714+11*theta)
+(218.1291113357074)sin(-1.9579221078460345+12*theta)
+(188.3280971905402)sin(0.7589820069765549+13*theta)
+(116.81748944126637)sin(2.4114555858159696+14*theta)
+(162.78147169309597)sin(-1.5888401010694209+15*theta)
+(21.78028469814579)sin(0.9663127087536325+16*theta)
+(209.85353861188472)sin(-1.9011667590184278+17*theta)
+(168.75598893162928)sin(-1.3505435772927352+18*theta)
+(144.4451605300347)sin(-1.734394272256021+19*theta)
+(56.34999764070094)sin(2.0126835203554463+20*theta)
+(146.02058531950127)sin(2.0074637184676636+21*theta)
+(77.74003922904227)sin(0.44568273105803236+22*theta)
+(95.12486088953676)sin(1.675042627660483+23*theta)
+(162.55691397467712)sin(-2.300261412986466+24*theta)
+(67.45935568925448)sin(-1.9375626663750225+25*theta)
+(48.0003214449879)sin(-0.996573690021064+26*theta)
+(4.494193319709665)sin(2.748825768795675+27*theta)
+(10.031482490499618)sin(0.4703042012095713+28*theta)
+(78.18807721239371)sin(2.315004922062205+29*theta)
+(67.47482272931343)sin(1.6334216955831147+30*theta)
+(46.50422423248715)sin(1.2349517898443736+31*theta)
+(21.01729840549134)sin(-2.9538776162366314+32*theta)
+(35.44814703973424)sin(-1.9956787889374084+33*theta)
+(29.355636880944285)sin(2.806471651767326+34*theta)
+(18.321209471148695)sin(2.3738022966369656+35*theta)
+(25.349097257865843)sin(-1.8897359167530445+36*theta)
+(10.729858672362647)sin(1.079898530915059+37*theta)
+(20.31135784676711)sin(-2.1340037162759025+38*theta)
+(36.43792922600436)sin(0.6786731602812706+39*theta)
+(40.701812268763284)sin(-0.6206921283463469+40*theta)
+(19.52885351111496)sin(0.024797657978342783+41*theta)
+(23.749357331495197)sin(-2.835961856734742+42*theta)
+(17.05040225061779)sin(2.515830486899962+43*theta)
+(15.115190270889364)sin(0.10144055997616916+44*theta)
+(25.318411332854453)sin(0.040816970874781845+45*theta)
+(11.24322523347303)sin(-2.252528311753943+46*theta)
+(11.956581818272888)sin(0.2108689182210156+47*theta)
+(25.391262378286786)sin(1.277277533733728+48*theta)
+(13.575654766280213)sin(0.33346768841456886+49*theta)
+(30.264240855068444)sin(2.341601050295465+50*theta)
+(19.43773047324765)sin(-3.005593609633857+51*theta)
+(14.470924964699181)sin(2.5945980901079393+52*theta)
+(8.70434955099616)sin(-2.2014870589001925+53*theta)
+(8.811708524187788)sin(-1.703994053236503+54*theta)
+(17.78731795374084)sin(-1.4115527075247007+55*theta)
+(10.285484839638007)sin(-0.06033416050643512+56*theta)
+(11.629174283091498)sin(0.9956651730879078+57*theta)
+(17.629026974071948)sin(-0.7523417766980669+58*theta)
+(23.215316023965517)sin(-0.12166718173691593+59*theta)
+(1.8231749863242654)sin(2.2964968061947713+60*theta)
+(10.96907841559924)sin(-1.8734859017441954+61*theta)
+(19.92714857556945)sin(-0.08362633419832742+62*theta)
+(5.552616505028343)sin(-1.1517003650152342+63*theta)
+(14.715849848283922)sin(0.22579686833682158+64*theta)
+(10.392273394921883)sin(-0.7113549425510444+65*theta)
+(9.825173542821913)sin(0.31087484140359967+66*theta)
+(11.566204912622794)sin(0.11675290367419068+67*theta)
+(16.505536454773686)sin(-0.847690244087027+68*theta)
+(9.594683916777926)sin(-2.459415376768953+69*theta)
+(11.768652423462184)sin(-0.3194958000522237+70*theta)
+(7.482925264296918)sin(2.0155616185489347+71*theta)
+(11.295893838262224)sin(-0.6067538949222219+72*theta)
+(11.713653185243954)sin(1.8342694339416368+73*theta)
+(2.43321768130421)sin(-2.8999829340082104+74*theta)
+(5.052032897909473)sin(-1.2397526311095162+75*theta)
+(12.075531812331695)sin(-1.0757933086700886+76*theta)
+(5.84610213655875)sin(-2.277973909289044+77*theta)
+(6.302128265857963)sin(-1.276139261891948+78*theta)
+(8.993390227968755)sin(2.209073352148865+79*theta)
+(8.513538406542336)sin(-0.4870199669425526+80*theta)
+(10.308817530112744)sin(-0.15629258400004328+81*theta)
+(12.117718797191673)sin(-0.1257141102886096+82*theta)
+(9.8725183828858)sin(-1.1242092430154202+83*theta)
+(9.03680128139072)sin(-0.06263635495781415+84*theta)
+(9.749928379200018)sin(-0.24716940109634258+85*theta)
+(3.130581463365143)sin(-2.423721594506868+86*theta)
+(2.0090809486878696)sin(1.8737759710804438+87*theta)
+(9.90868019616687)sin(-1.5547112054099654+88*theta)
+(6.175276671784773)sin(-0.6613274393898345+89*theta)
+(8.245469379101506)sin(-1.5609587331663273+90*theta)
+(5.346344725454909)sin(-0.23157798869583127+91*theta)
+(12.958817018335784)sin(-0.1337314716537506+92*theta)
+(3.719432540476971)sin(-1.44470931665629+93*theta)
+(3.939941034560307)sin(1.140937480944931+94*theta)
+(6.192969273455028)sin(-0.7271204095119294+95*theta)
+(7.689294312373138)sin(0.4849427635543728+96*theta)
+(7.608260581369542)sin(-0.5658574937434951+97*theta)
+(2.378683565972801)sin(0.28275567610779484+98*theta)
+(6.769948692744841)sin(-0.015683482987251175+99*theta):

y軸

y := (32033.0)sin(1.5707963267948966+0*theta)
+(14201.100377878678)sin(0.7483979951877484+1*theta)
+(577.2808943329476)sin(-0.241921683290122+2*theta)
+(559.7895908960994)sin(-2.000869136011776+3*theta)
+(419.96849859394786)sin(1.8366740488483522+4*theta)
+(637.3232286337192)sin(1.5188895321196463+5*theta)
+(315.0396584067336)sin(2.645465664522148+6*theta)
+(397.98807776442794)sin(0.9996265270975466+7*theta)
+(321.55831665743364)sin(-0.6329729375972493+8*theta)
+(147.49097870756364)sin(2.0426086007849995+9*theta)
+(613.9770399772019)sin(-1.2316365957439634+10*theta)
+(351.69613748417953)sin(1.0997709107711917+11*theta)
+(156.38539404664846)sin(-2.75637270397021+12*theta)
+(293.66692678714844)sin(-0.5044940275179859+13*theta)
+(121.83365126496747)sin(1.8381760411944426+14*theta)
+(93.43697131196325)sin(-3.059505343718339+15*theta)
+(152.38686156320276)sin(-1.6637690527730606+16*theta)
+(150.63118913068817)sin(2.0775120789013006+17*theta)
+(102.67142627467231)sin(3.0571562815253803+18*theta)
+(56.27450289500083)sin(2.539236859930966+19*theta)
+(184.27543899619093)sin(2.801254909721937+20*theta)
+(60.58109553167884)sin(-2.431051641035379+21*theta)
+(58.6083789555377)sin(2.3859113367652345+22*theta)
+(24.432393904453587)sin(1.1522024903421926+23*theta)
+(31.412228914208992)sin(-1.4709413137832237+24*theta)
+(93.16910459033426)sin(1.0793446182931847+25*theta)
+(44.76432258377431)sin(-2.24688614955756+26*theta)
+(36.27639426550731)sin(-1.9063380115686768+27*theta)
+(25.894340793796825)sin(-0.06553325376543208+28*theta)
+(47.93695988457835)sin(-1.6821037025430718+29*theta)
+(63.256016397020325)sin(0.04439577649617959+30*theta)
+(68.49241295193761)sin(-0.713652532422953+31*theta)
+(37.89742956059006)sin(1.130585855286702+32*theta)
+(43.529837578404006)sin(-0.6816237111830192+33*theta)
+(37.07992250791973)sin(2.7935502249038304+34*theta)
+(44.29930328312754)sin(0.19757074438651995+35*theta)
+(17.888888065964665)sin(0.1705626975079719+36*theta)
+(17.902031262068885)sin(1.5380678765228122+37*theta)
+(7.227293616163571)sin(0.2817856698531246+38*theta)
+(45.035557876809854)sin(2.676065814084757+39*theta)
+(15.248172322603157)sin(-2.0884993325779737+40*theta)
+(33.87978226974714)sin(-2.754677781653806+41*theta)
+(12.285872218193186)sin(-1.2418709929322995+42*theta)
+(22.770611434127453)sin(-2.6425355863473445+43*theta)
+(4.743842992974714)sin(-2.0928687797114267+44*theta)
+(25.730474583321293)sin(2.9667907366379396+45*theta)
+(33.090152866234234)sin(-2.853807876130099+46*theta)
+(29.571799476416174)sin(-2.7749460151053444+47*theta)
+(16.98428997356901)sin(3.123607209894946+48*theta)
+(15.937653166602804)sin(-1.5772576495860888+49*theta)
+(20.290348216645146)sin(0.07270693796022637+50*theta)
+(11.012582709486026)sin(1.0937470250162058+51*theta)
+(10.581510333131757)sin(-2.7815434206781213+52*theta)
+(36.22274172652065)sin(0.9401796201624125+53*theta)
+(18.134423332749233)sin(-1.2145879468534766+54*theta)
+(26.89524914108621)sin(1.5858763554439377+55*theta)
+(7.096169779291482)sin(-0.09419318484985789+56*theta)
+(29.764283858364838)sin(1.9360743955324056+57*theta)
+(19.039837763846723)sin(0.20905554097841125+58*theta)
+(11.221177068297706)sin(-3.043243422153552+59*theta)
+(14.170663859632334)sin(2.6091886890989793+60*theta)
+(6.751199451274523)sin(-1.1880545352816914+61*theta)
+(25.46778908445606)sin(2.4323773927953676+62*theta)
+(9.390086362154621)sin(-1.9852069091546876+63*theta)
+(27.06666479533798)sin(2.769645970476025+64*theta)
+(18.071807383499767)sin(1.8593740930223948+65*theta)
+(19.804237864253622)sin(-2.4929892426310687+66*theta)
+(7.245411696368156)sin(0.02906688913246624+67*theta)
+(17.783629759896684)sin(-2.3110647438847782+68*theta)
+(5.914523583084507)sin(-2.290444898059375+69*theta)
+(4.099646165612632)sin(-2.7286748272503694+70*theta)
+(4.6947801327031575)sin(0.9684315575399872+71*theta)
+(10.276081537224366)sin(-0.2631633041002387+72*theta)
+(7.5493063764607795)sin(-2.6953731131315655+73*theta)
+(3.4549731605693137)sin(-0.9629165347984274+74*theta)
+(11.113841606061218)sin(2.019019811794397+75*theta)
+(8.220747894542079)sin(2.866450797041906+76*theta)
+(6.604644681537263)sin(1.571417049519325+77*theta)
+(17.54762041265197)sin(1.9053383563723418+78*theta)
+(10.039808904161383)sin(0.24814141111415858+79*theta)
+(13.739153156500958)sin(2.2072507239525563+80*theta)
+(6.883261638288223)sin(0.6517610740935016+81*theta)
+(15.46496942136173)sin(2.050566007826554+82*theta)
+(9.272841412423535)sin(1.9615110971326801+83*theta)
+(7.016971305291619)sin(1.7344090891892066+84*theta)
+(3.7764863443643475)sin(-2.4577183385575965+85*theta)
+(14.059053133000578)sin(-1.1262191914823332+86*theta)
+(6.275612420412505)sin(-2.992963485357378+87*theta)
+(2.679794595500572)sin(2.1873064627987073+88*theta)
+(4.53152419782687)sin(-2.928022494788396+89*theta)
+(3.1032841761631285)sin(0.8179006341211016+90*theta)
+(5.313963180573108)sin(-2.2774942579361444+91*theta)
+(4.423242364940191)sin(-2.932242434397683+92*theta)
+(4.33686081386715)sin(0.25282916737903194+93*theta)
+(2.0242986566368764)sin(-1.3839903876837882+94*theta)
+(4.110081376979299)sin(0.3188925794517382+95*theta)
+(3.1888142205286876)sin(2.204123616711247+96*theta)
+(4.7786363861891505)sin(0.2043432106782523+97*theta)
+(5.302959883537051)sin(1.2961791923996968+98*theta)
+(2.707878673148387)sin(-1.760681958336304+99*theta):

ぷろっとしたようす↓

f:id:Leimen0:20201214193418p:plain

明日のカウントダウンカレンダー3日目は53代オダマキさんの記事です。 オダマキ君愛してる

おわり