Datawhale_計算機視覺基礎_圖像處理(3)——圖片平移與旋轉

一、圖片平移

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)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章