一、图像的剪切
获取剪切范围内的像素矩阵,如:
假
设
:
以
图
片
左
顶
点
为
原
点
,
向
右
为
x
轴
,
向
下
为
y
轴
i
m
g
[
0
:
250
,
200
:
450
]
获
取
点
(
200
,
0
)
为
剪
切
图
片
的
左
顶
点
250
×
250
的
像
素
矩
阵
假设:以图片左顶点为原点,向右为x轴,向下为y轴 \\ img[0:250,200:450] 获取点 (200, 0) 为剪切图片的左顶点 250×250 的像素矩阵
假设:以图片左顶点为原点,向右为x轴,向下为y轴img[0:250,200:450]获取点(200,0)为剪切图片的左顶点250×250的像素矩阵
import cv2
img = cv2.imread('image.jpg', 1)
cv2.imshow('img', img)
imgInfo = img.shape
dst = img[0:250,200:450] # 剪切
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下:
二、图像的移位
1. API 调用实现
import numpy as np
import cv2
img = cv2.imread('image.jpg', 1)
cv2.imshow('img', img)
imgInfo = img.shape
height = imgInfo[0] # 获取高
width = imgInfo[1] # 获取宽
matShift = np.float32([[1,0,50],[0,1,80]]) # 2×3矩阵
# 参数: 1 图片 2 移位矩阵matShift 3 尺寸info
dst = cv2.warpAffine(img, matShift, (width, height))
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
实现原理:
将
[
[
1
,
0
,
50
]
,
[
0
,
1
,
80
]
]
拆
分
为
2
×
2
和
2
×
1
的
矩
阵
[
[
1
,
0
]
,
[
0
,
1
]
]
2
×
2
设
为
A
[
[
50
]
,
[
80
]
]
2
×
1
设
为
B
[
[
x
]
,
[
y
]
]
2
×
1
设
为
C
A
∗
C
+
B
=
[
[
1
×
x
+
0
×
y
]
,
[
0
×
x
+
1
×
y
]
]
+
[
[
50
]
,
[
80
]
]
=
[
[
x
+
50
]
,
[
y
+
80
]
]
即
,
在
x
轴
上
向
右
移
动
50
p
x
,
在
y
轴
上
向
下
移
动
80
p
x
将[[1,0,50],[0,1,80]]拆分为 2\times2 和 2\times1 的矩阵 \\ [[1,0],[0,1]]\quad\quad 2\times2 \quad\quad 设为A \\ [[50],[80]]\quad\quad 2\times1 \quad\quad 设为B \\ [[x],[y]]\quad\quad 2\times1 \quad\quad 设为C \\ A*C+B = [[1\times x+0\times y], [0\times x+1\times y]]+[[50],[80]]=[[x+50],[y+80]] \\ 即,在x轴上向右移动50px,在y轴上向下移动80px
将[[1,0,50],[0,1,80]]拆分为2×2和2×1的矩阵[[1,0],[0,1]]2×2设为A[[50],[80]]2×1设为B[[x],[y]]2×1设为CA∗C+B=[[1×x+0×y],[0×x+1×y]]+[[50],[80]]=[[x+50],[y+80]]即,在x轴上向右移动50px,在y轴上向下移动80px
移位结果:
根据上述的原理,同样也可以实现图片的缩放 (类似于最近临域插值法):
假
设
A
为
:
[
[
0.5
,
0
]
,
[
0
,
0.5
]
]
,
设
B
为
:
0
,
设
C
为
:
[
[
x
]
,
[
y
]
]
A
∗
C
+
B
=
[
[
0.5
x
]
,
[
0.5
y
]
]
假设A为: [[0.5,0],[0,0.5]],设B为: 0 ,设C为:[[x],[y]] \\ A*C+B = [[0.5x],[0.5y]]
假设A为:[[0.5,0],[0,0.5]],设B为:0,设C为:[[x],[y]]A∗C+B=[[0.5x],[0.5y]]
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
cv2.imshow('img', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
matShift = np.float32([[0.5,0,0], [0,0.5,0]]) # 缩放比为0.5
dst = cv2.warpAffine(img, matShift, (round(width*0.5), round(height*0.5)))
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果如下:
2. 直接通过循环实现像素位置的变换
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1)
cv2.imshow('img', img)
imgInfo = img.shape
height = imgInfo[0] # 获取高
width = imgInfo[1] # 获取宽
h = 60 #在高方向上移动的像素
w = 100 # 在宽方向上移动的像素
dst = np.zeros((height, width,3), np.uint8) # 创建一个画板
for i in range(height-h):
for j in range(width-w):
dst[i+h][j+w] = img[i][j]
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
图片向下移动了60px,向右移动了100px,结果如下: