我用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。谢谢大家的评论!
2条答案
按热度按时间7rfyedvj1#
此函数在Python和MatLab中的不同之处在于:
MatLab:源图像到目标图像中(x‘,y’)的变换矩阵Map(x,y)的参数是变换矩阵的参数。
Python:源图像到目标图像中(x‘,y’)的变换矩阵Map(x,y)的参数是逆变换矩阵的参数。
也许this可以帮助你。
希望它能帮上忙!
wpx232ag2#
我已经用Python重写了仿射变换。现在它可以得到和MatLab相同的结果。如果你想得到代码,请与我联系。
MatLab使用的方法是:1、将图像分割成若干块。2、然后进行仿射变换(图像的边界有一些变化)
感谢您的评论!