缺點
使用matlab或是python作影像處理是很容易入門的。在matlab中,imread可以讀取一圖檔,以三維陣列(兩個是xy座標,第三維是RGB顏色)呈現,所以只要針對陣列的資料進行處理就可以將影像變化。
連結中可以找到參考資料以及程式
python中則是使用matplotlib套件裡的pyplot模組裡的imread函數。請參考Simple image denoising example using 2-dimensional FFT
若是以matlab進行專題,可以搭配GUI,讓成果更好看。若是以python進行專題,由於課程應該來不及教授相關內容,所以請自行閱讀參考資料。
有同學受到「君の名は」的影響,想發展新海誠畫風濾鏡,由於時間限制,可能無法在學期結束前得到滿意的結果。我會建議先作出油畫效果,之後再嘗試其他效果。
這類產生器基本上是把你上傳的圖片或是文字,疊加在其他圖片上而已,非常容易進行。
參考資料:
一種影像處理的藝術技巧,利用這個方式做出來的圖片,近看時是由許多張小照片合在一起的,但遠看時,每張照片透過光影和色彩的微調,組成了一張大圖的基本像素。
由於時間限制,可能無法找到夠多適合的圖片來組成大圖,一個變通辦法是改以文字來組成大圖。作法很簡單,先把大圖灰階處理(把RGB彩色轉成黑白),接著把大圖切成小塊,根據每小塊的黑白程度來選定字元代表該小塊
這是一個透過縮放和旋轉背景層來顯示透視效果的一個技巧,請參考底下資料。
可以參考上課時給的(GUI)例子。讀取音訊檔後,進行處理(擷取片段,重複,調整頻率)
可以使用matlab的GUI來作一個工程用計算機。除了計算外,可以加上繪圖等功能:類似這樣的計算機
或是畫出微分方程的direction field等等Slope Field by Nathan Grigg
這是很簡單的一種題目,根據碎形產生的公式,調整參數就可以得到漂亮的圖形。
現在比較少見,不過二三十年前曾流行過的一種文具,可以畫出非常多漂亮的圖。原理大致上是擺線方程式,很適合作為專題題目。
參考程式:
網路上常常看到成份分析或是稱號產生器,這類遊戲其實只是把你輸入的文字轉換為數字後,再運算出幾組數字(質因數分解等等)來決定成分或是稱號。
為了讓結果更有趣,可以搭配圓形圖或是屬性圖
str = input('中文:','s')
double(str)
上述程式會把輸入的str字串轉換成數字,幾個中英文字就會有幾個數字。
# -*- 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)的方式有很多種,比方說先以四層迴圈產生數字會重複的一組陣列,之後再排除數字有重複的部分;或是在產生陣列時就先把重複的排除。
為簡化說明,底下的程式是以{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個數字。
算是猜數字遊戲的核心函數,不過基本上是迴圈和if-else的運用,每個位數先判斷是否是A(數字在正確位置),若不是A則繼續判斷是否為B(在其他位置)。
這個函數不難寫,檢查程式正確與否可以代入幾組數字測試是否能正確判斷。
假設電腦猜的數字(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是一個異質陣列,所以是大括弧({})。
每回合必須輸入(input)幾A幾B,由於matlab預設輸入值是浮點數(double),可以用int64轉成整數。
有些同學想要寫貪吃蛇之類的遊戲,但是我個人覺得可能不好寫。
如果是python的話,最佳的做法是使用pygame模組,但是anaconda沒有包含這個模組,所以不推薦使用python。
如果是matlab,可能需要使用KeyPressFcn這個功能:
Using arrow keys using KeyPressFcn
matlab中若希望以滑鼠取點,基本上是使用ginput函數