图像的几何变换—平移旋转镜像缩放剪切(原理+调用函数+像素操作)
Posted 小龙呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像的几何变换—平移旋转镜像缩放剪切(原理+调用函数+像素操作)相关的知识,希望对你有一定的参考价值。
目录
一、平移
1.调用函数(平移矩阵)
图像平移后的坐标:
[
x
′
y
′
1
]
=
[
1
0
Δ
x
0
1
Δ
y
0
0
1
]
⋅
[
x
y
1
]
\\beginbmatrix x' \\\\ y' \\\\ 1 \\endbmatrix =\\beginbmatrix 1&0&\\Delta x \\\\ 0&1&\\Delta y \\\\ 0&0&1 \\endbmatrix \\cdot \\beginbmatrix x \\\\ y \\\\ 1 \\endbmatrix
⎣
⎡x′y′1⎦
⎤=⎣
⎡100010ΔxΔy1⎦
⎤⋅⎣
⎡xy1⎦
⎤
x
′
=
x
+
Δ
x
y
′
=
y
+
Δ
y
\\begincases x' =x + \\Delta x \\\\ y' =y + \\Delta y \\endcases
x′=x+Δxy′=y+Δy
warpAffine函数用法参考这里:warpAffine函数
程序实现及运行结果:
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 读取图像
img1 = cv2.imread("flower.jpeg")
# 图像平移
h, w = img1.shape[:2]
M = np.float32([[1, 0, 100], [0, 1, 50]]) # 平移矩阵,y方向向下平移50,x方向向右平移100
dst = cv2.warpAffine(img1, M, (w, h))
# 图像显示
fig, axes = plt.subplots(1, 2, figsize=(10, 8), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("after translation")
plt.show()
2.像素操作(遍历赋值)
算法思想很简单,首先将所有像素点沿x方向向右平移100,一行一行的进行处理,将(0,100)处的彩色值赋值给(0,0)处,(0,101)处的彩色值赋值给(0,1)处,然后把第0行所有列(521列)处理完。之后再处理下一行。同理沿着y方向向下平移50也是差不多这个思想。
至于这个从520到0也是有讲究的,因为我们为了避免移动过程发生覆盖而数据丢失,所以需要倒序处理。打个比方,第0行,假如我们从0列到520列,那么100列之后的值就会被覆盖,这样我们就不能正确将原来100列之后的初始值进行移动(赋值),而我们从第520列处理就可以完美的避免这个问题。
程序实现及运行结果:
import cv2
import matplotlib.pyplot as plt
img1 = cv2.imread('flower.jpeg')
img2 = img1.copy()
# x方向向右平移100
for j in range(521):
for i in range(520,-1,-1):
if i<100:
img2[j, i] = 0
else:
img2[j, i] = img2[j, i-100]
# y方向向下平移50
for u in range(521):
for v in range(520,-1,-1):
if v<50:
img2[v, u] = 0
else:
img2[v, u] = img2[v-50, u]
# 图像显示
fig, axes = plt.subplots(1, 2, figsize=(10, 8), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(img2[:, :, ::-1])
axes[1].set_title("after translation")
plt.show()
二、旋转
1.调用函数(旋转矩阵)
极坐标:
x
=
r
⋅
c
o
s
α
y
=
r
⋅
s
i
n
α
\\begincases x =r \\cdot cos\\alpha \\\\ y =r \\cdot sin\\alpha \\endcases
x=r⋅cosαy=r⋅sinα
x
′
=
r
⋅
c
o
s
(
α
+
θ
)
=
r
⋅
c
o
s
α
⋅
c
o
s
θ
−
r
⋅
s
i
n
α
⋅
s
i
n
θ
=
x
⋅
c
o
s
θ
−
y
⋅
s
i
n
θ
y
′
=
r
⋅
s
i
n
(
α
+
θ
)
=
r
⋅
s
i
n
α
⋅
c
o
s
θ
+
r
⋅
c
o
s
α
⋅
s
i
n
θ
=
x
⋅
s
i
n
θ
+
y
⋅
c
o
s
θ
\\begincases x' =r \\cdot cos(\\alpha+\\theta)\\\\ \\hspace0.4cm =r \\cdot cos\\alpha \\cdot cos\\theta - r \\cdot sin\\alpha \\cdot sin\\theta\\\\ \\hspace0.4cm =x \\cdot cos\\theta - y \\cdot sin\\theta\\\\ \\\\ y' =r \\cdot sin(\\alpha+\\theta)\\\\ \\hspace0.4cm =r \\cdot sin\\alpha \\cdot cos\\theta + r \\cdot cos\\alpha \\cdot sin\\theta\\\\ \\hspace0.4cm =x \\cdot sin\\theta + y \\cdot cos\\theta\\\\ \\endcases
⎩
⎨
⎧x′=r⋅cos(α+θ)=r⋅cosα⋅cosθ−r⋅sinα⋅sinθ=x⋅cosθ−y⋅sinθy′=r⋅sin(α+θ)=r⋅sinα⋅cosθ+r⋅cosα⋅sinθ=x⋅sinθ+y⋅cosθ
直角坐标:
[
x
′
y
′
1
]
=
[
c
o
s
θ
−
s
i
n
θ
0
s
i
n
θ
c
o
s
θ
0
0
0
1
]
⋅
[
x
y
1
]
\\beginbmatrix x' \\\\ y' \\\\ 1 \\endbmatrix =\\beginbmatrix cos\\theta&-sin\\theta&0 \\\\ sin\\theta&cos\\theta&0 \\\\ 0&0&1 \\endbmatrix \\cdot \\beginbmatrix x \\\\ y \\\\ 1 \\endbmatrix
⎣
⎡x′y′1⎦
⎤=⎣
⎡cosθsinθ0−sinθcosθ0001⎦
计算机图形学-图形学中的基本变换(缩放平移旋转剪切镜像)