一、圖片平移
1.1 原理
就是將像素所在位置進行偏移
比如需要將圖像進行向右1個像素位置,向下偏移1個像素位置
原始矩陣如下
[[255, 124, 103, 17],
[256, 222, 123, 10],
[256, 222, 123, 10]]
向右1個像素位置,向下偏移1個像素位置
[[0, 0, 0, 0],
[0, 255, 124, 103],
[0, 256, 222, 123],
[0, 256, 222, 123]]
1.2 numpy實現
def move_(img_or_mn, move_dt, xflg = True):
"""
param img_or_mn: 圖片array 或者圖片的前兩維度
move_dt: x 或者 y移動的距離
xflg: 是否移動的是X軸方向
x 或 y 移動,
返回 對應的原圖和平移後需要賦值的區域位置
"""
if isinstance(img_or_mn, tuple):
m, n = img_or_mn
else:
m, n = img_or_mn.shape[:2]
a, b = 0, 0
sign = 1 if (move_dt > 0) else -1
if xflg:
# 排除全移出的時候報錯
move_dt = n * sign if abs(move_dt) > n else move_dt
move_dt = move_dt
a = list(range(0, n + move_dt)) if move_dt < 0 else list(range(move_dt, n))
b = list(range(-move_dt, n)) if move_dt < 0 else list(range(0, n - move_dt))
else:
move_dt = m * sign if abs(move_dt) > m else move_dt
a = list(range(0, m + move_dt)) if move_dt < 0 else list(range(move_dt, m))
b = list(range(-move_dt, m)) if move_dt < 0 else list(range(0, m - move_dt))
return a, b
def pic_mov(img, xdst=0, ydst=0):
"""
像素偏移
"""
img_shape = img.shape
m, n = img_shape[:2]
# 排除全移出的時候報錯
x_a, x_b = move_((m, n), xdst, xflg = True)
y_a, y_b = move_((m, n), ydst, xflg = False)
x_a = [0] if x_a == [] else x_a
x_b = [0] if x_b == [] else x_b
y_a = [0] if y_a == [] else y_a
y_b = [0] if y_b == [] else y_b
max_a = 0 if x_a == [0] else max(x_a) + 1
max_b = 0 if x_b == [0] else max(x_b) + 1
out_img = np.zeros(img_shape, np.uint8)
if len(img_shape) == 3:
out_img[y_a, min(x_a):max_a, 0] = img[y_b, min(x_b):max_b, 0]
out_img[y_a, min(x_a):max_a, 1] = img[y_b, min(x_b):max_b, 1]
out_img[y_a, min(x_a):max_a, 2] = img[y_b, min(x_b):max_b, 2]
else:
out_img[y_a, min(x_a):max_a] = img[y_b, min(x_b):max_b]
return out_img
img_mov = pic_mov(img, 200, 100)
img_mov1 = pic_mov(img, -200, -100)
cv2.imshow("Original", img)
cv2.imshow("pic_mov_R5_D10", img_mov)
cv2.imshow("pic_mov_L50_UP10", img_mov1)
cv2.waitKey(0)
1.3 opencv實現
m, n = img.shape[:2]
# 平移矩陣 [1, 0, 200] x軸方向移動200, [0, 1, 100] y軸方向移動100
mov_t = np.float32([[1, 0, 200], [0, 1, 100]])
img_mcv = cv2.warpAffine(img, mov_t, (n, m))
cv2.imshow("Original", img)
cv2.imshow("move withe open cv", img_mcv)
cv2.waitKey(0)
二、圖片旋轉
2.1 原理
其實就是二維矩陣的旋轉
我們從矩陣 [[1,0], [0,1]]
(可以解讀成, 兩個點(1,0)和(0,1)),將座標順時針旋轉45度,那麼我們將會可以通過下圖計算
顯然, [[1,0], [0,1]]
變成了 [[cos(o), -sin(o)], [sin(o), cos(o)]]
, 即二維座標(m, 2)(m個2維座標) ,乘以順時針旋轉矩陣[[cos(o), -sin(o)], [sin(o), cos(o)]]
就可以得到, 旋轉後的座標的位置。
2.2 opencv實現
"""
cv2.getRotationMatrix2D(
center, 旋轉中心
angle, 旋轉角度
scale, 縮放係數
)
cv2.warpAffine(
src, 圖像矩陣
M, 變換的矩陣
dsize, 輸出圖像尺寸
"""
- 獲取變換矩陣
getRotationMatrix2D
# 獲取變換矩陣
(h, w) = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 45, 1.0)
- 獲取變換圖像
warpAffine
# 獲取變換圖像
rotated = cv2.warpAffine(img, M, (w, h))
cv2.imshow("Original", img)
cv2.imshow("Rotated by 45 Degrees", rotated)
cv2.waitKey(0)