Tkinter:改变像素的颜色

时间:2015-05-05 12:30:37

标签: python opencv tkinter

我在TkInter画布中加载图像,以允许用户通过鼠标右舔按钮绘制一个点。保存按下鼠标按钮的像素坐标后,我使用OpenCV将有问题的像素更改为红色。

没有错误发生,但对图片没有影响。我的意思是,我没有预期的结果。

可能有人可以告诉我出了什么问题?

import PIL.Image
import Image
import ImageTk
from Tkinter import *    
import numpy as np
import cv2    

class ExampleApp(Frame):
   def __init__(self,master):
        Frame.__init__(self,master=None)
        self.x = self.y = 0
        self.imcv=None
        self.canvas=None   

   def dessiner(self):
       # Load the imge and allow user to scroll it if it is large.
       self.canvas=Canvas(self,cursor="cross",width=600,height=600)
       self.canvas.bind("<ButtonPress-1>",self.on_button_press)
       self.sbarv=Scrollbar(self,orient=VERTICAL)
       self.sbarh=Scrollbar(self,orient=HORIZONTAL)
       self.sbarv.config(command=self.canvas.yview)
       self.sbarh.config(command=self.canvas.xview)

       self.canvas.config(yscrollcommand=self.sbarv.set)
       self.canvas.config(xscrollcommand=self.sbarh.set)

       self.canvas.grid(row=0,column=0,sticky=N+S+E+W)
       self.sbarv.grid(row=0,column=1,stick=N+S)
       self.sbarh.grid(row=1,column=0,sticky=E+W)
       self.im = PIL.Image.open("image.jpg")
       self.widt,self.heigt=self.im.size
       self.canvas.config(scrollregion=(0,0,self.widt,self.heigt))
       self.tk_im = ImageTk.PhotoImage(self.im)
       self.canvas.create_image(0,0,anchor="nw",image=self.tk_im)   


   def on_button_press(self,event):
       self.lecanvas=event.widget
       self.x=self.lecanvas.canvasx(event.x)
       self.y=self.lecanvas.canvasy(event.y)
       self.canvas.create_oval(self.x,self.y, self.x+1,self.y+1,outline='red')
       print self.x,self.y


   def resumer(self):
       self.imcv=cv2.imread("image.jpg")
       self.imcv[self.x,self.y,0]=0
       self.imcv[self.x,self.y,1]=0
       self.imcv[self.x,self.y,2]=255
       cv2.imwrite("result.jpg",self.imcv)
       cv2.namedWindow("gl",cv2.WINDOW_NORMAL)
       cv2.imshow("gl",self.imcv)
       cv2.waitKey(0)
       cv2.destroyAllWindows()






if __name__ == "__main__":
    root=Tk()
    app = ExampleApp(root)
    app.dessiner()
    app.resumer()    
    app.pack()
    root.mainloop()

请注意,我还会在显示Tkinter窗口之前显示cv2窗口。

编辑:

根据下面用户的评论,我想我可以使用红色获取我在TkInter界面上绘制的像素的坐标。所以我想使用OpenCV将该像素重新着色为红色,但我想使用OpenCV不会生效。请注意,我必须在OpenCV中执行此操作以进一步处理图像:

def resumer(self):
       print"inside Resumer function:"
       print"Resume: ({},{})".format(self.x,self.y)
       self.imcv=cv2.imread("image.jpg")
       self.imcv[self.x,self.y,0]=0
       self.imcv[self.x,self.y,1]=0
       self.imcv[self.x,self.y,2]=255
       cv2.imwrite("result.jpg",self.imcv)
       cv2.namedWindow("gl",cv2.WINDOW_NORMAL)
       cv2.imshow("gl",self.imcv)
       cv2.waitKey(0)
       cv2.destroyAllWindows()

现在调用的顺序是:

if __name__ == "__main__":
    root=Tk()
    app = ExampleApp(root)
    app.pack()
    app.dessiner()
    root.mainloop()
    app.afficher_pixel()
    app.resumer() 

感谢任何帮助 提前谢谢。

3 个答案:

答案 0 :(得分:0)

您需要更改图像的内存副本(self.tk_im)。

答案 1 :(得分:0)

你提到了两个问题,一个是关于改变图像的,另一个是关于在Tkinter窗口之前显示的cv2窗口。

第二项很简单,所以我先解决。这是因为在调用root.mainloop()(显示cv2窗口)后调用app.resumer() 这一事实。您可以通过执行app.resumer()来响应某些事件(例如点击您添加的新按钮),或者更简单地通过在 root.mainloop()之后将调用移至来解决问题。 (默认情况下,当Tkinter窗口关闭时会发生这种情况。)

在OpenCV窗口中将像素更改为红色的另一个问题可能与您从Tkinter self.x以某种方式不正确的self.yevent图像坐标有关,所以我会检查这些并确保你得到正确的值并正确使用它们 - 例如你是否按照正确的顺序使用它们?

答案 2 :(得分:0)

更改后尝试使用canvas.update()。可能是代码有效但只是没有在屏幕上显示更改。