interp1d type=“linear”给出的结果并不精确

2024-10-17 06:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到interp1d可能给出了错误的结果。 结果至少与Gimp和Photoshop中的模拟处理结果不同。其中Gimp和Photoshop的结果几乎相同。 也许这与scipy代码中的一些舍入有关。在

你知道如何消除这些差异吗?我有理由怀疑图形软件的结果更接近完美。在

在以下所有情况下,我只使用1行像素并执行水平缩放。为了清晰起见,图像包含更多行

这是非常奇特的原始图像(#000000像素在#0000FF背景上均匀分隔):

未缩放图像

original image

下面是scipy缩放结果以及gimp和Photoshop的结果。我在上面提到的软件中尝试了许多不同的缩放选项,以及python插值。实际上,在这个非常激进的例子中,不同类型的缩放(立方、线性)在scipy中给出了相同的结果。在

(您可能需要在浏览器中放大图像。我不想执行额外的缩放以不影响原始结果)

gimp/scipy type=“线性”

gimp-scipy comparison

scipy linear/photoshop/scipy cubicphotoshop-scipy comparison

个人资料(我剪掉了那些毫无意义的纯蓝色长条)

profile plot 1profile plot 2

在剖面图上,问题不太明显,尤其是在gimp-scipy的情况下。在位图上,差别是非常明显的。中间的线条完全重叠,但是我们越往两边走,我们就越能看到距离的不同。如何获得更合适的“gimp-like”结果? 对我来说,问题不在于像素值,而在于暗像素之间的距离。我对线性插值很满意,不需要立方,但我把它包括在科学(和比较)的问题中。在

用于插值的我的代码

import numpy as np
from scipy.interpolate import interp1d
import pygame

def splineDecodeColors2(oldchain,newchain):
   L0,L1 = len(oldchain[0]),len(newchain[0])
   chain0 = np.array(oldchain)
   x0 = np.linspace(0, L0-1, L0)
   chain1 = np.array(newchain)


   for color in xrange(3):
     try:
        f = interp1d(x0, chain0[color], kind= 'linear')
        x  = np.linspace(0, L0-1, L1)
        chain1[color] = f(x).round()
     except ValueError, error:
        print error # possibly len(chain)==1
        chain1[color]=chain0[color]


   return chain1.T



def saveToPNG(img,name):
    name=str(name)
    img = np.array([img,img,img])
    img  = np.rot90(img,3)
    pygame.image.save(pygame.surfarray.make_surface(img),name+".png")



def main():
    a = np.array([[ 0., 0., 0.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 0.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 0.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 0.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 0.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 0.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 0.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 0.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.], [ 0., 0., 255.]]).T

    b= np.zeros([3,592])
    c = splineDecodeColors2(a,b)
    saveToPNG(c,"interlpolated")

if __name__ == '__main__':
    main()

Tags: name图像importimgnp像素scipyarray