classificationRice / progRice_support.py
progRice_support.py
Raw
#! /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()