OpenCV-图片移位

cv2 的图片移位操作原理和实现。

调用 opencv 的 api 实现图片位移操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2
import numpy as np
# 读取图片
img = cv2.imread('../messi5.jpg', 1)
cv2.imshow('src', img)

img_info = img.shape
height = img_info[0]
width = img_info[1]

mat_shift = np.float32([
[1, 0, 100], [0, 1, 200]
]) # 2 * 3 的移位矩阵

# 参数:原始图片,移位矩阵,宽高
dst = cv2.warpAffine(img, mat_shift, (height, width))

cv2.imshow('dst', dst)
cv2.waitKey(0)

原理:

移位矩阵 mat_shift 是一个2 * 3的矩阵。

把移位矩阵拆成两个矩阵 A 和 B。
$$
matshift =
\begin{bmatrix}
1&0&100 \\
0&1&200
\end{bmatrix}

A =
\begin{bmatrix}
1&0 \\
0&1
\end{bmatrix}

B =
\begin{bmatrix}
100 \\
200
\end{bmatrix}
$$
输入的图像矩阵设为 C。
$$
A \times C + B =
\begin{bmatrix}
1&0\\
0&1
\end{bmatrix}
\times
\begin{bmatrix}
x\\
y
\end{bmatrix}
+
\begin{bmatrix}
100\\
200
\end{bmatrix}
=
\begin{bmatrix}
1 \times x + 0 \times y\\
0 \times x + 1 \times y
\end{bmatrix}
+
\begin{bmatrix}
100\\
200
\end{bmatrix}
=
\begin{bmatrix}
x + 100\\
y+ 200
\end{bmatrix}
$$
所以最终运算后得到的效果就是 x 向右移动 100 像素,y 向下移动 200 像素。

Python 实现图片移动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cv2
import numpy as np

img = cv2.imread('../messi5.jpg', 1)
cv2.imshow('src', img)

img_info = img.shape
height = img_info[0]
width = img_info[1]

dst = np.zeros(img.shape, np.uint8)

for i in range(0, height):
for j in range(0, width-100):
dst[i, j+100] = img[i, j]

cv2.imshow('dst', dst)
cv2.waitKey(0)

效果


文章作者: ahoj
文章链接: https://ahoj.cc/2019/07/OpenCV-图片移位/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ahoj 的小本本