#! /usr/bin/env python # -*- coding: utf-8 -*- # # Support module generated by PAGE version 7.5 # in conjunction with Tcl version 8.6 # Oct 15, 2022 06:00:12 PM -04 platform: Windows NT # Oct 15, 2022 07:28:33 PM -04 platform: Windows NT # Oct 15, 2022 09:08:35 PM -04 platform: Windows NT # Oct 15, 2022 09:13:24 PM -04 platform: Windows NT # Oct 15, 2022 09:17:55 PM -04 platform: Windows NT # Oct 15, 2022 10:13:54 PM -04 platform: Windows NT # Oct 16, 2022 08:19:05 AM -04 platform: Windows NT # Oct 16, 2022 09:03:26 AM -04 platform: Windows NT # Oct 17, 2022 09:09:11 AM -04 platform: Windows NT # Oct 18, 2022 08:02:01 AM -04 platform: Windows NT # Oct 18, 2022 08:46:42 AM -04 platform: Windows NT # Oct 18, 2022 12:49:29 PM -04 platform: Windows NT # Oct 22, 2022 09:04:45 PM -04 platform: Windows NT # Oct 23, 2022 09:53:22 AM -04 platform: Windows NT # Oct 23, 2022 10:34:19 AM -04 platform: Windows NT # Oct 23, 2022 11:21:19 AM -04 platform: Windows NT # Oct 23, 2022 11:27:21 AM -04 platform: Windows NT # Oct 23, 2022 04:10:07 PM -04 platform: Windows NT # Oct 23, 2022 10:11:33 PM -04 platform: Windows NT # Oct 23, 2022 11:47:22 PM -04 platform: Windows NT # Oct 24, 2022 12:51:44 PM -04 platform: Windows NT # Oct 24, 2022 09:12:51 PM -04 platform: Windows NT import sys import tkinter as tk import tkinter.ttk as ttk from tkinter.constants import * from tkinter import filedialog from tkinter import messagebox import numpy as np import matplotlib.pyplot as plt from spectral import open_image from spectral import envi from skimage.transform import resize import skimage from toolsSeed import Semilla, SeedDataset import os import progRice def main(*args): '''Main entry point for the application.''' global root root = tk.Tk() root.protocol( 'WM_DELETE_WINDOW' , root.destroy) # Creates a toplevel widget. global _top1, _w1 global img, arroces global m, n, b global calibrada calibrada = False _top1 = root _w1 = progRice.TopPrincipal(_top1) _w1.info.set("") cambiarEstadoFrame(_w1.Labelframe2, False) cambiarEstadoFrame(_w1.Frame1, False) cambiarEstadoFrame(_w1.Labelframe4, False) cambiarEstadoFrame(_w1.Labelframe3, False) _w1.Button10.configure(state='normal') # Creates a toplevel widget. global _top2, _w2 _top2 = tk.Toplevel(root) _w2 = progRice.Toplevel2(_top2) _w2.estadoCarg.set("") cambiarEstadoFrame(_w2.Labelframe7, False) _w2.top.protocol( 'WM_DELETE_WINDOW' , _w2.top.withdraw ) _w2.top.withdraw() # Creates a toplevel widget. global _top3, _w3 _top3 = tk.Toplevel(root) _w3 = progRice.Toplevel3(_top3) _w3.estadoCarg2.set("") cambiarEstadoFrame(_w3.TFrame1, False) _w3.top.protocol( 'WM_DELETE_WINDOW' , _w3.top.withdraw ) _w3.top.withdraw() # Creates a toplevel widget. global _top4, _w4 _top4 = tk.Toplevel(root) _w4 = progRice.Toplevel4(_top4) # Creates a toplevel widget. global _top5, _w5 _top5 = tk.Toplevel(root) _w5 = progRice.Toplevel5(_top5) root.mainloop() def hacerSegmentacion(imagen): global m,n th = 0.30 imgb170 = imagen[:,:,170].reshape(m,n) imgb210 = imagen[:,:,210].reshape(m,n) imgseg = imgb170>imgb210+th return imgseg def cambiarEstadoFrame(frmx, habilitar = True ): if habilitar==False: for associated_widget in frmx.winfo_children(): try: associated_widget.configure(state='disabled') except: continue else: for associated_widget in frmx.winfo_children(): try: associated_widget.configure(state='normal') except: continue def calibrationShafer(imgOri, imgDark, imgWhite): return (imgOri-imgDark)/(imgWhite-imgDark) def calibrar(*args): global img, calibrada imgDark = open_image(_w1.dirDark.get()).load() imgWhite = open_image(_w1.dirWhite.get()).load() img = calibrationShafer(img, imgDark, imgWhite) calibrada = True _w1.Button8.configure(state='normal') _w1.Button4.configure(state='disabled') def desplegar(*args): global img _b1 = int(_w1.b1.get()) _b2 = int(_w1.b2.get()) _b3 = int(_w1.b3.get()) plt.imshow(img[:,:,(_b1, _b2, _b3)] / np.max(img)) plt.savefig("imgDisplay.png", dpi=60, bbox_inches="tight" ) logo = tk.PhotoImage(file="imgDisplay.png") _w1.lblImage.configure(image=logo) _w1.lblImage.image = logo plt.show() def findDark(*args): _w1.dirDark.set( filedialog.askopenfilename(title = "Select dark reference hdr file", filetypes = (("hdr files","*.hdr"),("hdr files","*.hdr")))) def findImage(*args): if _w1.dirImage.get()=="": di="/" else: di = _w1.dirImage.get() _w1.dirImage.set( filedialog.askopenfilename( title = "Select raw hdr file", initialdir = di, filetypes = (("hdr files","*.hdr"),("hdr files","*.hdr"))) ) _w1.Button7.configure(state='normal') def findWhite(*args): _w1.dirWhite.set( filedialog.askopenfilename( title = "Select white reference hdr file", filetypes = (("hdr files","*.hdr"),("hdr files","*.hdr")))) def segmentar(*args): global img cambiarEstadoFrame(_w1.Labelframe3, True) plt.imshow(hacerSegmentacion(img)) plt.savefig("imgDisplay.png", dpi=60, bbox_inches="tight" ) logo = tk.PhotoImage(file="imgDisplay.png") _w1.lblSegmentacion.configure(image=logo) _w1.lblSegmentacion.image = logo plt.show() def cargar(*args): global img, m, n, b dire = _w1.dirImage.get() img = open_image(dire).load() m, n, b = img.shape _w1.info.set(f"The image is loaded\nDimensions {m}x{n} pixels and the number of bands is {b}") cambiarEstadoFrame(_w1.Labelframe2) cambiarEstadoFrame(_w1.Labelframe4) _w1.b1.set(29) _w1.b2.set(19) _w1.b3.set(9) _w1.Button6.configure(state='normal') def xx2(*args): global calibrada cambiarEstadoFrame(_w1.Frame1, True) if calibrada==True: _w1.Button4.configure(state='disabled') else: _w1.Button8.configure(state='disabled') def xxx(*args): cambiarEstadoFrame(_w1.Frame1, False) def saveImageCal(*args): global img direccion = "" direccion = filedialog.asksaveasfilename(initialdir = "/",title = "Save Calibrated Image",filetypes = (("hdr files","*.hdr"),("hdr files","*.hdr"))) if direccion != "": if direccion[-4:]=='.hdr': envi.save_image(direccion, img) else: direccion = direccion + '.hdr' envi.save_image(direccion, img) def abrirTools(*args): _w1.top.iconify() _w2.top.deiconify() def guardarSegmentacion(*args): _w1.top.iconify() _w3.top.deiconify() def graficarYmostrarEspectro(*args): global arroces global arroz #indclase = arroces.Clase.index(_w2.cmbClase.get()) #indtiempo = Arroz.Tiempo.index(int(_w2.cmbTime.get())) arroz = arroces[int(_w2.cmbNumero.get())] arroz.mostrarImagenYEspectro() plt.savefig("imgDisplay.png", dpi=65, bbox_inches="tight" ) logo = tk.PhotoImage(file="imgDisplay.png") _w2.lblImagenEspectro.configure(image=logo) _w2.lblImagenEspectro.image = logo #plt.show() texto = "Features:\n" texto = texto + f"\nArea: {arroz.area} pixels" texto = texto + f"\nPerimeter: {arroz.perimetro():.1f} pixels" texto = texto + f"\nCompactness: {arroz.compactness():.2f}" texto = texto + f"\nRoundness: {arroz.roundness():.3f}" _w2.infoFeatures.set(texto) def loadImageFolder(*args): global arroces _w2.bProgreso.start() ############################################################## arroces = SeedDataset(_w2.dirFolder.get(), bandRGB=(29,19,9), ww = _w2)# ############################################################## _w2.bProgreso.stop() cambiarEstadoFrame(_w2.Labelframe7, True) _w2.TCombobox1['values'] = tuple(arroces.classes) _w2.TCombobox1['state'] = 'readonly' _w2.TCombobox2['values'] = () _w2.TCombobox2['state'] = 'readonly' def selectFolder(*args): direccionCarpeta = filedialog.askdirectory(title="Select Folder") _w2.dirFolder.set(direccionCarpeta) def openSelFolder(*args): if _w2.dirFolder.get()=="": di="/" else: di = _w2.dirFolder.get() direccionCarpeta = filedialog.askdirectory( title="Select Folder", initialdir = di ) _w3.dirFolder.set(direccionCarpeta) clasesAgregadas = os.listdir( _w3.dirFolder.get() ) if len(clasesAgregadas)>0: _w3.TCombobox4['values'] = tuple(clasesAgregadas) cambiarEstadoFrame(_w3.TFrame1, True) def saveCutSegmentation(*args): global img sbc = _w3.cmbSubClase5.get() sbc = sbc.strip() if len(sbc)==0: sbc ="None" Semilla.cutAndSegmentation(img, _w3.dirFolder.get(), _w3.cmbClase4.get(), sbc, ww = _w3 ) messagebox.showinfo(message="The images were saved") _w3.top.withdraw() _w1.top.deiconify() def seleccionaCmb4(*args): focusIncmb5() def focusIncmb5(*args): mainDir = _w3.dirFolder.get() clases = os.listdir( mainDir ) clase = _w3.cmbClase4.get() if not clase in clases: _w3.TCombobox5['values'] = tuple( [] ) else: mainDirCar = os.path.join(mainDir, clase) archivos = os.listdir(mainDirCar) subclases = [] for archivo in archivos: if archivo[-4:] == ".hdr": separadorArchivo = archivo.rsplit('_') subclases.append(separadorArchivo[-2]) _w3.TCombobox5['values'] = tuple( set(subclases) ) def cmbSelected1(*args): global arroces _w2.TCombobox2['values'] = tuple(arroces.subClasses[_w2.cmbClase.get()]) _w2.TCombobox3['values'] = tuple(arroces.extraerNumerosCT(_w2.cmbClase.get(), _w2.cmbTime.get())) def cmbSelected2(*args): global arroces _w2.TCombobox3['values'] = tuple(arroces.extraerNumerosCT(_w2.cmbClase.get(), _w2.cmbTime.get())) def clicWidget(arg): global arroz global cuadrado global linea1 global linea2 escala = 5 tam = 3 px, py = arg.x, arg.y _w4.posx.set(px//escala) _w4.posy.set(py//escala) try: _w4.Canvas1.delete(cuadrado) _w4.Canvas1.delete(linea1) _w4.Canvas1.delete(linea2) except: pass finally: linea1 = _w4.Canvas1.create_line( px-4*tam, py, px+4*tam, py, fill="blue") linea2 = _w4.Canvas1.create_line( px, py-4*tam, px, py+4*tam, fill="blue") cuadrado = _w4.Canvas1.create_polygon(px-tam, py-tam, px-tam, py+tam, px+tam, py+tam, px+tam, py-tam, px-tam, py-tam , fill = "blue") plt.figure(2) plt.close(2) plt.figure(2) arroz.mostrarEspectroxy(px//escala, py//escala) plt.ylim(0, np.max(arroz.imagen())) plt.tight_layout(pad=0) plt.savefig("imgDisplay3.png", dpi=60 ) logo3 = tk.PhotoImage(file="imgDisplay3.png") _w4.Canvas2.create_image(175,130, image=logo3) _w4.Canvas2.image = logo3 def featureExtraction(*args): print('progRice_support.featureExtraction') for arg in args: print (' another arg:', arg) sys.stdout.flush() def moverEncimaWidget(arg): escala = 5 _w4.posxy.set( f"x={arg.x//escala}, y={arg.y//escala}" ) def openWindowsClasssification(*args): print('progRice_support.openWindowsClasssification') for arg in args: print (' another arg:', arg) sys.stdout.flush() def plotSpectrumClasses(*args): print('progRice_support.plotSpectrumClasses') for arg in args: print (' another arg:', arg) sys.stdout.flush() def aumentarEscala(img, escala): mm, nn, bb = img.shape imgNueva = np.zeros( (mm*escala, nn*escala, bb) ) for i in range(mm*escala): for j in range(nn*escala): imgNueva[i,j,:]=img[i//escala,j//escala, :] return imgNueva def verSpectrum(*args): global arroz arroz = arroces[int(_w2.cmbNumero.get())] ima = arroz.RGB /np.max(arroz.RGB) #ima = resize(ima, (300,300)) ima = aumentarEscala(ima, 5) skimage.io.imsave("imgDisplay2.png", ima) logo2 = tk.PhotoImage(file="imgDisplay2.png") _w4.Canvas1.create_image(150,150, image=logo2) _w4.Canvas1.image = logo2 _w4.top.deiconify() #_w2.lblImagenEspectro.configure(image=logo2) #_w2.lblImagenEspectro.image = logo2 def findTest(*args): dirc= filedialog.askdirectory( title="Select Folder" ) _w5.dirTest.set(dirc) def findTrain(*args): dirc= filedialog.askdirectory( title="Select Folder" ) _w5.dirTrain.set(dirc) def modificarLabPorcentaje(*args): _w5.lblPorTrain.set( ((_w5.porcentajeTrain.get()*100)//5)*5 ) def empezarClasificar(*args): _w5.TCombobox6['values'] = ('CNN3D', 'DNN') print('progRice_support.empezarClasificar') for arg in args: print (' another arg:', arg) sys.stdout.flush() if __name__ == '__main__': progRice.start_up()