影像處理專用圖像(取自網路公用影像)
下載講義內使用的手寫數字圖像檔案:下載 minst_784 數字影像檔案,資料來源:https://www.kaggle.com/datasets/avnishnish/mnist-original/versions/1?resource=download
解壓縮後的檔案為 mnist-original.mat,取得圖像矩陣 X 與標籤 y 的程式碼為:
from scipy.io import loadmat
mnist = loadmat("mnist-original.mat")
X = mnist["data"]
y = mnist["label"][0]
請注意:
這組手寫圖像資料矩陣按照 0-9 的順序依序排列,譬如最前面的 6903 行都是數字 0。
上述程式碼取得的 X 與 y 是 ndarray 的型態,與講義中的 pandas 型態不同。講義中相關的程式碼必須修訂。譬如要調出所有的數字 3 的圖像,程式碼如下:(y 所存的標籤是數字,非文字)
digit_to_show = 3
Digit = X[:, y == digit_to_show]
習題 1:將一張圖像 X 利用 SVD 的 “Rank q approximation”,能達到壓縮的目的並保持圖像的品質。比較下列幾種對於圖像矩陣 X 的重組安排,並進行 “Rank q approximation”,在同樣的壓縮比之下,觀察還原後的圖像品質哪個最好?能說出理由嗎?
X 不變
將 X 以 小圖(patch)進行切割,再將每個小圖拉成
的向量,最後重組這些向量並排成新的
矩陣。
同上,小圖大小為 /per patch。
同上,但分割成 /per patch。
其他天馬行空的想法。可行不可行?試試看便知道~
如何呈現最後的比較結果,請自行決定,譬如,將圖像並列比較。圖像可以選 Lenna, 也可以自行決定。影像不同也可能導致結果不同。
習題 2:處理大量影像前,有必要觀看影像圖,以確定能掌握將要處理的影像及其資料型態。以 70000 張手寫圖像為例,每個數字約 7000 字,需要寫一段程式碼來觀察這些手寫數字的影像與品質,且每次執行都能隨機觀看到不同的影像,如下圖左(共兩排含 0~9 的數字各 50 個)與圖右的影像是兩次執行的結果。請靜下心來仔細寫這段程式碼,可以按下圖的方式呈現,或用自己的方式都歡迎。類似像這樣的程式基本功事非常重要且必要的。
請注意:隨機從某個數字抽取一定數量的影像,可以採「取後不放回」的方式,譬如 np.random.choice(np.arange(N), replace=False, size=n) 從 0 ~ N 的整數中隨機取 n 個。
習題 3:在程式寫作上, “Rank q approximation” 可以透過現成的 PCA 或 SVD 套件實現。本題以數字圖像為例,挑選某一個數字的所有圖像進行 “Rank q approximation”,以取得同樣大小與張數的近似圖像。為觀察 q 值大小對圖像的影響,令 q 值為 1,3, 5,…,29,並分別列印出 20 張經過 “Rank q approximation” 後的近似後的圖像,如下圖(也是講義範例 3 的圖 9)第一列是原圖,第二列 q 值為 1,最後一列 q 值為 29 。請分別使用 PCA 與 SVD 套件做出相同的結果。
本題的目的為以下幾項:
假設 代表
張數字影像矩陣,其中
代表第
張數字影像。每張影像的 “Rank q approximation” 可以表達為
,其中
,
為原資料的共變異矩陣的特徵向量,可以直接使用 PCA 套件取得。換句話說,以整體影像,則為
。
將 進行 SVD 分解,得到
。若取其 “Rank q approximation”,則為
,其中
代表
的前
項。
以上兩者取得的近似圖像 方式不同,使用的套件亦不同,十分考驗對套件的使用是否得宜,最好能先仔細看過使用細則,方能正確使用。另一方面也驗證了 PCA 與 SVD 之關係,強化理論方面的理解。再則,兩個套件的執行效率也不同,尤其當矩陣愈大時,更是明顯。因此能用不同的方式處理相同問題,也是程式設計者必須具備的能力。(其實 sklearn 的 PCA 套件使用了 scipy 的 svd 套件)
再則,將 拿出若干張來畫圖,常常因使用不同套件而產生不同的效果,這往往牽涉到套件本身做了哪些處理,譬如,透過 PCA 處理後的
必須再加回平均數(pca.mean_[:, np.newaxis])方能顯示如下圖的樣子,理由是 PCA 會先將資料「置中」(減去平均數)。但不管如何,總是做過一遍,方才明白每個套件的使用方式與結果。
習題 4:每張大小 28×28 的手寫數字圖像 70000 張,不經壓縮前的儲存空間為 54.88 M Bytes。若進行 SVD 的 “Rank q approximation”,則壓縮倍數由 q 決定。寫一支程式,當調整 q 值時,可以算出壓縮的倍數,並同時顯示原圖與壓縮後還原的圖各 100 張做為比較(任選 100 張)。另外 q 的選擇可以根據
的「能量配置」來決定,或說決定 q 之後,可以計算所採用的主成分的能量佔比,本題也可以順便列印出這個佔比。