Try   HackMD

期末報告 學號 題目

  • 請寫下想用matlab或是python作的問題、規劃等等
  • 記得填寫學號姓名
  • 可放上一些網路上蒐集到的資料,比方說
  • 如果是團隊(2-4人)期末報告,請寫在同一份hackmd文件中,文件中需列出成員名單(工作分配)。
    • 若題目太過簡單不適合作為團隊期末報告,我們會要求改成個人期末報告(有些人必須要另外找題目)。
  • 不確定使用matlab或是python也無妨,我們會根據你的題目建議使用哪種語言、套件。
  • 若團隊改成個人作品,請在原hackmd文件上貼上每個新作品規劃hackmd文件的連結

缺點

  • pdf
  • 檔名
  • 報告不清楚
  • 報告不需要包含程式碼

一些可能題目(難度適合一個人進行)

數位影像密碼學


影像處理

使用matlab或是python作影像處理是很容易入門的。在matlab中,imread可以讀取一圖檔,以三維陣列(兩個是xy座標,第三維是RGB顏色)呈現,所以只要針對陣列的資料進行處理就可以將影像變化。

連結中可以找到參考資料以及程式

python中則是使用matplotlib套件裡的pyplot模組裡的imread函數。請參考Simple image denoising example using 2-dimensional FFT

若是以matlab進行專題,可以搭配GUI,讓成果更好看。若是以python進行專題,由於課程應該來不及教授相關內容,所以請自行閱讀參考資料。

  • [python的gui範例]

影像處理-Droste effect

  • Goal: 將一圖片變形(縮小,旋轉)後再疊在原圖上
  • 使用簡單的縮小mapping, 將原圖縮小
  • 使用旋轉矩陣的概念, 試著將原圖片旋轉一固定角度
  • 縮小以及旋轉的功能成功後, 再將新圖加在舊圖上
  • 重複操作多次後可以得到Droste effect的效果
  • 建議使用 matlab + gui
    Note: 若使用 Image Processing Toolbox 裡的 imrotate, 由於旋轉圖尺寸不方正, 直接加在舊圖上會有大塊黑色區域, 可能要使用xor之類的技巧
    Reference:
  • Droste effect-wiki
  • Droste effect (Mathematics Math21b Fall 2003 Harvard)
    Sample Code:
  • rotation_triangle.m
  • img_trans.m
  • poincare.jpg

影像處理:油畫效果 濾鏡

有同學受到「君の名は」的影響,想發展新海誠畫風濾鏡,由於時間限制,可能無法在學期結束前得到滿意的結果。我會建議先作出油畫效果,之後再嘗試其他效果。


影像處理:名言圖產生器、通緝令產生器

這類產生器基本上是把你上傳的圖片或是文字,疊加在其他圖片上而已,非常容易進行。

參考資料:


影像處理:相片馬賽克

一種影像處理的藝術技巧,利用這個方式做出來的圖片,近看時是由許多張小照片合在一起的,但遠看時,每張照片透過光影和色彩的微調,組成了一張大圖的基本像素。

由於時間限制,可能無法找到夠多適合的圖片來組成大圖,一個變通辦法是改以文字來組成大圖。作法很簡單,先把大圖灰階處理(把RGB彩色轉成黑白),接著把大圖切成小塊,根據每小塊的黑白程度來選定字元代表該小塊


影像處理 Mode 7

這是一個透過縮放和旋轉背景層來顯示透視效果的一個技巧,請參考底下資料。


其他


訊號處理

可以參考上課時給的(GUI)例子。讀取音訊檔後,進行處理(擷取片段,重複,調整頻率)


數學相關

工程用計算機

可以使用matlab的GUI來作一個工程用計算機。除了計算外,可以加上繪圖等功能:類似這樣的計算機

或是畫出微分方程的direction field等等Slope Field by Nathan Grigg


碎形

這是很簡單的一種題目,根據碎形產生的公式,調整參數就可以得到漂亮的圖形。


擺線/萬花尺

現在比較少見,不過二三十年前曾流行過的一種文具,可以畫出非常多漂亮的圖。原理大致上是擺線方程式,很適合作為專題題目。

image alt


Dynamical System(ODE)

  • 題目可以參考 Computer modeling :from sports to spaceflight from order to chaos by J.M.A. Danby。(Computer Modeling 目錄)
  • 該書蒐集了不少微分方程的問題可以作為專題(Chap 6-Chap 15), 同時有區分難易程度(易 一個電腦 <>五個電腦 難/複雜)
  • 兩個電腦或是一個電腦的題目難度較適合做為期末報告
  • 期末報告形式可以參考生態學之 Lokta-Volterra 模型, 內容包含欲解的問題, 使用的數值方法, 模擬結果:選取一些不同的參數/初始條件, 對時間做圖, 或是相平面做圖(兩個方程式時)

參考程式:


Social Simulation


遊戲相關

成份分析

網路上常常看到成份分析或是稱號產生器,這類遊戲其實只是把你輸入的文字轉換為數字後,再運算出幾組數字(質因數分解等等)來決定成分或是稱號。

為了讓結果更有趣,可以搭配圓形圖或是屬性圖

matlab

str = input('中文:','s')
double(str)

上述程式會把輸入的str字串轉換成數字,幾個中英文字就會有幾個數字。

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

另一個可能的題目是cheater。基本想法是在發現被對手猜到你的數字時,利用matlab找出滿足到目前為止的所有條件的其他數字,藉此修改你的預設數字。

程式架構

如wiki上所說的,通過排除法,即遍歷所有可能的數,將不符合要求的數剃掉。每猜一次數字就可以把部分不合要求的數字剃除掉,最後就可以猜到數字。

整個程式除了最後整合起來的主程式外,可以分成三個:產生「可能解(Solution Pool)」、檢查幾A幾B、排除不可能解。

可能解(Solution Pool)

產生可能解(Solution Pool)的方式有很多種,比方說先以四層迴圈產生數字會重複的一組陣列,之後再排除數字有重複的部分;或是在產生陣列時就先把重複的排除。

為簡化說明,底下的程式是以{0,1,2,3}四個數字來產生兩位數(可重複)

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程式設計:入門篇第12章)。
行1 的"{}"是建立一個空的異質陣列;行 4則是把新的字串加入異質陣列sol_pool 中。

我們的目標是產生每個位數不重複的一組陣列,但是如果是先以上述程式產生一組陣列後,再排除不合規定的數,程式寫起來會很麻煩,所以我們改成產生陣列時就先排除這些可能:(一樣是四個數字來產生兩位數)

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(在其他位置)。
這個函數不難寫,檢查程式正確與否可以代入幾組數字測試是否能正確判斷。

  • 由於比較結果有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}

由於sol_pool是一個異質陣列,所以是大括弧({})。

int64

每回合必須輸入(input)幾A幾B,由於matlab預設輸入值是浮點數(double),可以用int64轉成整數。


I/O

鍵盤輸入

有些同學想要寫貪吃蛇之類的遊戲,但是我個人覺得可能不好寫。

如果是python的話,最佳的做法是使用pygame模組,但是anaconda沒有包含這個模組,所以不推薦使用python。

如果是matlab,可能需要使用KeyPressFcn這個功能:
Using arrow keys using KeyPressFcn

滑鼠選點 ginput

matlab中若希望以滑鼠取點,基本上是使用ginput函數


資料分析