使用matplotlib和numpy将复杂的变换应用于图像

时间:2014-05-03 02:53:25

标签: python image-processing matplotlib plot

您好我正在尝试使用matplotlib将mobius变换应用于图像。这是执行此操作的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

如果您看到右侧,则尺寸会发生变化。我想知道将结果图像放在框中的方法。我的方法是硬编码结果图像大小并运行代码。然而,由于mobius变换扩大和缩小图像,有时我会得到非常小的图像,有时我会得到非常大的图像。任何人都可以解决这个问题??谢谢!

1 个答案:

答案 0 :(得分: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),它采用最小和最大索引来设置新限制。