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:
留言
張貼留言