s1091447 作業1
主題: 圖像旋轉 (Image Rotation)
作業說明 :
撰寫一個程式將一張圖像的(a)整張圖像,(b)中心內切圓區域,旋轉一個角度(逆時針旋
轉 0 度至 359度):利用一個滑動條(trackbar)控制旋轉角度。
轉 0 度至 359度):利用一個滑動條(trackbar)控制旋轉角度。
開發環境:
Windows 11+ Visual Studio 2022 + OpenCV 4.7.0
程式碼說明:
(a)整張圖像
以funcRotate()做處理
:
cv2.getTrackbarPos(),
讀取滑動條的值cv2.getRotationMatrix2D()
,計算旋轉矩陣cv2.warpAffine()
函式,進行圖片旋轉
(b)中心內切圓區域
將圖片分為兩個部分,分別為中心內切圓的區域和其他區域,所以使用mask的方式,主要
是以funcRotate_circle()做處理
:
使用np.zeros((height, width), np.uint8),創造出黑色背景,且大小和原圖一樣
使用
cv2.circle(mask, center, radius, (255, 255, 255), -1),在黑色背景畫出白色圓圈
使用
cv2.bitwise_not()
,創造出白色背景黑色圓圈的圖片
接著上述兩張圖片分別和原圖使用bitwise_and(),得到下列兩張圖,接著
funcRotate_circle()做旋轉的處理做旋轉的處理
contours, hierarchy =
cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE),
取得圓形區域的輪廓。
rect = cv2.boundingRect(contours[0]),
取得圓形區域的外接矩形,這是要用來計算旋轉中心的位置。
center = (rect[0] + rect[2] // 2, rect[1] + rect[3] // 2)
,使用上面的結果計算
旋轉中心的位置
然後和funcRotate一樣,使用
cv2.getRotationMatrix2D()和cv2.warpAffine()
對中心內切圓區域進行旋轉- 最後使用cv2.add(),將旋轉過後的中心內切圓區域和其餘部分做融合得到結果
留言
張貼留言