[OpenCV筆記] 3.幾何轉換
1.縮放
主要使用 resize() 這個函式,呈現形式如下:
img_INTER_LINEAR = cv2.resize(img, (300,300), interpolation=cv2.INTER_LINEAR)
需指定整數型態的縮放倍數,如上式(300, 300)。而內插法(interpolation)預設為INTER_LINEAR(雙線性內插),可依需求更改內插法。不同內插法效果如下:
<source:Greatway9999>2.翻轉
主要使用 flip() 這個函式,呈現形式如下:
img_x = cv2.flip(img, 0)
img的位置代表輸入圖像,0的位置代表不同的翻轉型式(0表示繞x軸翻轉、1表示繞y軸翻轉、-1表示繞x軸y軸翻轉)。效果如下圖所示:
#翻轉
import numpy as np
import cv2
img = cv2.imread('Lenna.jpg')
img_x = cv2.flip(img, 0) #0表示繞x軸翻轉
img_y = cv2.flip(img, 1) #1表示繞y軸翻轉
img_xy = cv2.flip(img, -1) #-1表示繞x軸y軸翻轉
cv2.imshow("original", img)
cv2.imshow("img_x", img_x)
cv2.imshow("img_y", img_y)
cv2.imshow("img_xy", img_xy)
cv2.waitKey()
cv2.destroyAllWindows()
3.仿射
是指在幾何中,對一個向量空間進行一次線性轉換並接上一個平移,轉換為另一個向量空間。平移的效果如 "img_move"。旋轉的效果如"img_rotation"。仿射的效果如"img_Affine"。透射的效果如"img_Affine"。
<source:Greatway9999>#仿射
import numpy as np
import cv2
img = cv2.imread('Lenna.jpg')
r, c = img.shape[0:2] #不取channel數
#平移:沿x軸平移50單位,沿y軸平移70個單位
x = 50
y = 70
M = np.float32([[1, 0 ,x], [0, 1, y]])
img_move = cv2.warpAffine(img, M, (r, c)) #參數順序依序為輸入圖像、轉換矩陣、輸出影像大小
cv2.imshow("original", img)
cv2.imshow("img_move", img_move)
#旋轉
rotation_M = cv2.getRotationMatrix2D((r/2, c/2), 60, 1) #參數順序依序為旋轉中心、旋轉角度(正數表示逆時針旋轉)、縮放比例
img_rotation = cv2.warpAffine(img, rotation_M, (r, c))
cv2.imshow("img_rotation", img_rotation)
#圖像仿射
pos1 = np.float32([[0,0], [0, 100], [100, 0]])
pos2 = np.float32([[10,10], [0, 80], [70, 0]])
M_Affine = cv2.getAffineTransform(pos1,pos2) #取得轉換矩陣。pos1代表輸入影像的三點座標,pos2代表輸出影像的三點座標
img_Affine = cv2.warpAffine(img, M_Affine, (r, c))
cv2.imshow("img_Affine", img_Affine)
#圖像透射
pos3 = np.float32([[0,0], [0, 100], [100, 0], [100, 100]])
pos4 = np.float32([[10,10], [0, 80], [70, 0], [80, 50]])
M_Perspective = cv2.getPerspectiveTransform(pos3,pos4) #取得轉換矩陣。pos3代表輸入影像的四點座標,pos4代表輸出影像的四點座標
img_Perspective = cv2.warpPerspective(img, M_Perspective, (r, c))
cv2.imshow("img_Perspective", img_Perspective)
cv2.waitKey()
cv2.destroyAllWindows()
4.重映射
把圖像中某位置的像素放置到另一個圖片指定位置的過程,使用 remap() 函式。
- 複製影像的效果如 "img_copy"。
- 繞x軸翻轉的效果如"img_flip_x"。
- 繞y軸翻轉的效果如"img_flip_y"。
- x、y軸互換的效果如"img_xy_change"。
- 縮放的效果如"img_resize"。
#重映射
import numpy as np
import cv2
img = cv2.imread('Lenna.jpg')
r, c = img.shape[0:2] #不取channel數
mapx = np.zeros(img.shape[0:2], dtype = np.float32)
mapy = np.zeros(img.shape[0:2], dtype = np.float32)
#複製影像
for i in range(r):
for j in range(c):
mapx.itemset((i,j),j)
mapy.itemset((i,j),i)
img_copy = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR)
#cv2.imshow("original", img)
cv2.imshow("img_copy", img_copy)
#繞x軸翻轉
for i in range(r):
for j in range(c):
mapx.itemset((i,j),j)
mapy.itemset((i,j),r-1-i) #對稱關係存在 "目前列號+對稱列號=總列數-1"
img_flip_x = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR)
cv2.imshow("img_flip_x", img_flip_x)
#繞y軸翻轉
for i in range(r):
for j in range(c):
mapx.itemset((i,j),c-1-j) #對稱關係存在 "目前行號+對稱行號=總行數-1"
mapy.itemset((i,j),i)
img_flip_y = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR)
cv2.imshow("img_flip_y", img_flip_y)
#繞x軸y軸翻轉
for i in range(r):
for j in range(c):
mapx.itemset((i,j),c-1-j) #對稱關係存在 "目前行號+對稱行號=總行數-1"
mapy.itemset((i,j),r-1-i) #對稱關係存在 "目前列號+對稱列號=總列數-1"
img_flip_xy = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR)
cv2.imshow("img_flip_xy", img_flip_xy)
#x、y軸互換
for i in range(r):
for j in range(c):
mapx.itemset((i,j),i)
mapy.itemset((i,j),j)
img_xy_change = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR)
cv2.imshow("img_xy_change", img_xy_change)
#縮放
for i in range(r):
for j in range(c):
mapx.itemset((i,j),2*(j-c*0.25)+0.5)
mapy.itemset((i,j),2*(i-r*0.25)+0.5)
img_resize = cv2.remap(img, mapx, mapy, interpolation=cv2.INTER_LINEAR)
cv2.imshow("img_resize", img_resize)
cv2.waitKey()
cv2.destroyAllWindows()
---
參考資料:
0 留言