如何使用python将图像转换为公式

如何使用python将图像转换为公式,python,math,fft,Python,Math,Fft,这可能是一个有点。。。大的我的灵感来自于,我想知道我是否可以用python来实现它: 按照它的想法,我首先获取图像的边缘,将其作为矩阵,并评估点的位置,然后尝试使其连续,就像这样(显然不漂亮…): (如果我不这样做,请按直线绘制它们,如下所示:) 然后对x和y坐标进行fft,得到: [ 92897.00000000 +0.j -16312.65365042 -5708.43473681j 6403.02886691-11902.98323505j ... 我认

这可能是一个有点。。。大的我的灵感来自于,我想知道我是否可以用python来实现它:

按照它的想法,我首先获取图像的边缘,将其作为矩阵,并评估点的位置,然后尝试使其连续,就像这样(显然不漂亮…):

(如果我不这样做,请按直线绘制它们,如下所示:)

然后对x和y坐标进行fft,得到:

[ 92897.00000000    +0.j         -16312.65365042 -5708.43473681j
   6403.02886691-11902.98323505j ...
我认为这些数字代表了下面的C\n:

所以我用这些复数,试图构造一个公式:

equ = ''
itera = 0
for comp in compList:  # compList is the list of the complex numbers
    mod = math.sqrt(comp.real**2 + comp.imag**2)
    arg = cmath.phase(comp)
    if not comp.imag == 0:
        equ += '+' + str(mod) + '*np.sin(' + str(itera*2) + '*t+' +\
            str(arg) + ')'
    else:
        equ += str(2 * comp.real)
    itera += 1
这给了我这个:

185794.0+17282.618327763143*np.sin(2*t+-2.804972121911925)+13515.908721371954*np.sin(4*t+-1.0772633933209355)+11927.354784757847*np.sin(6*t+1.847507468889795)+...
我对它做了一个eval(),认为这就是公式,整个代码如下:

x, y = getBorder('target.png', maxRes = 256) 
x, y = sortNearest(x, y, maxDistance = 15) 

fx = np.fft.fft(x)
fy = np.fft.fft(y)

equaX = generateEqua(fx) #the codes beyond
equaY = generateEqua(fy)

t = np.linspace(0, len(x), 10000)
fsX = eval(equaX)
fsY = eval(equaY)

fig = plt.figure(figsize = (15, 15))
plt.plot(fsX, fsY, linewidth = 0.5)
plt.show()
这就是它所给予的:显然不是我想要的


这里我不是在问细节,只是想知道哪里可能是错误的,我的概念是错误的吗?缺少什么?或者我使用了一些错误的选项?

如果我没有完全错,您应该看到,如果您散点绘制图像,则某些x值有多个y值。这将违反笛卡尔坐标系的基本原则。因此,您无法为图像推导单一公式


在处理图像时,通常使用二维坐标数组,然后将函数应用于每个x-y坐标。

如果我没有完全错的话,您应该看到,如果对图像进行散点绘制,则某些x值存在多个y值。这将违反笛卡尔坐标系的基本原则。因此,您无法为图像推导单一公式


在处理图像时,通常使用二维坐标数组,然后将函数应用于每个x-y坐标。

对于普通公式来说确实不可能,从eassy看来,最终公式似乎是一个参数方程。谢谢提醒我。。。我忘记了Stack Exchange有多个子站点。我会试试的。我很有信心你会得到帮助。如果你在那里发帖,请在这里发一个链接供交叉参考。@AronC供将来参考:这种问题当然不属于MathOverflow。但是,在MathStackExchange上询问是完全合适的。好的,很抱歉造成混淆。我刚刚读了meta post,你完全正确。对于普通公式来说确实不可能,从简单的角度看,最终的公式似乎是一个参数方程。谢谢你提醒我。。。我忘记了Stack Exchange有多个子站点。我会试试的。我很有信心你会得到帮助。如果你在那里发帖,请在这里发一个链接供交叉参考。@AronC供将来参考:这种问题当然不属于MathOverflow。但是,在MathStackExchange上询问是完全合适的。好的,很抱歉造成混淆。我刚刚读了一篇文章,你说的绝对正确。看看我的答案:。“骨骼化”步骤无关紧要。您也可以使用更简单的线段拟合。看看我的答案:。“骨骼化”步骤无关紧要。也可以对线段使用更简单的管件。