使用matplotlib和numpy对图像应用复杂变换

2 投票
1 回答
1209 浏览
提问于 2025-04-18 05:12

你好,我正在尝试使用matplotlib对一张图片进行莫比乌斯变换。这是用Python写的代码。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from numpy import *


img = mpimg.imread('test.jpg') # load an image
zi = [766j, 512+766j, 256+192j]
wi = [738j, 512+496j, 256+173j]
r = ones((600,700,3),dtype=uint8)*255 # empty-white image
for i in range(img.shape[1]):
    for j in range(img.shape[0]):
        z = complex(i,j)
        qf = ((wi[0] * (-wi[1] * (zi[0]-zi[1]) * (z-zi[2]) + wi[2] * (z-zi[1]) * (zi[0]-zi[2])) - wi[1]*wi[2]*(z-zi[0]) * (zi[1]-zi[2])))
        qs = (wi[2]*(zi[0]-zi[1])*(z-zi[2])-wi[1]*(z-zi[1])*(zi[0]-zi[2])+wi[0]*(z-zi[0])*(zi[1]-zi[2]))
        w = qf/qs
        r[int(imag(w)),int(real(w)),:] = img[j,i,:]

plt.subplot(121)
plt.imshow(img,origin='lower',aspect='auto')
plt.subplot(122)
plt.imshow(r,origin='lower',aspect='auto')
plt.show()

当我运行这段代码时,得到的结果是这样的。

plot

如果你看看右边,图片的大小发生了变化。我想知道怎么才能把结果图片放进一个框里。我现在的做法是手动设置结果图片的大小,然后运行代码。但是,由于莫比乌斯变换会让图片变大或变小,有时候我得到的图片很小,有时候又很大。有没有人能解决这个问题呢?谢谢!

1 个回答

1

你可以通过以下方法来找到你变换后图像的x轴和y轴的范围:

plt.gca().set_aspect('equal')
i, j = np.where(np.all(r!=255, axis=2))
xlimits = j.min(), j.max()
ylimits = i.min(), i.max()
plt.xlim(xlimits)
plt.ylim(ylimits)

这里使用了 set_aspect() 来保持图像的原始比例。 numpy.where() 会找到图像中不是白色(255, 255, 255)的像素的行和列索引,然后取最小和最大的索引来设置新的范围。

撰写回答