Tkinter:change 一个像素的颜色
Tkinter:change a pixel's color
我在 TkInter 中加载图像 canvas 以允许用户通过鼠标右键单击按钮绘制一个点。保存按下鼠标按钮的像素坐标后,我使用 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 window 之前显示了 cv2 window。
编辑:
根据下面用户的评论,我想我可以得到我在 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()
感谢任何帮助
提前谢谢你。
您需要更改图像的内存副本 (self.tk_im
)。
您提到了两个问题,一个是关于更改图像,另一个是关于在 Tkinter window 之前显示的 cv2 window。
第二条比较简单,我先说。这是因为您在 调用 app.resumer()
之后调用 root.mainloop()
(显示 cv2 window)。您可以通过执行 app.resumer()
来响应某些事件来修复——比如单击您添加的新按钮——或者更简单地通过将对它的调用移动到 after root.mainloop() returns(当 Tkinter window 默认关闭时发生)。
关于在 OpenCV 中将像素更改为红色的另一个问题 window 可能与您从 Tkinter [=15] 获得的 self.x
和 self.y
图像坐标有关=] 不知何故不正确,所以我会检查这些并确保您获得正确的值并正确使用它们 - 例如,您的顺序是否正确?
更改后尝试使用 canvas.update()
。可能是代码有效,但屏幕上没有显示更改。
我在 TkInter 中加载图像 canvas 以允许用户通过鼠标右键单击按钮绘制一个点。保存按下鼠标按钮的像素坐标后,我使用 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 window 之前显示了 cv2 window。
编辑:
根据下面用户的评论,我想我可以得到我在 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()
感谢任何帮助 提前谢谢你。
您需要更改图像的内存副本 (self.tk_im
)。
您提到了两个问题,一个是关于更改图像,另一个是关于在 Tkinter window 之前显示的 cv2 window。
第二条比较简单,我先说。这是因为您在 调用 app.resumer()
之后调用 root.mainloop()
(显示 cv2 window)。您可以通过执行 app.resumer()
来响应某些事件来修复——比如单击您添加的新按钮——或者更简单地通过将对它的调用移动到 after root.mainloop() returns(当 Tkinter window 默认关闭时发生)。
关于在 OpenCV 中将像素更改为红色的另一个问题 window 可能与您从 Tkinter [=15] 获得的 self.x
和 self.y
图像坐标有关=] 不知何故不正确,所以我会检查这些并确保您获得正确的值并正确使用它们 - 例如,您的顺序是否正确?
更改后尝试使用 canvas.update()
。可能是代码有效,但屏幕上没有显示更改。