<p>好的!所以我整个周末都在努力理解,我想我有一个
让我满意的答案。谢谢大家的意见和建议!</p>
<p>我先看看这个:</p>
<p><a href="https://stackoverflow.com/questions/7501009/affine-transform-in-pil-python">affine transform in PIL python</a>?</p>
<p>虽然我看到作者可以做任意的相似性转换
不能解释为什么我的代码不能工作,也不能解释
我们需要转换的图像布局,也不提供线性
我问题的代数解。</p>
<p>但我确实从他的代码中看到,他在划分
矩阵(a,b,d和e)的比例,这让我觉得很奇怪。我回去看书了
我引用的PIL文件:</p>
<p>“im.transform(size,AFFINE,data,filter)=>;图像</p>
<p>对图像应用仿射变换,并将结果放入新图像中
以给定的大小。</p>
<p>数据是一个6元组(a、b、c、d、e、f),它包含
仿射变换矩阵。对于输出图像中的每个像素(x,y),新的
值取自输入中的位置(a x+b y+c,d x+e y+f)
图像,四舍五入到最接近的像素。</p>
<p>此函数可用于缩放、平移、旋转和剪切原始
形象。”</p>
<p>所以参数(a,b,c,d,e,f)是<em>a变换矩阵</em>,但是映射
目标图像中的(x,y)到源图像中的(a x+b y+c,d x+e y+f)
形象。但不是要应用的转换矩阵的参数,但是
相反。即:</p>
<ul>
<li>奇怪的</li>
<li>与Matlab不同</li>
<li>但现在,幸运的是,我完全理解了</li>
</ul>
<p>我附上我的代码:</p>
<pre><code>import Image
import math
from numpy import matrix
from numpy import linalg
def rot_x(angle,ptx,pty):
return math.cos(angle)*ptx + math.sin(angle)*pty
def rot_y(angle,ptx,pty):
return -math.sin(angle)*ptx + math.cos(angle)*pty
angle = math.radians(45)
im = Image.open('test.jpg')
(x,y) = im.size
xextremes = [rot_x(angle,0,0),rot_x(angle,0,y-1),rot_x(angle,x-1,0),rot_x(angle,x-1,y-1)]
yextremes = [rot_y(angle,0,0),rot_y(angle,0,y-1),rot_y(angle,x-1,0),rot_y(angle,x-1,y-1)]
mnx = min(xextremes)
mxx = max(xextremes)
mny = min(yextremes)
mxy = max(yextremes)
print mnx,mny
T = matrix([[math.cos(angle),math.sin(angle),-mnx],[-math.sin(angle),math.cos(angle),-mny],[0,0,1]])
Tinv = linalg.inv(T);
print Tinv
Tinvtuple = (Tinv[0,0],Tinv[0,1], Tinv[0,2], Tinv[1,0],Tinv[1,1],Tinv[1,2])
print Tinvtuple
im = im.transform((int(round(mxx-mnx)),int(round((mxy-mny)))),Image.AFFINE,Tinvtuple,resample=Image.BILINEAR)
im.save('outputpython2.jpg')
</code></pre>
<p>以及python的输出:</p>
<p><img src="https://i.stack.imgur.com/Hd68s.jpg" alt="enter image description here"/></p>
<p>让我在最后总结中再次说明这个问题的答案:</p>
<p><strong>PIL需要应用仿射变换的逆。</strong></p>