我附上一个压缩档案 https://drive.google.com/file/d/0B6EnJ-Vh6zs1MkVCRlNhZkJsOEk/view?usp=sharing包含说明和重现问题所需的所有文件。
(我还没有上传图片的权限...)
我有一个带有曲线的图像(zip 存档中的 test2.png)。
我尝试扭曲它,使线条变直。
我想到使用 scikit-image 变换,特别是transform.PolynomialTransform,因为变换涉及高阶失真。
因此,首先我以固定间隔测量 x 中每条线的精确位置,以定义输入兴趣点(在文件 source_test2.csv 中)。
然后,我计算沿直线定位的相应所需位置(在文件 destination_test2.csv 中)。
图对应.png 显示了它的外观。
接下来,我简单地使用 3 阶多项式调用 Transform.PolynomialTransform()。
它找到了一个解决方案,但是当我使用transform.warp()应用它时,结果很疯狂,如文件Crazy_Warped.png所示
任何人都可以告诉我我做错了什么?
我尝试了 2 阶多项式但没有运气......
我成功地对子图像进行了良好的转换(仅限前 400 列)。
在像我这样的情况下,transform.PolynomialTransform() 完全不稳定吗?
这是完整的代码:
import numpy as np
import matplotlib.pyplot as plt
import asciitable
import matplotlib.pylab as pylab
from skimage import io, transform
# read image
orig=io.imread("test2.png",as_grey=True)
# read tables with reference points and their desired transformed positions
source=asciitable.read("source_test2.csv")
destination=asciitable.read("destination_test2.csv")
# format as numpy.arrays as required by scikit-image
# (need to add 1 because I started to count positions from 0...)
source=np.column_stack((source["x"]+1,source["y"]+1))
destination=np.column_stack((destination["x"]+1,destination["y"]+1))
# Plot
plt.imshow(orig, cmap='gray', interpolation='nearest')
plt.plot(source[:,0],source[:,1],'+r')
plt.plot(destination[:,0],destination[:,1],'+b')
plt.xlim(0,orig.shape[1])
plt.ylim(0,orig.shape[0])
# Compute the transformation
t = transform.PolynomialTransform()
t.estimate(destination,source,3)
# Warping the image
img_warped = transform.warp(orig, t, order=2, mode='constant',cval=float('nan'))
# Show the result
plt.imshow(img_warped, cmap='gray', interpolation='nearest')
plt.plot(source[:,0],source[:,1],'+r')
plt.plot(destination[:,0],destination[:,1],'+b')
plt.xlim(0,img_warped.shape[1])
plt.ylim(0,img_warped.shape[0])
# Save as a file
io.imsave("warped.png",img_warped)
提前致谢!