File size: 2,729 Bytes
7ae8075 e5f3595 e867b76 e5f3595 df57f64 e867b76 43334ca e867b76 e5f3595 7ae8075 e5f3595 7ae8075 e5f3595 7ae8075 e5f3595 7ae8075 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
import gradio as gr
from PIL import Image
import numpy as np
from scipy.ndimage import label, find_objects
# Función para generar la máscara
def generate_mask(image):
# Convertir la entrada en un objeto PIL.Image si no lo es
if isinstance(image, np.ndarray):
image = Image.fromarray(image)
# Convertir la imagen a RGB y array de numpy
image_rgb = image.convert("RGB")
np_image = np.array(image_rgb)
# Aplicar los límites RGB basados en los análisis anteriores
min_red, max_red = 21, 183
min_green, max_green = 0, 142
min_blue, max_blue = 0, 124
# Generar la máscara binaria
mask = (
(np_image[:, :, 0] >= min_red) & (np_image[:, :, 0] <= max_red) &
(np_image[:, :, 1] >= min_green) & (np_image[:, :, 1] <= max_green) &
(np_image[:, :, 2] >= min_blue) & (np_image[:, :, 2] <= max_blue)
).astype(np.uint8)
# Invertir la máscara para que los objetos de fondo (valor 0) se conviertan en 1 y se etiqueten
inverted_mask = 1 - mask
labeled_mask, num_features = label(inverted_mask)
# Filtrar objetos pequeños de valor 0
for i, region in enumerate(find_objects(labeled_mask)):
if region is not None:
# Calcular el área del objeto con valor 0
area = np.sum(labeled_mask[region] == i + 1)
# Si el área es menor a 3000 píxeles, establece el objeto en blanco
if area < 3000:
inverted_mask[region] = np.where(labeled_mask[region] == i + 1, 0, inverted_mask[region])
# Invertir de nuevo para restaurar los valores de la máscara original
filtered_mask = 1 - inverted_mask
# Convertir la máscara modificada a una imagen en blanco y negro
mask_image = Image.fromarray((filtered_mask * 255).astype(np.uint8))
return mask_image
# Crear la interfaz con ejemplos
examples = [["cacao_1.png"], ["cacao_2.jpg"]] # Asegúrate de que estos archivos estén en la misma carpeta que el script
iface = gr.Interface(
fn=generate_mask,
inputs=gr.Image(label="Upload Image"),
outputs=gr.Image(label="Image with Generated Mask"),
title="Fermentation Level Classification for Cocoa Beans",
examples=examples,
description="""
**Cacao Classes According to NTC1252:2021:**
- **a) Well-fermented:** Optimal fermentation process.
- **b) Partially fermented:** Incomplete fermentation process.
- **c) Non-fermented:** Lack of adequate fermentation.
**Explanation According to NTC1252:2021:** Here you can explain how the NTC1252:2021 norm applies to the classification of fermentation levels.
"""
)
# Ejecutar la aplicación
if __name__ == "__main__":
iface.launch()
|