圖像旋轉後的矩陣觀察
接下來我們使用 OpenCV 來做跟上一篇一樣的事,但是 cv2 的做法有些許不同,就是這些不同,導致了疏乎。
import cv2 src = cv2.imread(r"Lena_Gray.tiff", cv2.IMREAD_GRAYSCALE) print(f"Image shape:{src.shape}") window_name = 'Image' cv2.imshow(window_name, src) cv2.waitKey(0) (center_x, center_y) = (src.shape[0]//2, src.shape[1]//2) transform_matrix = cv2.getRotationMatrix2D((center_x, center_y), 45, 1) rotated = cv2.warpAffine(src, transform_matrix, (src.shape[0], src.shape[1])) print(print(f"New shape:{rotated.shape}")) print(rotated) cv2.imshow(window_name, rotated) cv2.waitKey(0)
一開始直接以灰階讀入,所以 Image shape 就直接是 (512, 512),圖片的顯示也是 Lena 沒有出現問題,接下來才是出問題的地方。
因為 cv2 對於旋轉的方式跟其他的程式庫不同,是專門為圖像而設計的,不是只有處理陣列 。cv2 在處理平移、旋轉、縮放
、翻轉時,需要用到轉換矩陣,這個轉換矩是 2 * 3 或是 3 * 3 的陣列,我們使用 cv2.getRotationMatrix2D ,會產生 2 * 3 的轉換矩陣 。在旋轉時可以指定以哪個點做中心,旋轉幾度,要不要進行縮放。最後再轉換矩陣做為參數傳入,使用 cv2.warpAffine 生成最後的矩陣,同時要指定圖片的長寬。
旋轉之後的圖像顯示如下
我們會發現,因為我們以圖像為中心旋轉45度,並指定了原圖的長寬 512 * 512,所以就變成了這張圖。
這張圖將導致,圖片的四個角落被丟棄,並且又加上了旋轉產生的空白資料,這些空白資料就是圖上黑色的部份。本來對旋轉的效果就比較差的特徵提取,效果應該會更差。
最後,透過本次的觀察實作,得到的經驗是,使用不同的工具時應該更加了解工具的特性。另外,在實驗時,什麼做為輸入資料正不正確,輸出是什麼,都應該注重。不然就會像這次這樣,使用的工具不同,導致意外的輸出,而這個意外的輸出又沒有經過檢查,直接導入下一個步驟。就會產生一系列的問題。在每個步驟確輸出結果,是很重要的。