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 Bmask A使用numpyzeros函數製作出同圖片大小的矩陣,並用OpenCVcircle函數將欲保留的內切圓位置填入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.做出圖片的旋轉矩陣,先旋轉內切圓,
    若是旋轉模式為整張圖片,則再旋轉內切圓的圖片,組合後即是整張旋轉;
    若是只選轉內切圓,則與原肥內切園的圖組合即可。


影片連結:https://youtu.be/P-z4RQWQd9Y




留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1081444 Homework #7