期末報告 學號 題目
===
* 請寫下想用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://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)
----
#### 擺線/萬花尺
現在比較少見,不過二三十年前曾流行過的一種文具,可以畫出非常多漂亮的圖。原理大致上是擺線方程式,很適合作為專題題目。

* [萬花尺- 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)