一、图片平移
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)