仿射变换在Python和MatLab上的不同结果

zzoitvuj  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(177)

我用MatLab做仿射变换,代码是:

Image=imread('fig2.bmp');
Image=im2double(Image);
Rot=0.001981123573629;                            %rotation parameter
XformScale=[1.022909263199710,1.029291261036412]; %resize parameter
XformTrans=[-0.405901345569081,0.456816768280493];%translation parameter
c = cos(Rot);
s = sin(Rot);
RRot = [ c, -s,  0; ...                           %rotation matrix
         s,  c,  0; ... 
         0,  0,  1  ];

RScale = eye(3);                                  %resize matrix
RScale(1,1) = XformScale(1);
RScale(2,2) = XformScale(2);

RTrans = eye(3);                                  %translation matrix
RTrans(end,1:2) = XformTrans;

%affine transform
FixAll = maketform('affine', RRot*RScale*RTrans);
NewSize = size(LensletImage(:,:,1)) .* XformScale(2:-1:1);
CorrectedImage = imtransform( Image, FixAll,'bilinear', 'YData',[1 NewSize(1)], 'XData',[1 NewSize(2)]);

我可以得到这样的照片enter image description here
然后,我尝试使用相同的参数用Python编写相同的代码,代码是:

from PIL import Image
import numpy as np
import math
import cv2

img=np.array(Image.open('fig2.bmp'))
img=np.double(img)/255.0
rows, cols,chan= img.shape
Rot=0.001981123573629                              # rotation parameter
XformScale=[1.022909263199710,1.029291261036412]   # resize parameter
XformTrans=[-0.405901345569081,0.456816768280493]  # translation parameter
#  T is the affine matrix
T=np.array([[math.cos(Rot)*XformScale[0],math.sin(Rot)*XformScale[0],     XformTrans[0]],[-math.sin(Rot)*XformScale[1],math.cos(Rot)*XformScale[1],XformTrans[1]]])

new_row = int(np.ceil(rows * XformScale[1]))        # new image size
new_col = int(np.ceil(cols * XformScale[0]))

Correct_img = cv2.warpAffine(img, T,(new_col,new_row),flags=cv2.INTER_LINEAR) # affine transform

得到的图片是enter image description here
但是,当我计算这两幅图像之间的峰值信噪比时,结果只有60.2748。(它应该是无穷大的。)我不知道它们不同的原因,因为它们都使用双线性插值法。希望你能帮助我。
我尝试了评论提供的方法,但似乎不起作用。代码是:

img=np.array(Image.open('fig2.bmp'))
img=np.double(img)/255.0
rows, cols,chan= img.shape
Rot=0.001981123573629                              # rotation parameter
XformScale=[1.022909263199710,1.029291261036412]   # resize parameter
XformTrans=[-0.405901345569081,0.456816768280493]  # translation parameter
#  T is the affine matrix
T=np.array([[math.cos(Rot)*XformScale[0],-math.sin(Rot)*XformScale[0],-    XformTrans[0]],[math.sin(Rot)*XformScale[1],math.cos(Rot)*XformScale[1],-XformTrans[1]],[0,0,1]])
Tinv=np.linalg.inv(T)                              # the inverse matrix
nn=Tinv[:2,:]

new_row = int(np.ceil(rows * XformScale[1]))        # new image size
new_col = int(np.ceil(cols * XformScale[0]))

Correct_img2 = cv2.warpAffine(img, nn,(new_col,new_row),flags=cv2.INTER_LINEAR) # affine transform

结果图片是enter image description here。谢谢大家的评论!

7rfyedvj

7rfyedvj1#

此函数在Python和MatLab中的不同之处在于:
MatLab:源图像到目标图像中(x‘,y’)的变换矩阵Map(x,y)的参数是变换矩阵的参数。
Python:源图像到目标图像中(x‘,y’)的变换矩阵Map(x,y)的参数是变换矩阵的参数。
也许this可以帮助你。
希望它能帮上忙!

wpx232ag

wpx232ag2#

我已经用Python重写了仿射变换。现在它可以得到和MatLab相同的结果。如果你想得到代码,请与我联系。
MatLab使用的方法是:1、将图像分割成若干块。2、然后进行仿射变换(图像的边界有一些变化)
感谢您的评论!

相关问题