using MSI_src using Statistics, Plots, Images # 1. Definir función de contraste (si no la tienes ya en la sesión) function apply_triq(img_matrix) vals = filter(x -> x > 0 && isfinite(x), img_matrix) if isempty(vals) return img_matrix end q = quantile(vals, 0.98) if q == 0 q = maximum(vals) end return clamp.(img_matrix ./ q, 0.0, 1.0) end # 2. Configuración de rutas path_data = "Hoja.imzML" path_mask = "region_interes.png" output_folder = "resultados_expertos/batch_triq" mkpath(output_folder) # 3. Carga de datos data = OpenMSIData(path_data) # 4. Obtener espectro promedio SOLO de la zona de la máscara (ROI) println("Calculando espectro promedio en la ROI...") # Nota: Usamos la función de MSI_src para obtener el promedio filtrado mzs, avg_ints = MSI_src.get_average_spectrum(data, mask_path=path_mask) # 5. Identificar picos importantes (ej. > 2% del pico base) max_int = maximum(avg_ints) umbral = max_int * 0.02 # Ajusta este valor (0.01 para 1%, 0.05 para 5%) indices_picos = findall(x -> x > umbral, avg_ints) println("Se encontraron $(length(indices_picos)) iones que superan el umbral.") # 6. Bucle para generar imágenes con TrIQ for idx in indices_picos mz_val = mzs[idx] # Validar rango (ejemplo: m/z 50 a 700) if mz_val < 50.0 || mz_val > 700.0 continue end println("Procesando m/z: $(round(mz_val, digits=2))") # A. Extraer los datos crudos con la máscara aplicada raw_slice = MSI_src.get_mz_slice(data, mz_val, 0.05, mask_path=path_mask) # B. Aplicar contraste TrIQ enhanced_slice = apply_triq(raw_slice) # C. Crear el mapa de calor (Heatmap) p = heatmap(enhanced_slice, title="Ion m/z: $(round(mz_val, digits=2))", color=:viridis, aspect_ratio=:equal, yflip=true, xaxis=false, yaxis=false) # D. Guardar nombre_archivo = "ion_$(round(mz_val, digits=2))_triq.png" savefig(p, joinpath(output_folder, nombre_archivo)) end println("--- Proceso completado. Revisa la carpeta: $output_folder ---")