--- title: 數學軟體實作 - 動畫影像 tags: 2020 Fall - 數學軟體實作 GA: G-77TT93X4N1 --- # Lecture - 動畫影像 Recall: [Matlab-04-作圖](https://hackmd.io/@teshenglin/ms_matlab_04) #### References -- Matlab commands * `plot` * `hold on`; `hold off` * `axis` ## 動畫 下列這個是函數數列 $$ f_n(x) = \sin(nx), \quad 0\le x\le 2\pi, \quad n\in N $$ 給定一個正整數 $n$, 就會是一個函數. 通常我們想知道這數列會收斂到哪個函數去. 在學習進階的如何判斷收斂之前, 也許我們想先用眼睛看看這函數數列究竟長什麼樣子. 一種做法是把他們畫出來. 以下我們畫出 $n=1,\cdots,10$ 這十個函數: ```matlab= x = linspace(0, 2*pi); figure; hold on for ii=1:10 plot(x, sin(ii*x)); end ``` 很明顯當十個函數畫一起時, 實在什麼都看不出來. 因此我們試試將剛剛的 `hold on` 指令拿掉, 一個一個畫: ```matlab= x = linspace(0, 2*pi); figure for ii=1:10 plot(x, sin(ii*x)); end ``` 會發現, 跟我們預期的有點不一樣(似乎只畫最後一張?). 如果要它馬上畫出來, 需要另外下一個`drawnow` (馬上畫) 的指令 ```matlab= x = linspace(0, 2*pi); figure for ii=1:10 plot(x, sin(ii*x)); drawnow end ``` 這樣它就會真的找我們回圈順序一張一張畫出來了 (不過還是很快, 看不太清楚). 要每張畫之間時間間隔久一點的話, 可以手動的加入 `pause` (暫停), 例如以下我們要求圖與圖之間間隔 $0.1$ 秒: ```matlab= x = linspace(0, 2*pi); figure for ii=1:10 plot(x, sin(ii*x)); drawnow; pause(0.1) end ``` #### Exercise 試試畫 $n=1,\cdots,100$ 看會發生什麼事 > 會看到所謂的 aliasing 現象! #### References * [aliasing](https://en.wikipedia.org/wiki/Aliasing) * [混疊](https://zh.m.wikipedia.org/zh-hant/混疊) * [Aliasing in Movies](https://allsignalprocessing.com/2017/04/03/aliasing-movies-levitating-helicopters/) ## 影像讀取 #### References * [張智星 - 19-1 MATLAB 影像格式](http://mirlab.org/jang/books/matlabprogramming4beginner/19-1_imageFormat.asp?title=19-1%20MATLAB%20%BCv%B9%B3%AE%E6%A6%A1) 在 `matlab` 中最基本影像是個 $n\times m$ 矩陣, 矩陣的每一個元素則是個正整數. 每個正整數會對應到一種顏色, 因此會有一個顏色對照表, 是個 $p\times 3$ 的矩陣. 如以下 `matlab` 內建小丑影像: ```matlab= load clown.mat % 載入小丑影像資料,含變數 X 和 map image(X); % 顯示影像 colormap(map) % 取用色盤矩陣 ``` 其中 `X` 是個 $200\times 320$ 矩陣, 而這矩陣的元素值在 $1$ 到 $81$ 這範圍之內, 因此有個 `map` 是個 $81\times 3$ 的顏色矩陣. --- 另一種存照片的方式則是直接存成 $n\times m\times 3$ 的矩陣, 例如我們下載以下圖片: ![matlab logo](https://upload.wikimedia.org/wikipedia/commons/2/21/Matlab_Logo.png =200x200). 接著載入並畫出: ```matlab= X = imread('Matlab_Logo.png'); % 載入影像 image(X); % 顯示影像 ``` #### Exercise 載入一張照片後, 將影像由左至右逐條顯示出來, 範例如下: {%youtube 1-ajxfhr1Hc %} --- Recall: `[X,Y,BUTTON] = ginput(N)` ```matlab= [X,Y,BUTTON] = ginput(1); ``` #### Assignment 載入一張照片後 1. 讓使用者以游標點選照片某位置, 將選取的位置附近某範圍皆以一特定顏色取代. 2. 讓使用者以鍵盤上下左右鍵控制方向, 模擬板擦將移動到的位置附近某範圍皆以一特定顏色取代