一、API实现
1.实质构建大矩阵,将原矩阵元素写入新矩阵
2.使用API涉及矩阵的变换
3. 仿射变换函数
cv2.warpAffine(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]]])
src,输入图像。
M,变换矩阵。
Dsize,输出图像的大小(列行值),(cols,rows)
flags,插值方法的组合
borderMode,边界像素模式
borderValue,边界填充值,缺省为0。
4.通用移动矩阵M = ,像素点矩阵 p =
M = A + B = + ,
结果p’ = A * p + B =
p’T =
二、基于像素直接操作
1.实质,像素的重新写入
2.sourcePix[i,j] = goalPix[i+dy,j+dx]
三、代码实现
1.
import cv2
import numpy as np
dx = 100
dy = 200
img = cv2.imread('image01.jpg',1)
imgHeight,imgWidth,imgMode = img.shape
matShift = np.float32([[1,0,dx],
[0,1,dy]])
dst = cv2.warpAffine(img,matShift,(imgWidth+dx,imgHeight+dy))
# 图像显示,在移动后,原本区域留白
cv2.imshow('image',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.
# 基于像素的实现
import cv2
import numpy as np
dx = 100
dy = 200
img = cv2.imread('image01.jpg',1)
imgHeight,imgWidth,imgMode = img.shape
dstHeight,dstWidth = imgHeight + dy, imgWidth + dx
dstImg = np.zeros((dstHeight,dstWidth,imgMode), np.uint8)
for i in range(imgHeight):
for j in range(imgWidth):
dstImg[i+dy, j+dx] = img[i, j]
cv2.imshow('image', dstImg)
cv2.waitKey(0)
cv2.destroyAllWindows()