s1091521 作業 1
開發環境:
Windows 11 + Python 3.8.8 in VS code + OpenCV-Python 4.6.0
使用套件:
OpenCV, pyqt5, numpy
程式功能:
讀取圖片yzu.bmp並顯示在視窗,視窗當中有拉桿可以將圖片旋轉,兩種模式,第一種是將整張圖片選轉,第二種則是圖片中心的內切圓旋轉。內切圓的直徑為圖片長寬最小值,旋轉時,非內切圓的部分保持不變。
流程:
先用numpy的zeros函數做出與圖片大小相同的矩陣,接著使用circle函數在圖片正中心畫出全白(皆為1)的內切圓做成mask,用bitwise_and函數將原圖透過mask擷取出內切圓與非內切圓的部分。
製作思路:
做出兩個mask,大小與原圖相同,一個保留形狀是內切圓,以下稱mask A,另一個則是非內切圓的部分,以下稱mask B。mask A使用numpy的zeros函數製作出同圖片大小的矩陣,並用OpenCV的circle函數將欲保留的內切圓位置填入1;而mask B則相反,先用ones函數,再用circle函數將內切圓部分填入0。
將原圖與mask A 和 mask B透過OpenCV 的bitwise_and函數分別取出內切圓與非內切圓的圖,藉此達到分離圖片區塊。接著依照模式,旋轉兩種圖片或是只旋轉內切圓,配合視窗的拉桿進行旋轉,以達成要求。
兩個重要的函數:
OpenCV bitwise_and:
對每個像素值進行二進制的AND運算,mask和圖片一樣大小,由0或1組成。
設置mask時,將想保留的位置設為1,去除位置設為0,即可把圖片欲輸出的
部分保留。
OpenCV circle:
給予圖片,圓心座標,半徑,顏色,線條厚度,就能夠畫出圓形。
片段程式碼:
p1.讀取圖片並儲存圖片資訊
p2.內切圓半徑 = min(高,寬)/2
p3.製作出篩選內切圓的mask以及非內切圓部分的mask
p4.將已擷取出來的內切圓與非內切圓的圖片,拼湊成同一張圖並輸出到視窗。
p5.做出圖片的旋轉矩陣,先旋轉內切圓,
若是旋轉模式為整張圖片,則再旋轉內切圓的圖片,組合後即是整張旋轉;
若是只選轉內切圓,則與原肥內切園的圖組合即可。
留言
張貼留言