[scikit-image] GUI Python Image Processing Scikit-image
xavi barrull
xavi_barrull at hotmail.com
Wed Oct 5 06:43:19 EDT 2016
Hi, I have a question about scikit image.
I make a GUI in python to processing image, but I will change the gaussian Filter in opencv to scikit image, I use this function:
def gaussFilter(self):
targetTemp = sk.io.imread(self.original_path)# llegir imatge targetTemp a la ruta original
targetTemp = sk.filters.gaussian(targetTemp, sigma=0, mode='reflect', cval=0, multichannel=False)
#targetTemp = cv2.GaussianBlur(targetTemp,(sigmaX, sigmaY), 0)
cv2.imwrite(self.target_path,targetTemp)
self.updateTargetImage()
But, when I press the button of gaussian filter the image to update becomes black, what is the problem? I need a solution for this!
My code show bellow:
import Tkinter as tk
import numpy as np
import tkFileDialog
import tkMessageBox
import shutil
import os
from PIL import Image, ImageTk, ImageFilter
import cv2
import colormaps
import skimage as sk
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.figure import Figure
from skimage import filters
from skimage import io
from skimage.morphology import disk
from skimage.filters.rank import median
from skimage.filters import gaussian
from skimage.morphology import watershed
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
class App(tk.Frame):
size = 500, 700
# get past scale value
past=1
# inicialitzar app
def __init__(self, master):
tk.Frame.__init__(self, master)
self.grid(row=0)
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
master.geometry("1024x768")
self.generateMenu(master)
# Generacio Menu
def generateMenu(self, master):
# crear barra menu, dins de la llibreria TKinter (tk.)
self.menuBar=tk.Menu(self)
# creacio arxiu dins de la barra de menu
self.fileMenu=tk.Menu(self.menuBar, tearoff=0)
# crear commandes obrir, guardar i tancar, l'estat de guardar esta desactivat mentre no s'obri una imatge
self.fileMenu.add_command(label="Open", command=self.open)
self.fileMenu.add_command(label="Save", command=self.save, state="disabled")
self.fileMenu.add_command(label="Close", command=self.exit)
# Afegim tot aixo la barra de menu en cascada
self.menuBar.add_cascade(label="File", menu=self.fileMenu)
# Crear menu de process
self.processMenu=tk.Menu(self.menuBar, tearoff=0)
# crear submenu de processs/filter
self.processFilterSubMenu = tk.Menu(self.processMenu, tearoff=0)
self.processFilterSubMenu.add_command(label="Gaussian Filter", command=self.gaussFilter, state="disabled")
self.processFilterSubMenu.add_command(label="Median Filter", command=self.medianFilter, state="disabled")
self.processMenu.add_cascade(label="Process/Filter", menu=self.processFilterSubMenu, underline=0)
# crear submenu segmentacio
self.segmentationSubMenu = tk.Menu(self.processMenu, tearoff=0)
self.segmentationSubMenu.add_command(label="Watershed", command=self.watershed, state="disabled")
self.segmentationSubMenu.add_command(label="Random walker", command=self.randomwalker, state="disabled")
self.processMenu.add_cascade(label="Segmentation", menu=self.segmentationSubMenu, underline=0)
# crear submenu edgeDetection
self.edgeDetectionSubMenu = tk.Menu(self.processMenu, tearoff=0)
self.edgeDetectionSubMenu.add_command(label="Sobel", command=self.sobel, state="disabled")
self.edgeDetectionSubMenu.add_command(label="Laplacian", command=self.laplacian, state="disabled")
self.edgeDetectionSubMenu.add_command(label="Canny", command=self.canny, state="disabled")
self.processMenu.add_cascade(label="Edge Detection", menu=self.edgeDetectionSubMenu, underline=0)
# crear submenu change colormap
self.colorMapSubMenu = tk.Menu(self.processMenu, tearoff=0)
self.colorMapSubMenu.add_command(label="None", command=self.none, state="disabled")
self.colorMapSubMenu.add_command(label="Plasma", command=self.plasma, state="disabled")
self.colorMapSubMenu.add_command(label="Inferno", command=self.inferno, state="disabled")
self.colorMapSubMenu.add_command(label="Viridis", command=self.viridis, state="disabled")
self.processMenu.add_cascade(label="Change Colormap", menu=self.colorMapSubMenu, underline=0)
self.menuBar.add_cascade(label="Process", menu=self.processMenu)
master.config(menu=self.menuBar)
# No colorMap
def none(self):
targetTemp = cv2.imread(self.original_path)
cv2.imwrite(self.target_path,targetTemp)# guarda imatge targetTemp i a la ruta de desti
self.updateTargetImage()
# Plasma colorMap
def plasma(self):
plt.clf()#esborra imatge targetTemp
targetTemp = cv2.imread(self.original_path) # llegir ruta original (carpeta on es troba arxiu py)
targetTemp = np.fliplr(targetTemp[:,:,0]) # gir esquerra a dreta imatge original, segons 3r valor matriu, varia tonalitat
plasma = ListedColormap(colormaps._plasma_data, name='plasma')
plt.axis('off')#desactiva eixos a la imatge
plt.register_cmap(name='plasma', cmap=plasma) # registrar colormap nou i aplicar-lo
imgplot = plt.imshow(targetTemp)#mostrar imatge allotjada a targetTemp
imgplot.set_cmap(plasma)#aplicar colormap
imgplot.figure.savefig(self.target_path)#guardar imatge com a figura a la ruta de desti
self.updateTargetImage() #actualitzar la imatge (amb aplicacio del colormap)
def viridis(self):
plt.clf() #esborra imatge targetTemp
targetTemp = cv2.imread(self.original_path)
targetTemp = np.fliplr(targetTemp[:,:,0])
viridis = ListedColormap(colormaps._viridis_data, name='viridis')
plt.axis('off')
plt.register_cmap(name='viridis', cmap=viridis)
imgplot = plt.imshow(targetTemp)
imgplot.set_cmap(viridis)
imgplot.figure.savefig(self.target_path)
# update target screen
self.updateTargetImage()
def inferno(self):
plt.clf()
targetTemp = cv2.imread(self.original_path)
targetTemp = np.fliplr(targetTemp[:,:,0])
inferno = ListedColormap(colormaps._inferno_data, name='inferno')
plt.axis('off')
plt.register_cmap(name='inferno', cmap=inferno)
imgplot = plt.imshow(targetTemp)
imgplot.set_cmap(inferno)
imgplot.figure.savefig(self.target_path)
self.updateTargetImage()
# funcio per obrir arxius
def open(self):
# obrir arxiu des del quadre de dialeg
self.original_path = tkFileDialog.askopenfilename(filetypes=[("Image Files","*.jpg;*.jpeg;*.png;*.gif")])
if self.original_path!="": # si es selecciona un arxiu, s'activen totes les comandes del menu
self.fileMenu.entryconfig("Save", state="normal")
self.processFilterSubMenu.entryconfig("Gaussian Filter", state="normal")
self.processFilterSubMenu.entryconfig("Median Filter", state="normal")
self.segmentationSubMenu.entryconfig("Watershed", state="normal")
self.segmentationSubMenu.entryconfig("Random walker", state="normal")
self.edgeDetectionSubMenu.entryconfig("Sobel", state="normal")
self.edgeDetectionSubMenu.entryconfig("Laplacian", state="normal")
self.edgeDetectionSubMenu.entryconfig("Canny", state="normal")
self.colorMapSubMenu.entryconfig("None", state="normal")
self.colorMapSubMenu.entryconfig("Plasma", state="normal")
self.colorMapSubMenu.entryconfig("Inferno", state="normal")
self.colorMapSubMenu.entryconfig("Viridis", state="normal")
saveButton = tk.Button(self, text="Save", command=self.save)
saveButton.grid(row=7, column=10)
self.actual_name = self.original_path[self.original_path.rfind("/"):self.original_path.rfind(".")]
#creacio arxiu temporal de la imatge que hem obert
self.target_path = self.original_path[0:self.original_path.rfind(".")]+"imatge."+self.original_path[self.original_path.rfind(".")+1:]
shutil.copy2(self.original_path, self.target_path) #copia l'arxiu de la ruta original
#os.popen('attrib +h ' + self.target_path)
self.originalImg = Image.open(self.original_path) #obrir imatge original
self.originalImg.thumbnail(App.size, Image.ANTIALIAS) #thumbnail-> aplica mida imatge escalada a la finestra App.size
originalImgCanvas = tk.Canvas(self, width= 500, height=380) # aplica la mida especificada a la imatge original
originalImgCanvas.grid(row=3, column=2, columnspan=6) # la posiciona dins del grid a la fila 3 i la columna 2, abasta 6 columnes
tkOriginalImg = ImageTk.PhotoImage(self.originalImg) # mostra la imatge original
self.originalImg.image = tkOriginalImg # associa la imatge original a la imatge dins la llibreria tkinter
originalImgCanvas.create_image(100,100,image=tkOriginalImg, anchor=tk.NW, tags="IMG") # crea la imatge anterior amb amplada nord-oest dins del widget de Canvas que disposa d'estructures grafiques
self.targetImg = Image.open(self.target_path)# obrir imatge a procesar
self.targetImg.thumbnail(App.size, Image.ANTIALIAS) #thumbnail-> aplica mida imatge escalada a la finestra App.size
self.targetImgCanvas = tk.Canvas(self, width= 500, height=380)
self.targetImgCanvas.grid(row=3, column=8, columnspan=6)
self.tkTargetImg = ImageTk.PhotoImage(self.targetImg)
self.targetImg.image = self.tkTargetImg
self.targetImgCanvas.create_image(100,100,image=self.tkTargetImg, anchor=tk.NW)
# source histogram
#originalCvImg = cv2.imread(self.original_path)
#plt.figure(figsize=(2,2))
#color = ('b','g','r')
#for channel,col in enumerate(color):
# histr = cv2.calcHist([originalCvImg],[channel],None,[256],[0,256])
# plt.plot(histr,color = col)
# plt.xlim([0,256])
# if( col == 'b'):
# originalB=plt.imshow(histr).figure
# elif( col == 'g'):
# originalG=plt.imshow(histr).figure
# else:
# originalR=plt.imshow(histr).figure
#self.NewCanvas = tk.Canvas(self, width= 30, height=50)
#self.canvas = FigureCanvasTkAgg(originalR, master=self.NewCanvas)
#self.NewCanvas.grid(row=4, column=0)
#self.canvas.show()
#self.canvas.get_tk_widget().grid(row=0, column=0)
# target histogram
#targetCvImg = cv2.imread(self.target_path)
#plt.figure(figsize=(2,2))
#color = ('b','g','r')
#for channel,col in enumerate(color):
# histr = cv2.calcHist([targetCvImg],[channel],None,[256],[0,256])
# plt.plot(histr,color = col)
# plt.xlim([0,256])
# if( col == 'b'):
# targetB=plt.imshow(histr).figure
# elif( col == 'g'):
# targetG=plt.imshow(histr).figure
# else:
# targetR=plt.imshow(histr).figure
#self.NewTargetCanvas = tk.Canvas(self, width= 30, height=50)
#self.canvasTarget = FigureCanvasTkAgg(targetR, master=self.NewTargetCanvas)
#self.NewTargetCanvas.grid(row=4, column=1)
#self.canvasTarget.show()
#self.canvasTarget.get_tk_widget().grid(row=0, column=0)
# to have only odd value in scale
def fix(self, xy, n): #no entenc que fa aquesta funcio!
global past
n = int(n)
if not n % 2:
if xy=="sx":
scale = self.gaussianSigmaXScale
elif xy=="sy":
scale = self.gaussianSigmaYScale
elif xy=="median":
scale = self.medianSizeScale
else:
scale = self.kernelSizeScale
scale.set(n+1 if n > self.past else n-1)
self.past = scale.get()
# funcio per guardar imatges procesades
def save(self):
if tkMessageBox.askokcancel("Save", "Do you want to save?"):
os.remove(self.original_path)# esborra arxiu original de la ruta de desti
os.popen('attrib -h -s ' + self.target_path)# obre arxiu target de
# la ruta de desti, correspon imatge a processar
os.rename(self.target_path, self.original_path) #renombra
# la imatge original i la imatge a processar
shutil.copy2(self.original_path, self.target_path) #copia l'arxiu
# de la ruta original i tambe la imatge a processar (target)
os.popen('attrib +h ' + self.target_path)
# sortir del GUI
def exit(self):
if tkMessageBox.askokcancel("Quit", "Do you want to quit?"):
try:
# esborrar arxiu temporal
os.remove(self.target_path)
finally:
self.master.destroy()
def updateTargetImage(self): # funcio per actualitzar les diferents accio a la imatge a procesar
self.targetImg = Image.open(self.target_path) # obre la imatge a procesar, en la ruta on es troba
self.targetImg.thumbnail(App.size, Image.ANTIALIAS) #thumbnail-> aplica mida imatge escalada a la finestra App.size
self.tkTargetImg = ImageTk.PhotoImage(self.targetImg)# mostra la imatge a procesar
self.targetImg.image = self.tkTargetImg # associa la imatge a procesar a la imatge dins la llibreria Tkinter (que allotja tot el referent al GUI)
self.targetImgCanvas.create_image(5,5,image=self.tkTargetImg, anchor=tk.NW, tags="IMG") # crea la
#imatge a procesar quan se li aplica algun canvi (colormap, filtres, etc)
targetCvImg = cv2.imread(self.target_path) # llegeix la imatge de la ruta de desti
plt.figure(figsize=(4,4)) # crea una figura per allotjar histograma
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([targetCvImg],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
targetR=plt.imshow(histr).figure
self.NewTargetCanvas = tk.Canvas(self, width= 30, height=50) #crea un nou
# Canvas de la mida indicada
self.canvasTarget = FigureCanvasTkAgg(targetR, master=self.NewTargetCanvas)
#crea una figura dins del Canvas on s'allotja el histograma
self.NewTargetCanvas.grid(row=4, column=1)# defineix posicio del grid dins el
# Canvas
self.canvasTarget.show() # mostra el canvas
self.canvasTarget.get_tk_widget().grid(row=0, column=0)
def gaussFilter(self):
targetTemp = sk.io.imread(self.original_path)# llegir imatge targetTemp a la ruta original
targetTemp = sk.filters.gaussian(targetTemp, sigma=0, mode='reflect', cval=0, multichannel=False)
#targetTemp = cv2.GaussianBlur(targetTemp,(sigmaX, sigmaY), 0)#aplicar filtre
cv2.imwrite(self.target_path,targetTemp)
# actualitzar imatge Target
self.updateTargetImage()
My code is so long (There are another functions or filters (Sobel, Canny, etc...) I paste the finally:
def on_closing(app, root):
if tkMessageBox.askokcancel("Quit", "Do you want to quit?"):
try:
os.remove(app.target_path)
except:
print("error")
finally:
root.destroy()
# inicialitzar llibreria Tkinter per creacio widget
root=tk.Tk()
app = App(root)
# renderitzar GUI, to accept events
root.protocol("WM_DELETE_WINDOW", lambda: on_closing(app, root))
app.mainloop()
I attached image about my problema
I need help, it's so urgent!
Thanks in advance.
Xavi.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scikit-image/attachments/20161005/f2efec12/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Captura de pantalla 2016-10-05 a les 12.42.14.png
Type: image/png
Size: 697790 bytes
Desc: Captura de pantalla 2016-10-05 a les 12.42.14.png
URL: <http://mail.python.org/pipermail/scikit-image/attachments/20161005/f2efec12/attachment-0001.png>
More information about the scikit-image
mailing list