s1091533 作業1

 

作業1說明

題目:

圖像旋轉 (Image Rotation)

撰寫一個程式將一張圖像的(a)整張圖像,(b)中心內切圓區域,旋轉一個角度(逆時針旋 轉 0 度至 359 度):利用一個滑動條(trackbar)控制旋轉角度。 


開發環境:

Windows 10 + Visual Studio Code + OpenCV 4.7.0 + Python


程式說明:

(a)旋轉整張圖像

h, w = img.shape[:2]

center = (w/2, h/2)

讀取整張圖像的長和寬,並找出圖片的中心點當作旋轉的支點。

rotation = cv2.getRotationMatrix2D(center, angle, 1.0)

rotated = cv2.warpAffine(img, rotation, (w, h))

利用cv2.getRotationMatrix2D()cv2.warpAffine()函式讓圖像逆時針旋轉,圖像的大小不變。

cv2.createTrackbar('Angle', 'Rotated Image', 0, 359, rotate_image)

創建滑桿,讓圖像旋轉的角度跟著滑桿的值不斷變化,來達到用滑桿控制旋轉角度的功能。

Demo:




(b)旋轉圖像的中心內切圓區域

height, width = img.shape[:2]

center = (int(width/2), int(height/2))

radius = min(center[0], center[1])

讀取整張圖像的長和寬,並找出圖片的中心點當作旋轉的支點。

找出原圖像的長和寬其中較短的那一項並除以2來作為內切圓的半徑。

圖像旋轉和創建滑桿的方法與上題相同。

mask = np.zeros_like(img)

cv2.circle(mask, center, radius, (255, 255, 255), -1)

mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)

rotated_masked = cv2.bitwise_and(rotated, rotated, mask=mask)

畫出內切圓,並創建遮罩,將圖像內切圓的區域套用到旋轉後的圖像上。

mask = cv2.bitwise_not(mask)

img_masked = cv2.bitwise_and(img, img, mask=mask)

result = cv2.add(rotated_masked, img_masked)

原本的mask是內切圓的部分,用了cv2.bitwise_not(mask)函式後,mask就會變成內切圓以外的部分。此部分會保留原本的圖像。

將兩者結合起來,就會變成只有圖像的內切圓區域在旋轉,其他區域保留原本的圖像。

Demo:



留言

這個網誌中的熱門文章

rzwang Homework #1

s1093350 Homework #2

s1061637 作業6