期末報告 學號 題目 === * 請寫下想用matlab或是python作的問題、規劃等等 * 記得填寫學號姓名 * 可放上一些網路上蒐集到的資料,比方說 * [網路上的資料](https://yungyuc.github.io/oldtech/python/python_imaging.html) * 如果是團隊(2-4人)期末報告,請寫在同一份hackmd文件中,文件中需列出成員名單(工作分配)。 * 若題目太過簡單不適合作為團隊期末報告,我們會要求改成個人期末報告(有些人必須要另外找題目)。 * 不確定使用matlab或是python也無妨,我們會根據你的題目建議使用哪種語言、套件。 * 若團隊改成個人作品,請在原hackmd文件上貼上每個新作品規劃hackmd文件的連結 --- 缺點 * pdf * 檔名 * 報告不清楚 * 報告不需要包含程式碼 ## 一些可能題目(難度適合一個人進行) ### 數位影像密碼學 * [數位影像密碼學](http://scimonth.blogspot.tw/2015/05/blog-post_39.html) * [4-ways-to-hide-secret-messages-in-picture](http://www.makeuseof.com/tag/4-ways-to-hide-secret-messages-in-pictures/) * [「愛的機器」事件](http://sex.ncu.edu.tw/blognews/?p=3408) * [Hide-a-File-in-an-Image-File](http://www.wikihow.com/Hide-a-File-in-an-Image-File) ---- ### 影像處理 使用matlab或是python作影像處理是很容易入門的。在matlab中,imread可以讀取一圖檔,以三維陣列(兩個是xy座標,第三維是RGB顏色)呈現,所以只要針對陣列的資料進行處理就可以將影像變化。 :::info [連結中](http://www.math.ncku.edu.tw/~mhchen/matlab_Introduction/)可以找到參考資料以及程式 ::: python中則是使用matplotlib套件裡的pyplot模組裡的imread函數。請參考[Simple image denoising example using 2-dimensional FFT](https://github.com/minhung/AppMathMethod/blob/master/ImageDenoising.ipynbt) 若是以matlab進行專題,可以搭配GUI,讓成果更好看。若是以python進行專題,由於課程應該來不及教授相關內容,所以請自行閱讀參考資料。 * [python的gui範例] #### 影像處理-Droste effect * Goal: 將一圖片變形(縮小,旋轉)後再疊在原圖上 * 使用簡單的縮小mapping, 將原圖縮小 * 使用旋轉矩陣的概念, 試著將原圖片旋轉一固定角度 * 縮小以及旋轉的功能成功後, 再將新圖加在舊圖上 * 重複操作多次後可以得到Droste effect的效果 * 建議使用 matlab + gui Note: 若使用 Image Processing Toolbox 裡的 imrotate, 由於旋轉圖尺寸不方正, 直接加在舊圖上會有大塊黑色區域, 可能要使用xor之類的技巧 Reference: * [Droste effect-wiki](https://en.wikipedia.org/wiki/Droste_effect) * [Droste effect (Mathematics Math21b Fall 2003 Harvard)](http://abel.math.harvard.edu/archive/21b_fall_03/droste/index1.html) Sample Code: * [rotation_triangle.m](http://math.ncku.edu.tw/~mhchen/iscs2016/proj/rotation_triangle.m) * [img_trans.m](http://math.ncku.edu.tw/~mhchen/iscs2016/proj/img_trans.m) * [poincare.jpg](http://math.ncku.edu.tw/~mhchen/iscs2016/proj/poincare.jpg) ---- #### 影像處理:油畫效果 濾鏡 有同學受到「君の名は」的影響,想發展新海誠畫風濾鏡,由於時間限制,可能無法在學期結束前得到滿意的結果。我會建議先作出油畫效果,之後再嘗試其他效果。 * [Image Filtering - matlab](https://www.mathworks.com/help/images/linear-filtering.html) * [Oil Painting in MATLAB](http://angeljohnsy.blogspot.com/2011/06/oil-painting-in-matlab.html) * [滤镜艺术---新海诚滤镜特效的实现解密](http://www.itdadao.com/articles/c15a838158p0.html) * [How to create effect like Van Gogh's stroke brush? (梵谷)](http://mathematica.stackexchange.com/questions/39003/how-to-create-effect-like-van-goghs-stroke-brush) ---- #### 影像處理:名言圖產生器、通緝令產生器 這類產生器基本上是把你上傳的圖片或是文字,疊加在其他圖片上而已,非常容易進行。 * [名言圖產生器](https://app.kxg.io/quote/) * [通緝令產生器](https://free.com.tw/free-generator-wanted/) 參考資料: * [CONVERT TEXT TO IMAGE](https://www.mathworks.com/matlabcentral/answers/168021-convert-text-to-image) * [insertText](https://www.mathworks.com/help/vision/ref/inserttext.html) ---- #### 影像處理:相片馬賽克 一種影像處理的藝術技巧,利用這個方式做出來的圖片,近看時是由許多張小照片合在一起的,但遠看時,每張照片透過光影和色彩的微調,組成了一張大圖的基本像素。 由於時間限制,可能無法找到夠多適合的圖片來組成大圖,一個變通辦法是改以文字來組成大圖。作法很簡單,先把大圖灰階處理(把RGB彩色轉成黑白),接著把大圖切成小塊,根據每小塊的黑白程度來選定字元代表該小塊 * [相片馬賽克 wiki](https://zh.wikipedia.org/wiki/%E7%9B%B8%E7%89%87%E9%A6%AC%E8%B3%BD%E5%85%8B) ---- #### 影像處理 Mode 7 這是一個透過縮放和旋轉背景層來顯示透視效果的一個技巧,請參考底下資料。 * [Mode7 wiki](https://zh.wikipedia.org/wiki/Mode_7) * [Mode 7 Part 1](http://www.coranac.com/tonc/text/mode7.htm) * ![](https://i.imgur.com/8kiCQ0M.jpg) * [奇特的"我喜歡你"](https://www.ptt.cc/bbs/TFSHS67th321/M.1212682454.A.117.html) ---- #### 其他 * [小畫家到底能幹嗎?神人用這招還原「監視器模糊車牌號」讓網友:不考慮去鑑識組嗎](http://ck101.com/thread-3745558-1-1.html) --- ### 訊號處理 可以參考上課時給的(GUI)例子。讀取音訊檔後,進行處理(擷取片段,重複,調整頻率) * [你聽過了嗎?圓周率寫成的鋼琴曲,他彈出了一首優美的π!突然不討厭數學了](http://changepw.com/view3/?p=7219) --- ### 數學相關 #### 工程用計算機 可以使用matlab的GUI來作一個工程用計算機。除了計算外,可以加上繪圖等功能:[類似這樣的計算機](http://web2.0calc.com/) 或是畫出微分方程的direction field等等[Slope Field by Nathan Grigg](https://slopefield.herokuapp.com/) ---- #### 碎形 這是很簡單的一種題目,根據碎形產生的公式,調整參數就可以得到漂亮的圖形。 * [碎形 Fractal](http://www.atlas-zone.com/complex/fractals/index.html) ---- #### 擺線/萬花尺 現在比較少見,不過二三十年前曾流行過的一種文具,可以畫出非常多漂亮的圖。原理大致上是擺線方程式,很適合作為專題題目。 ![image alt](https://upload.wikimedia.org/wikipedia/commons/9/90/Various_Spirograph_Designs.jpg) * [萬花尺- wiki](https://zh.wikipedia.org/wiki/%E8%90%AC%E8%8A%B1%E5%B0%BA) * [畫圈圈的萬花尺 (デザイン定規,Design Ruler)](http://4rdp.blogspot.tw/2011/08/blog-post.html) * [擺線](http://www.dynamath.tw/ChineseVersion/cycloid/rotcirhm.htm) ---- #### Dynamical System(ODE) * 題目可以參考 Computer modeling :from sports to spaceflight-- from order to chaos by J.M.A. Danby。([Computer Modeling 目錄](http://www.math.ncku.edu.tw/~mhchen/scicomp/contents.pdf)) * 該書蒐集了不少微分方程的問題可以作為專題(Chap 6-Chap 15), 同時有區分難易程度(易 一個電腦 <---->五個電腦 難/複雜) * 兩個電腦或是一個電腦的題目難度較適合做為期末報告 * 期末報告形式可以參考[生態學之 Lokta-Volterra 模型](http://episte.math.ntu.edu.tw/applications/ap_lokta/index.html), 內容包含欲解的問題, 使用的數值方法, 模擬結果:選取一些不同的參數/初始條件, 對時間做圖, 或是相平面做圖(兩個方程式時) 參考程式: * [my_euler_sys.m](http://math.ncku.edu.tw/~mhchen/iscs2016/proj/my_euler_sys.m) * [mypendulum.m](http://math.ncku.edu.tw/~mhchen/iscs2016/proj/mypendulum.m) * [my_euler_LV.m (Lokta-Volterra 模型)]( http://math.ncku.edu.tw/~mhchen/iscs2016/proj/my_euler_LV.m) --- ### Social Simulation * [Conway Game of Life (wiki)](https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life) * [Conways_Game_of_Life.pptx](http://math.ncku.edu.tw/~mhchen/iscs2016/proj/Conways_Game_of_Life.pptx) * 謝林實驗 * [bias.m](http://www.math.ncku.edu.tw/~mhchen/matlab/bias.m) *[bias.jpg](http://www.math.ncku.edu.tw/~mhchen/matlab/bias.jpg) * [rndwalk.m ](http://www.math.ncku.edu.tw/~mhchen/matlab/rndwalk.m) * [random.jpg](http://www.math.ncku.edu.tw/~mhchen/matlab/random.jpg) * [friend.jpg](http://www.math.ncku.edu.tw/~mhchen/matlab/friend.jpg) --- ## 遊戲相關 ### 成份分析 網路上常常看到成份分析或是稱號產生器,這類遊戲其實只是把你輸入的文字轉換為數字後,再運算出幾組數字(質因數分解等等)來決定成分或是稱號。 為了讓結果更有趣,可以搭配圓形圖或是屬性圖 #### matlab ```matlab str = input('中文:','s') double(str) ``` 上述程式會把輸入的str字串轉換成數字,幾個中英文字就會有幾個數字。 #### python ```python # -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ player = input('name:') print(player) print(ord(player[0])) print(ord(player[1])) ``` 以上程式會要求輸入name,假設輸入是一中文姓名,ord(player[0])表示的是第一個中文字對應的編碼。 --- ### 關於猜數字遊戲 這裡指的猜數字遊戲指的是四位數不重複數字的遊戲,數字位置皆對為A,數字對位置錯為B。 基本上來說,如果是電腦設定數字,人猜數字。這樣的程式不難寫,應該算是普通作業的份量,不能做為期末專題的題目。所以如果想以這個題目做為期末專題的同學,我建議加上人設定數字,電腦猜數字的AI/演算法或是加入GUI(圖形介面)。 如果要加入電腦猜數字的AI/演算法,最簡單和直覺的寫法,是從符合到目前為止的所有條件的數字中任選一個來猜。如果想要找其他更好的演算法,可以用google搜尋。或是參考[猜數字wiki](https://zh.wikipedia.org/wiki/%E7%8C%9C%E6%95%B0%E5%AD%97#.E8.A7.A3.E6.B3.95.EF.BC.88.E7.AC.AC.E4.B8.80.E7.A8.AE.E7.8E.A9.E6.B3.95.EF.BC.89) 另一個可能的題目是cheater。基本想法是在發現被對手猜到你的數字時,利用matlab找出滿足到目前為止的所有條件的其他數字,藉此修改你的預設數字。 #### 程式架構 如wiki上所說的,通過排除法,即遍歷所有可能的數,將不符合要求的數剃掉。每猜一次數字就可以把部分不合要求的數字剃除掉,最後就可以猜到數字。 整個程式除了最後整合起來的主程式外,可以分成三個:產生「可能解(Solution Pool)」、檢查幾A幾B、排除不可能解。 #### 可能解(Solution Pool) 產生可能解(Solution Pool)的方式有很多種,比方說先以四層迴圈產生數字會重複的一組陣列,之後再排除數字有重複的部分;或是在產生陣列時就先把重複的排除。 為簡化說明,底下的程式是以{0,1,2,3}四個數字來產生兩位數(可重複) ```matlab= sol_pool = {}; for i = 0:3 for j = 0:3 sol_pool{end+1} = strcat(int2str(i),int2str(j)); end end display(sol_pool); ``` 由於這個遊戲必須每個位數都要拿出來比較,所以每個數是以字串來儲存 ,整個可能解(Solution Pool)就必須以異質陣列(cell)儲存(請參考[MATLAB程式設計:入門篇](https://mirlab.org/jang/books/matlabProgramming4beginner/)第12章)。 行1 的"{}"是建立一個空的異質陣列;行 4則是把新的字串加入異質陣列sol_pool 中。 我們的目標是產生每個位數不重複的一組陣列,但是如果是先以上述程式產生一組陣列後,再排除不合規定的數,程式寫起來會很麻煩,所以我們改成產生陣列時就先排除這些可能:(一樣是四個數字來產生兩位數) ```matlab= sol_pool = {}; Ipool = 0:3; for i = Ipool Jpool = Ipool; Jpool(Jpool==i) = []; for j = Jpool sol_pool{end+1} = strcat(int2str(i),int2str(j)); %display(strcat(int2str(i),int2str(j))); end end display(sol_pool); ``` 十位數沒有限制,所以Ipool = 0:3。但是個位數不能和十位數重複,所以選取十位數後,個位數就不能選十位數那個數字,也就是Jpool是把Ipool扣掉選取的十位數。 ``` Jpool(Jpool==i) = [] ``` 四位數的產生方式類似,但是較為複雜,我會建議先以{0,1,2,3}四個數字測試,成功後再改回{0,1,...,9}10個數字。 #### 判斷幾A幾B 算是猜數字遊戲的核心函數,不過基本上是迴圈和if-else的運用,每個位數先判斷是否是A(數字在正確位置),若不是A則繼續判斷是否為B(在其他位置)。 這個函數不難寫,檢查程式正確與否可以代入幾組數字測試是否能正確判斷。 :::info * 由於比較結果有AB兩個輸出,所以matlab的函數呼叫時的寫法是 [Ra,Rb] = mycheck_ans(sample,mytry) * 假設guessing是一四位數的字串,則guessing(1)是千位數、guessing(2)是百位數... ::: #### 排除不可能解 假設電腦猜的數字(guessing)和解答(mysol)比較後的結果是1A2B,那可能解(Solution Pool)中每個四位數(mytry)和guessing比較後的結果如果不是1A2B就要剃除。反過來說,只有比較結果是1A2B的才可以留下來。可以參考前面產生可能解(Solution Pool)的做法,先宣告一個空的異質陣列 ``` newpool = {} ``` 之後再把符合規定的元素(element = sol_pool{ii})加入newpool ``` newpool{end+1} = element; ``` #### 其他提示 ##### 亂數: 假設可能解(Solution Pool)的大小是size (=length(sol_pool)),我們可以用randi這個函數產生一個小於等於size的正整數亂數,再以該亂數做為index挑出一個四位數(guessing): ``` iguess = randi(length(sol_pool),1) guessing = sol_pool{iguess} ``` :::warning 由於sol_pool是一個異質陣列,所以是大括弧({})。 ::: ##### int64 每回合必須輸入(input)幾A幾B,由於matlab預設輸入值是浮點數(double),可以用int64轉成整數。 --- ### I/O #### 鍵盤輸入 有些同學想要寫貪吃蛇之類的遊戲,但是我個人覺得可能不好寫。 如果是python的話,最佳的做法是使用pygame模組,但是anaconda沒有包含這個模組,所以不推薦使用python。 如果是matlab,可能需要使用KeyPressFcn這個功能: [Using arrow keys using KeyPressFcn](https://www.mathworks.com/matlabcentral/newsreader/view_thread/157527) #### 滑鼠選點 ginput matlab中若希望以滑鼠取點,基本上是使用ginput函數 --- ## 資料分析 * [如何看出一個動漫腳色或作品,過氣與否?](https://www.ptt.cc/bbs/C_Chat/M.1477243544.A.0E9.html)