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)方式构造仿射矩阵如何使用。

posted @   辛河  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示