智慧医学语言基础

授课人


 8.6.3图像仿射变换

 

8.6.3图像仿射变换

图像的仿射变换可以调用cv.warpAffine()函数实现,其语法格式如下:

cv2.warpAffine(source,M,(cols,rows))

其中参数,

Source:表示需要仿射变换的图像;

(cols,rows):表示仿射变化后是否缩放图像,可以省略;

M:表示仿射变换矩阵,是一个2*3的矩阵,分为三种情况,对应三种仿射变化,即平移,旋转和一般意义的仿射变换。

如果仿射变换进行位移,其矩阵形式如下:

其中tx表示横坐标位移的方向和大小;ty表示纵坐标位移的方向和大小;

如果仿射变换进行旋转(默认逆时针方向),其变换矩阵可以通过getRotationMatrix2D函数获得,其语法格式如下:

M=cv.getRotationMatrix2D((x,y),rotationAngle,scale)

返回值也是一个2*3的矩阵,其中参数,

(x,y):表示旋转点;

rotationAngle:表示旋转角度(无需转化为弧度);

Scale:表示旋转后是否缩放,默认为1表示不缩放;

可以通过仿射变换前后3个点的映射获得变换矩阵,可以通过函数实现,语法格式如下:

M=cv2.getAffineTransform(变换前三点,变换后三点)

【医学案例8-8】以某儿童医院采集的手腕骨图像为例,采用仿射变换,把手骨图像。把操作后的图像调用matplotlib中pyplot的imshow函数显示。

【医学图像仿射变换的代码实例】


import cv2 as cv,matplotlib,numpy as np
import matplotlib.pyplot as plt
matplotlib.rcParams['font.sans-serif']=['SimHei'] #用黑体显示中文
fileName="hand.jpg"
srcImg=cv.imread(fileName, cv.IMREAD_COLOR)
h,w,b=srcImg.shape
shiftM=np.float32([[1,0,500],[0,1,500]]) #向下和向右平移 500 像素
rotateM=cv.getRotationMatrix2D((h/2,w/2),60,1) #逆时针旋转 60
prePoint=np.float32([[100,100],[300,100],[150,300]]) #旋转前三点坐标
nexPoint=np.float32([[100,100],[270,70],[190,280]]) #旋转后三点坐标
pointM=cv.getAffineTransform(prePoint,nexPoint) #由前后三点映射旋转矩阵
shiftImg=cv.warpAffine(srcImg,shiftM,(w,h))
rotateImg=cv.warpAffine(srcImg,rotateM,(w,h))
pointImg=cv.warpAffine(srcImg,pointM,(w,h)) #三点映射旋转
# 展示不同的手骨图像
titles=['源图像','平移','逆时针旋转 60 ' ,'三点映射旋转']
imgs=[srcImg, shiftImg,rotateImg, pointImg]
for i in range(4):
     plt.subplot(2,2,i+1)
     plt.imshow(imgs[i], cmap='gray')
     plt.axis('off')
     plt.title(titles[i])
plt.show()

【运行效果】

图 8-8 图像仿射变换

 
关键词:仿射变换  图像  表示  

 评论 01 / 1

相关资源