图像缩放
cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
参数 | 表示意义 |
---|---|
src | 源图像 |
dsize | 需要调整到的尺寸 |
dst | 目标图像 |
fx | 沿x轴的缩放比例 |
fy | 沿y轴的缩放比例 |
interpolation | 插值方式 |
插值方法 | 作用 |
---|---|
INTER_NEAREST | 最近邻插值 |
INTER_LINEAR | 双线性插值(默认设置) |
INTER_AREA | 使用像素区域关系进行重采样 |
INTER_CUBIC | 4x4像素邻域的双三次插值 |
INTER_LANCZOS4 | 8x8像素邻域的Lanczos插值 |
import cv2 as cv
import numpy as np
def cv_show(name, img):
'''
显示图像
'''
cv.imshow(name, img)
cv.waitKey()
cv.destroyAllWindows()
img = cv.imread("pictures/cat.jpg")
cv_show("img", img)
img_resize = cv.resize(img, (200, 200), interpolation=cv.INTER_LINEAR)
cv_show("img_resize", img_resize)
图像平移
cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
参数 | 表示意义 |
---|---|
src | 源图像 |
M | 变换矩阵 |
dsize | 需要调整到的尺寸 |
dst | 目标图像 |
flag | 插值方式的组合 |
borderMode | 边界像素模式 |
borderValue | 边界填充值(默认为0) |
import cv2 as cv
import numpy as np
def cv_show(name, img):
'''
显示图像
'''
cv.imshow(name, img)
cv.waitKey()
cv.destroyAllWindows()
img = cv.imread("pictures/cat.jpg")
cv_show("img", img)
(height, width, _) = img.shape
# 变换矩阵
# 1,0表示水平方向上 20表示平移20
# 0,1表示竖直方向上 50表示平移50
mat_translation = np.float32([[1, 0, 20], [0, 1, 50]])
img_warpAffine = cv.warpAffine(img, mat_translation, (width, height))
cv_show("img_warpAffine", img_warpAffine)
图像镜像
cv2.flip(src, flipCode, dst=None)
参数 | 表示意义 |
---|---|
src | 源图像 |
flipCode | 翻转模式 |
dst | 目标图像 |
翻转模式 | 效果 |
---|---|
1 | 水平镜像 |
0 | 垂直镜像 |
-1 | 水平垂直同时进行(对角镜像) |
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def cv_show(name, img):
'''
显示图像
'''
cv.imshow(name, img)
cv.waitKey()
cv.destroyAllWindows()
img = cv.imread("pictures/cat.jpg", 0)
# 水平镜像
img_flip_hori = cv.flip(img, 1)
# 垂直镜像
img_flip_verti = cv.flip(img, 0)
# 对角镜像
img_flip_diag = cv.flip(img, -1)
plt.subplot(2, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
[]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(
img_flip_hori,
'gray'), plt.title("img_flip_hori"), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(
img_flip_verti,
'gray'), plt.title("img_flip_verti"), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(
img_flip_diag,
'gray'), plt.title("img_flip_diag"), plt.xticks([]), plt.yticks([])
plt.show()
图像旋转
图像旋转也是用的:cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
只不过旋转需要使用:cv2.getRotationMatrix2D(center, angle, scale)函数来生成旋转变换矩阵
cv2.getRotationMatrix2D(center, angle, scale)
参数 | 表示意义 |
---|---|
center | 中心点的位置 |
angle | 逆时针旋转度数 |
scale | 缩放比例(1是等比例缩放,2是放大一倍,以此类推) |
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def cv_show(name, img):
'''
显示图像
'''
cv.imshow(name, img)
cv.waitKey()
cv.destroyAllWindows()
img = cv.imread("pictures/cat.jpg")
cv_show("img", img)
(height, width, _) = img.shape
center = (width // 2, height // 2)
M = cv.getRotationMatrix2D(center, 45, 1.0)
img_rotate = cv.warpAffine(img, M, (width, height))
cv_show("img_rotate", img_rotate)
图像透视变换
透视变换函数:
cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
cv2.warpPerspective()用于解决cv2.warpAffine()不能处理视场和图像不平行的问题。
参数 | 表示意义 |
---|---|
src | 源图像 |
M | 变换矩阵 |
dsize | 需要调整到的尺寸 |
dst | 目标图像 |
flag | 插值方式的组合 |
borderMode | 边界像素模式 |
borderValue | 边界填充值(默认为0) |
使用warpPerspective之前应该先得到转换矩阵,而透视变换的转换矩阵由cv2.getPerspectiveTransform(src, dst, solveMethod=None)函数得到
参数 | 表示意义 |
---|---|
src | 输入图像的四边形的顶点坐标 |
dst | 输出图像对应的四边形的顶点坐标 |
solveMethod | DecompTypes |
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def cv_show(name, img):
'''
显示图像
'''
cv.imshow(name, img)
cv.waitKey()
cv.destroyAllWindows()
img = cv.imread("pictures/words.png")
cv_show("img", img)
(height, width, _) = img.shape
# 定义对应的点
points1 = np.float32([[75, 55], [340, 55], [33, 435], [400, 433]])
points2 = np.float32([[0, 0], [360, 0], [0, 420], [360, 420]])
# 得到转换矩阵
mat_translation = cv.getPerspectiveTransform(points1, points2)
# 透视变换
img_perspctive = cv.warpPerspective(img, mat_translation, (290, 360))
cv_show("img_perspctive", img_perspctive)