opencv+python 如何使用橡素坐标和numpy实现图像平移、旋转
平移 建议 图片长宽不一样
import cv2 import numpy as np # # 通过cv2.warpAffine()实现移动 # img=cv2.imread('D:\Python_OpenCV\chapter3_Pics\weiqi1.jpg') # 构造移动矩阵M,设在x轴方向移动50个像素和在y轴方向移动25个像素的距离 M = np.float32([[1, 0, 50], [0, 1, 25]]) # 图像形象 print(img.shape) # rows 对应 y,cols 对应 x 按照(y,x)确定像素位置,与常规思维不大一样 rows, cols = img.shape[0:2] print(img[rows-1,cols-1]) # 注意rows和cols需要反置,即先列后行 dst = cv2.warpAffine(img, M, (2*cols, 2*rows)) cv2.imshow('Origin_image', img) cv2.imshow('New_picture', dst) # # 通过矩阵乘法实现移动 # img_dest = np.zeros((rows*2,cols*2,3),np.uint8) # 构造移动矩阵M,设在x轴方向移动50个像素和在y轴方向移动25个像素的距离 M = np.float32([[1, 0, 50], [0, 1, 25]]) # 修改各个像素的坐标 for y in range(rows): for x in range(cols): #print( img[y,x,:]) point = np.float32([x,y,1]) x_,y_=np.dot(point,np.transpose(M)) # print(x_,y_) img_dest[np.int32(y_), np.int32(x_), 0]= img[y,x,0] img_dest[np.int32(y_), np.int32(x_), 1]= img[y,x,1] img_dest[np.int32(y_), np.int32(x_), 2]= img[y,x,2] cv2.imshow('img_dest', img_dest) cv2.waitKey(0) cv2.destroyAllWindows()
旋转
import cv2 img = cv2.imread('D:\Python_OpenCV\chapter3_Pics\weiqi1.jpg') rows, cols = img.shape[:2] # 旋转30度 M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1) dst = cv2.warpAffine(img, M, (cols,rows), borderValue=(255,255,255)) rows, cols = img.shape[0:2] img_dest = np.zeros((rows*2,cols*2,3),np.uint8) for y in range(rows): for x in range(cols): #print( img[y,x,:]) point = np.float32([x,y,1]) x_,y_=np.dot(point,np.transpose(M)) # print(x_,y_) x__ = np.int32(x_) y__ = np.int32(y_) if(y__<rows) and (x__ <cols): img_dest[np.int32(y_), np.int32(x_), 0]= img[y,x,0] img_dest[np.int32(y_), np.int32(x_), 1]= img[y,x,1] img_dest[np.int32(y_), np.int32(x_), 2]= img[y,x,2] cv2.imshow('Image', img) cv2.imshow('Rotation image 1', dst) cv2.imshow('Rotation image 2', img_dest) cv2.waitKey(0) cv2.destroyAllWindows()
总结:
1、rows 对应 y,cols 对应 x 按照(y,x)确定像素位置,与常规思维不大一样
2、按照(x,y)方式构造仿射矩阵如何使用。