为什么从numpy数组生成的图像不正确

时间:2016-01-24 22:39:16

标签: python arrays numpy image-processing

我编写了一个python程序,它从粒子探测器获取x,y,c值(c为电荷)并将它们转换为灰度热图图像。该程序产生的一个例子如下。应该显示的是黑色背景上的几个灰白色区域簇,表示与屏幕的粒子碰撞。我知道这是因为我们与粒子探测器一起使用的PIXELMAN程序显示了它的样子,我的程序只是让你在没有探测器插入的情况下完成它。

Incorrect image

def heatMap(self):
    xlist=[]
    ylist=[]    
    clist=[]
    directory = str(self.varRun.get())
    if directory == "None selected" :
        tkMessageBox.showinfo("ERROR", "No run was selected")
    else:
        filename = askopenfilename(title = "Choose a new Image to import", initialdir=directory)
        if filename[-4:] != ".txt":
            tkMessageBox.showinfo("ERROR", "You must select a .txt image")
        else:
            with open(filename,'r') as f:
                reader=csv.reader(f,delimiter='\t')
                for x, y, c in reader:
                    xlist.append(int(x))
                    ylist.append(int(y)) 
                    clist.append(float(c))


        #np.meshgrid(xlist,ylist)

        maxC = max(clist)

        array = np.zeros((256, 256))
        for i in range (0, len(xlist)-1):
            rgbValue = (float(clist[i]) / float(maxC)) * 255
            array[ylist[i],xlist[i]] = rgbValue
        array = sp.ndimage.zoom(array, 2, order=0)
        imageFromArray = Image.fromarray(array, "1")

        imageFromArray.save(str(filename[:-4] + ".png"))
        newPhoImg = ImageTk.PhotoImage(imageFromArray)
        self.ImageViewer.configure(image=newPhoImg)
        self.ImageViewer.image = newPhoImg

请求文件并显示它的例程在上面。任何帮助发现图像不正确形成的原因是值得赞赏的。我已经检查过xlist,ylist和clist都从文本文件中获取了正确的值,我只是不知道那里出了什么问题。输入文件的示例是:

2   0   43.000000
3   0   65.000000
4   0   67.000000
5   0   33.000000
7   0   44.000000
8   0   102.000000
9   0   59.000000
10  0   31.000000
11  0   42.000000
12  0   29.000000
13  0   125.000000
14  0   115.000000
...

247 255 38.000000

显然,这一直持续到y值255

现在解决了这两个问题:

enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,这一行

    imageFromArray = Image.fromarray(array, "1")

是可疑的。您正在将浮点数组转换为1位图像(请参阅http://effbot.org/imagingbook/concepts.htm#mode)。

尝试将该行更改为

    imageFromArray = Image.fromarray(array).convert('L')

然后imageFromArray将是一个8位图像,可以保存为PNG文件。