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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scc_hy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值