0% encontró este documento útil (0 votos)
29 vistas11 páginas

DD Pdi

Cargado por

Luis Alcca
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
29 vistas11 páginas

DD Pdi

Cargado por

Luis Alcca
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Procesamiento Avanzado de Señales e Imágenes 1

UNIVERSIDAD PERUANA DE CIENCIAS APLICADAS


Facultad de Ingeniería

Escuela de Ingeniería Mecatrónica

Procesamiento Avanzado de Señales e Imágenes– EL228

Conteo, clasificación y localización de botellas de gaseosa

Autores
Alcca Ramírez Luis Maximiliano U20211B184

Altamirano Casas, Ernesto Alonso U201614377

Torres Ramirez, Chriss Isaac U20201C229

Docente Evaluador
Erwin Junger Dianderas Caut

Sección
El83

Noviembre de 2024
Procesamiento Avanzado de Señales e Imágenes 2

𝐴𝐴𝐴𝐴𝐴𝐴ℎ𝑜𝑜 𝑑𝑑𝑑𝑑𝑑𝑑 𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠


𝐹𝐹𝐹𝐹𝐹𝐹ℎ = 2 ∗ 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎( )
2∗𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷 𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓
Resumen— Este informe describe el desarrollo de un programa
en MATLAB diseñado para detectar y clasificar botellas de
𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 𝑑𝑑𝑑𝑑𝑑𝑑 𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠
gaseosas por tamaño, color de tapa y posición. Utilizando una 𝐹𝐹𝐹𝐹𝐹𝐹ℎ = 2 ∗ 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎( )
interfaz gráfica, el sistema captura imágenes y procesa la 2 ∗ 𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷 𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓
información mediante algoritmos que determinan las
características de las botellas, mostrando los resultados en tiempo 𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷 𝑑𝑑𝑑𝑑𝑑𝑑 𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠
𝐴𝐴. 𝑉𝑉 = 2 ∗ 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎( )
real. Se documenta cada etapa del procesamiento de imágenes, con 2 ∗ 𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷 𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓
análisis de desempeño y ejemplos ilustrativos.

I. INTRODUCCIÓN C) Distancia de trabajo


La distancia de trabajo es la separación entre el lente y el
El procesamiento de imágenes ha demostrado ser una objeto a observar, esencial para mantener el enfoque y
herramienta esencial en aplicaciones industriales y de garantizar una imagen nítida. Con una distancia focal de
investigación, especialmente en tareas de detección y 4.5 mm y un enfoque típico de 10 a 15 cm, este sistema es
clasificación de objetos. Este informe presenta el desarrollo de ideal para aplicaciones donde los objetos están
un sistema automatizado en MATLAB, que utiliza técnicas relativamente cerca, como inspecciones en entornos
avanzadas de procesamiento de imágenes para identificar y
controlados.
clasificar botellas de gaseosas en función de su tamaño, color de
tapa y ubicación en un recinto de trabajo.
D) Procesamiento de imágenes
El sistema está diseñado para operar mediante una interfaz
gráfica intuitiva, que facilita la adquisición y análisis de Captura de la imagen: Obtención de datos crudos a través
imágenes en tiempo real. La experiencia busca proporcionar un del sensor.
entorno controlado y flexible, donde la correcta disposición de
las botellas, la iluminación y las distancias predefinidas sean Preprocesamiento: Mejora de la calidad mediante ajustes
factores claves para garantizar una detección precisa. Además, de contraste, reducción de ruido y normalización de los
se describen las metodologías aplicadas en el análisis de niveles de color.
imágenes, incluyendo las etapas de preprocesamiento,
segmentación, clasificación y etiquetado, con un enfoque en la Segmentación: Separación de regiones de interés (como
claridad y eficiencia del algoritmo. objetos específicos) basándose en características como
color, brillo o forma.
II. MARCO TEORICO
Extracción de características: Cálculo de parámetros como
tamaño, posición y número de objetos.
A) Resolución Digital y espacial
Análisis: Interpretación de los datos procesados para tareas
La resolución digital describe el nivel de detalle que puede específicas como clasificación o conteo.
capturar un sensor, expresado en términos de píxeles totales
(ancho × alto). En este caso, un sensor de 108 MP E) Diseño de Interfaz visual
(12000×9000 píxeles) asegura una capacidad de captura
muy alta, permitiendo capturar detalles finos. Por otro lado, La interfaz visual en MATLAB permite la interacción del
la resolución espacial indica la capacidad del sistema para usuario con cada etapa del procesamiento de imágenes,
diferenciar entre dos puntos próximos en una imagen, proporcionando una plataforma para ajustar parámetros,
calculada como la relación entre el tamaño físico del sensor observar resultados en tiempo real y optimizar algoritmos.
y la cantidad de píxeles. En este sistema, se obtiene una
resolución espacial de 0.00069 mm/píxel, lo que implica F) Ventajas del enfoque
una gran precisión en la representación espacial de los
objetos.
-Alta precisión gracias a la combinación de resolución
B) Campo de Visión (FOV) digital y espacial.

El campo de visión, tanto horizontal, vertical como -Campo de visión amplio, adecuado para capturar detalles
diagonal, se define como el área observable a través del en un área significativa.
lente de la cámara. Los cálculos de FOV dependen de las
dimensiones del sensor y de la distancia focal del lente, -Interfaz visual interactiva que mejora la experiencia del
usuario y permite ajustes en tiempo real.
utilizando las fórmulas:
Procesamiento Avanzado de Señales e Imágenes 3

- Angulo de Visión (diagonal):

III. INDICAR LOS VALORES DE FOV Formula:


HORIZONTAL, FOV VERTICAL, ÁNGULO DE
VISIÓN, DISTANCIA DE TRABAJO, RESOLUCIÓN 𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷 𝑑𝑑𝑑𝑑𝑑𝑑 𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠
𝐴𝐴. 𝑉𝑉 = 2 ∗ 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎( )
ESPACIAL, RESOLUCIÓN DIGITAL 2 ∗ 𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷 𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓

9.5
𝐴𝐴. 𝑉𝑉 = 2 ∗ arctan � � = 92.5°
2 ∗ 4.5

- Distancia de trabajo:

Depende del enfoque del lente. Para un lente típico de


celular con enfoque automático y distancia focal de
4.5 mm

- Resolución espacial:

Formula:

• Resolución digital: 108 MP = 12000×9000 píxeles 𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷 𝑑𝑑𝑑𝑑𝑑𝑑 𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠 (𝑚𝑚𝑚𝑚)


𝐴𝐴. 𝑉𝑉 =
(aproximado). 𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶𝐶 𝑑𝑑𝑑𝑑 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝
• Tamaño del sensor: Diagonal ≈ 9.5 mm, relación de
aspecto típica 4:3.
o Ancho ≈ 8.3 mm Horizontal:
o Alto ≈ 6.2 mm
• Tamaño de píxel: 0.7 micrómetros (µm) por píxel. 8.3𝑚𝑚𝑚𝑚
𝑅𝑅. 𝐻𝐻 = = 0.00069𝑚𝑚𝑚𝑚/𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝
• Distancia focal: Varía entre 4 mm y 5 mm 12000

Vertical:
- FOV horizontal (Campo de visión horizontal): 6.2𝑚𝑚𝑚𝑚
𝑅𝑅. 𝐻𝐻 = = 0.00069𝑚𝑚𝑚𝑚/𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝
9000
Formula:

𝐴𝐴𝐴𝐴𝐴𝐴ℎ𝑜𝑜 𝑑𝑑𝑑𝑑𝑑𝑑 𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠


𝐹𝐹𝐹𝐹𝐹𝐹ℎ = 2 ∗ 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎( ) - Resolución digital:
2 ∗ 𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷 𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓

8.3 Como es una cámara de 108 MP:


𝐹𝐹𝐹𝐹𝐹𝐹ℎ = 2 ∗ arctan � � = 86.1°
2 ∗ 4.5
𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅𝑅 𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑𝑑 = 12000𝑝𝑝𝑝𝑝 ∗ 9000𝑝𝑝𝑝𝑝

108,000,000 𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝
- FOV vertical (Campo de Visión vertical):
DATOS VALORES
Formula:
FOV horizontal: 86.1°
𝐹𝐹𝐹𝐹𝐹𝐹ℎ = 2 ∗ 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎(
𝐴𝐴𝐴𝐴𝐴𝐴𝐴𝐴 𝑑𝑑𝑑𝑑𝑑𝑑 𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠𝑠
) FOV vertical: 72.1°
2 ∗ 𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷𝐷 𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓𝑓
Angulo de visión: 92.5°
6.2 Distancia de trabajo: 10 – 15 cm.
𝐹𝐹𝐹𝐹𝐹𝐹ℎ = 2 ∗ arctan � � = 72.1°
2 ∗ 4.5 Resolución espacial: 1449ppm
Resolución digital: 108,000,000
pıxeles.
Procesamiento Avanzado de Señales e Imágenes 4

IV. DIAGRAMA DE BLOQUES INDICANDO Y


DESCRIBIENDO EL PROCESAMIENTO DE CADA V. INTERFAZ VISUAL
BLOQUE E ILUSTRANDO LA IMAGEN RESULTANTE
EN CADA CASO.
Para detallar mejor el proceso de detección de color y
coordenadas de lentejas de colores, se decidió diseñar interfaces
en MATLAB que permitan visualizar cada etapa del
procesamiento de la imagen. Estas interfaces son fundamentales
para comprender y verificar el funcionamiento de cada paso del
algoritmo, así como para ajustar y optimizar los parámetros
involucrados en el proceso. A continuación, se describen las
figuras, que ilustran cada fase del procesamiento:

En la figura, se observa un plano donde uno es para el video en


tiempo real y el otro plano es para la captura de la imagen,
también se encuentra el botón de encender la cámara, también
está el botón de capturar que captura la imagen en ese instante
de tiempo, también está el botón iniciar que comenzara con el
procesamiento de la imagen capturada.

En esta parte del programa se observa el procesamiento de la


imagen capturada, detecta el número de botellas, el tamaño, y la
posición de las botellas.
Procesamiento Avanzado de Señales e Imágenes 5

VI. PRUEBAS

En esta figura se muestra la imagen en vivo y capturada

Esta figura es una imagen capturada donde se observa que el


recinto tiene un fondo negro para que las detecciones de las
botellas sean en las más adecuadas condiciones ya que al ser
transparentes con un fondo blanco puede reflejar la luz y así
distorsionar el procesamiento de imágenes que se harían a las
botellas.

En esta Figura muestra la imagen procesada donde se identifica


el numero de botellas, el color y el tamaño.

VII. CONCLUSIONES

El Pre-Procesamiento de la imagen resulta fundamental para


mejorar su calidad y claridad, lo que permite una segmentación
y análisis mucho más precisos. Mediante técnicas de ajuste de
contraste y reducción de ruido, se puede optimizar la imagen
capturada, facilitando la identificación de las características
Esta figura es una imagen donde se observa el número de objetos relevantes para el análisis. En particular, los algoritmos de
detectados y el centro de masa de cada objeto y las filas en donde segmentación de color han demostrado ser eficaces para aislar
se encuentra dicho objeto. colores específicos, permitiendo una detección precisa de las
tapas de las botellas, diferenciándolas según su color y tamaño.
Esta precisión en la 13 segmentación es clave para el éxito del
proyecto, ya que una identificación errónea puede afectar los
resultados en aplicaciones donde la exactitud es prioritaria.
Además, obtener las coordenadas precisas de las botellas tiene
múltiples aplicaciones prácticas, como la clasificación
automática y el conteo de objetos en tiempo real. Estas
aplicaciones no solo mejoran la eficiencia en entornos
industriales al reducir la intervención humana, sino que también
se vuelven valiosas en ámbitos de investigación donde se
requiere monitoreo y registro constante. La automatización de
estas tareas puede traducirse en ahorros significativos de tiempo
y recursos, haciendo más eficiente el procesamiento de
Procesamiento Avanzado de Señales e Imágenes 6

productos en cadena o la organización de materiales en % Aplicar filtro para eliminar puntos pequeños
almacenes. Finalmente, el uso de interfaces en MATLAB para umbral_area = 500; % Definir el área mínima
visualizar cada etapa del proceso es una ventaja considerable, ya de los objetos que se quieren mantener
que permite observar el avance del procesamiento en tiempo real BW = bwareaopen(BW, umbral_area); % Eliminar
y realizar ajustes si es necesario. Al ver la imagen capturada y objetos pequeños (área menor que umbral_area)
los resultados de cada fase del procesamiento en una sola
interfaz, el usuario puede identificar rápidamente cualquier % Aplica dilatación morfológica para juntar
anomalía y optimizar el sistema. Esto garantiza una mayor objetos cercanos
precisión y eficiencia en la detección y localización de los BW_dilatada = imdilate(BW, strel('disk', 20));
objetos, consolidando la utilidad de MATLAB no solo como una % Puedes cambiar el valor de 20 si es
herramienta de desarrollo, sino también como un soporte visual necesario
y didáctico en el análisis de imágenes.
% Etiqueta los objetos conectados en la imagen
REFERENCIAS dilatada
[Iobjeto, numobjeto] = bwlabel(BW_dilatada);
Oppenheim, A. (2011). Tratamiento de Señales en Tiempo Discreto.
S. Damelin and W. Miller, The Mathematics of Signal Processing. Cambridge % Calcula las propiedades de las regiones
University Press, 2011. props = regionprops(Iobjeto, 'Area',
L. Escobar, Conceptos Básicos de Procesamiento Digital de Señales. 'BoundingBox');
Alfaomega, 2008.
MathWorks, "Support Vector Machine," MATLAB, Available:
[Link] % Define un umbral de área mínimo para filtrar
[Accessed: Sep. 25, 2024]. los objetos grandes (mayores a 10000 píxeles)
[5] J. Barrios, "La matriz de confusión y sus métricas," Juan Barrios, Available:
[Link]
umbral_area = 10000;
[Accessed: Sep. 25, 2024].
MathWorks. "¿Qué es Machine Learning?" MathWorks, % Crea una imagen vacía para mostrar los
[Link] [Accessed: objetos grandes
Sep. 25, 2024].
BW_grandes = false(size(BW_dilatada));

% Filtra los objetos por área


num_grandes = 0; % Contador de objetos
grandes
for i = 1:numobjeto
if props(i).Area > umbral_area
% Marca los objetos grandes en la
nueva imagen binaria
BW_grandes = BW_grandes | (Iobjeto ==
CODIGOS: i);
num_grandes = num_grandes + 1; %
Incrementa el contador de objetos grandes
end
CODIGO DE DETECCION DE OBJETOS
end
clear all; % Muestra la imagen con solo los objetos
close all; grandes (área > 10000 píxeles)
clc; figure(3);
imshow(BW_grandes);
% Lee la imagen recortada impixelinfo;
(imagen_recortada.png) title('Objetos Blancos de Área Mayor a 10000
I = imread('imagen_recortada.png'); % Lee la Después de Juntar');
imagen recortada.
% Muestra el número de objetos grandes
% Si la imagen no está en escala de grises, la disp(['Número de objetos grandes (área > 10000
convierte a escala de grises píxeles): ', num2str(num_grandes)]);
Igray = rgb2gray(I); % Convierte la imagen
RGB a escala de grises. % Cargar el archivo .mat
load('datos_botellas.mat')
% Calcula el umbral usando el método de Otsu
level = graythresh(Igray); % Dibujar las líneas verticales en los
BW = imbinarize(Igray, level); centroides X
Procesamiento Avanzado de Señales e Imágenes 7

hold on; % Mantener la imagen para superponer text(min_x, mean([min_y, max_y]), ['Min X:
gráficos ' num2str(min_x)], 'Color', 'yellow',
for i = 1:length(centroidesX) 'FontSize', 8);
% Dibujar línea vertical en la posición de % Etiqueta en el máximo X
centroidesX(i) text(max_x, mean([min_y, max_y]), ['Max X:
plot([centroidesX(i), centroidesX(i)], [1, ' num2str(max_x)], 'Color', 'yellow',
size(I, 1)], 'r', 'LineWidth', 2); % Línea 'FontSize', 8);
roja % Etiqueta en el mínimo Y
end text(mean([min_x, max_x]), min_y, ['Min Y:
' num2str(min_y)], 'Color', 'cyan',
% Dibujar una línea horizontal en Y = 100 'FontSize', 8);
plot([1, size(I, 2)], [100, 120], 'b', % Etiqueta en el máximo Y
'LineWidth', 2); % Línea azul text(mean([min_x, max_x]), max_y, ['Max Y:
' num2str(max_y)], 'Color', 'cyan',
% Títulos y leyenda si es necesario 'FontSize', 8);
title('Imagen con Líneas Verticales y hold off; % Liberar la imagen
Horizontal');
hold off; % Liberar la imagen para otros etiquetas(i, :) = [i, min_x, max_x,
gráficos min_y, max_y];
end
%% Separar los objetos en capas individuales y
mostrar % Muestra las etiquetas como tabla en la
for i = 1:num_grandes consola
% Crear una máscara para el objeto i disp('Etiquetas de los objetos:');
BW_objeto = (Iobjeto == i); % Máscara del disp('Número | Min X | Max X | Min Y |
objeto i Max Y');
disp(etiquetas);
% Crear una figura nueva para cada objeto
figure;
imshow(BW_objeto); % Separar en dos arreglos según el eje Y
impixelinfo; Fila_1 = etiquetas(etiquetas(:, 5) > 110, :);
title(['Objeto ' num2str(i)]); % Objeto con Min Y > 110
Fila_2 = etiquetas(etiquetas(:, 5) <= 110, :);
% Obtener las coordenadas de los píxeles % Objeto con Min Y <= 110
del objeto
[filas, columnas] = find(BW_objeto); % % Muestra los arreglos separados
Encuentra las coordenadas de los píxeles del disp('Objetos con Min Y > 110 (Fila_1):');
objeto disp(Fila_1);

% Calcular las posiciones mínimas y disp('Objetos con Min Y <= 110 (Fila_2):');
máximas disp(Fila_2);
min_y = min(filas); % Mínimo en el eje Y
max_y = max(filas); % Máximo en el eje Y
min_x = min(columnas); % Mínimo en el eje % Inicializar una variable para almacenar las
X filas asignadas
max_x = max(columnas); % Máximo en el eje FilasAsignadas = strings(length(centroidesX),
X 2);

% Mostrar las posiciones mínimas y máximas for i = 1:length(centroidesX)


disp(['Objeto ' num2str(i) ':']); if any(centroidesX(i) >= Fila_1(:, 2) &
disp([' Mínimo en Y: ' num2str(min_y) ', centroidesX(i) <= Fila_1(:, 3))
Máximo en Y: ' num2str(max_y)]); FilasAsignadas(i) = "Fila 1";
disp([' Mínimo en X: ' num2str(min_x) ',
Máximo en X: ' num2str(max_x)]); elseif any(centroidesX(i) >= Fila_2(:, 2)
& centroidesX(i) <= Fila_2(:, 3))
% Agregar etiquetas a las coordenadas en FilasAsignadas(i) = "Fila 2";
la imagen
hold on; % Mantener la imagen actual para else
superponer texto FilasAsignadas(i) = "No Asignada"; %
% Etiqueta en el mínimo X Caso en que no cae en ninguna fila
Procesamiento Avanzado de Señales e Imágenes 8

end
% Recortar la imagen en el rango de X
end entre 900 y 1080, y todo el eje Y.
% Filtrar solo las filas que tienen asignación I_recortada = I(900:1080, 1:1920, :);
válida (excluir elementos vacíos "") % Recorte de la imagen.
indices_validos = FilasAsignadas ~= ""; %
Encuentra índices de elementos no vacíos % Mostrar la imagen recortada.
numerosObjetos = figure;
numerosObjetos(indices_validos); % Filtra imshow(I_recortada);
numerosObjetos title('Imagen Recortada'); % Título de
centroidesX = centroidesX(indices_validos); la figura.
% Filtra centroidesX
FilasAsignadas = % Guardar la imagen recortada como un
FilasAsignadas(indices_validos); % Filtra archivo PNG.
FilasAsignadas imwrite(I_recortada,
'imagen_recortada.png');
disp('Imagen recortada guardada como
% Asegurar que las dimensiones de las "imagen_recortada.png".');
variables sean consistentes
numerosObjetos = numerosObjetos(:); % % Convertir la imagen de RGB a HSV
Convertir a vector columna para facilitar la segmentación por colores.
centroidesX = centroidesX(:); % I_hsv = rgb2hsv(I);
Convertir a vector columna
FilasAsignadas = FilasAsignadas(:); % % Crear máscaras para detectar colores
Convertir a vector columna específicos basados en valores HSV.
maskRed = (I_hsv(:,:,1) >= 0.0 &
% Crear la tabla I_hsv(:,:,1) <= 0.05) & (I_hsv(:,:,2) > 0.5) &
datos_botellas_fila = table(numerosObjetos, (I_hsv(:,:,3) > 0.5) | ...
centroidesX, FilasAsignadas, ... (I_hsv(:,:,1) >= 0.95 &
'VariableNames', {'numerosObjetos', I_hsv(:,:,1) <= 1.0) & (I_hsv(:,:,2) > 0.5) &
'centroidesX', 'FilasAsignadas'}); (I_hsv(:,:,3) > 0.5); % Rojo
maskGreen = (I_hsv(:,:,1) >= 0.25 &
% Mostrar la tabla en la consola I_hsv(:,:,1) <= 0.4) & (I_hsv(:,:,2) > 0.5) &
disp('Tabla de datos de botellas:'); (I_hsv(:,:,3) > 0.5); % Verde
disp(datos_botellas_fila); maskBlue = (I_hsv(:,:,1) >= 0.55 &
I_hsv(:,:,1) <= 0.7) & (I_hsv(:,:,2) > 0.5) &
% Guardar la tabla como archivo .mat para (I_hsv(:,:,3) > 0.5); % Azul
referencia futura maskYellow = (I_hsv(:,:,1) >= 0.12 &
save('datos_botellas_filas.mat', I_hsv(:,:,1) <= 0.18) & (I_hsv(:,:,2) > 0.4) &
'datos_botellas_fila'); (I_hsv(:,:,3) > 0.6); % Amarillo

% Agrupar las máscaras y los nombres


CODIGO DEL PROCESAMIENTO DE IMAGEN de los colores en celdas.
colorMasks = {maskRed, maskGreen,
maskBlue, maskYellow};
%clear all; % Limpia todas las variables de la colorNames = {'Rojo', 'Verde', 'Azul',
memoria. 'Amarillo'};
%close all; % Cierra todas las ventanas de
figuras abiertas. % Mostrar la imagen recortada con las
%clc; % Limpia la consola. botellas detectadas en una nueva figura.
figure;
try imshow(I);
% Verifica si existe la imagen hold on; % Mantener la imagen abierta
"imagen_promediada1.png". para superponer gráficos.
if exist('imagen_promediada1.png', 'file') title('Detección de Botellas'); %
% Cargar la imagen en formato RGB. Título de la figura.
I = imread('imagen_promediada1.png');
disp('Imagen cargada: % Inicializar las variables para
imagen_promediada1.png.'); almacenar los datos de las botellas.
datosBotellas = [];
Procesamiento Avanzado de Señales e Imágenes 9

numerosObjetos = []; % Vector para % Guardar los datos del objeto


los números de los objetos. en la tabla con el número de botella
centroidesX = []; % Vector para incrementado.
las coordenadas X de los centroides. datosBotellas =
numero = 1; % Contador de botellas. [datosBotellas; {numero, colorNames{i}, area,
tipo, x, y}];
% Procesar cada máscara de color.
for i = 1:numel(colorMasks) % Almacenar el número del
% Aplicar operaciones morfológicas objeto y el centroide X en los vectores.
para limpiar la máscara. numerosObjetos =
mask = imopen(colorMasks{i}, [numerosObjetos, numero];
strel('disk', 5)); % Eliminar ruido. centroidesX = [centroidesX,
mask = imclose(mask, strel('disk', x];
10)); % Cerrar pequeños agujeros.
% Incrementar el número de la
% Etiquetar los objetos detectados botella.
en la máscara y calcular propiedades. numero = numero + 1;
[L, numObjects] = bwlabel(mask); end
stats = regionprops(L, end
'BoundingBox', 'Centroid', 'Area'); hold off; % Finalizar la superposición
de gráficos.
for k = 1:numObjects
% Extraer propiedades del % Mostrar los datos en una tabla
objeto. interactiva en la consola.
bbox = stats(k).BoundingBox; % colNames = {'Número', 'Color', 'Área',
Caja delimitadora. 'Tipo', 'Centroide X', 'Centroide Y'}; %
centroid = stats(k).Centroid; Encabezados de la tabla.
% Centroide. disp('Resumen de las botellas:');
area = stats(k).Area; % Área. disp(cell2table(datosBotellas,
'VariableNames', colNames));
% Coordenadas del centroide.
x = centroid(1); % Coordenada % Guardar los vectores en un archivo
X MAT.
y = centroid(2); % Coordenada save('datos_botellas.mat',
Y 'numerosObjetos', 'centroidesX');
disp('Datos de los objetos guardados
% Clasificar el objeto según en "datos_botellas.mat".');
la coordenada Y
if y <= 500 else
tipo = 'Grande'; % Mostrar un mensaje si no se
else encuentra la imagen.
tipo = 'Pequeño'; msgbox('No se ha capturado una imagen
end de botella.');
end
% Dibujar la caja delimitadora
en la imagen recortada.
rectangle('Position', bbox, catch ME
'EdgeColor', 'g', 'LineWidth', 2); % Capturar y mostrar errores en caso de
fallas durante la ejecución.
% Etiquetar el objeto con su disp('Error al procesar la imagen:');
tipo y color (si aplica). disp([Link]);
label = sprintf('%d) %s (%s)', end
numero, tipo, colorNames{i});
text(x, y, label, 'Color',
'k', 'FontSize', 10, 'FontWeight', 'bold', ...
'HorizontalAlignment',
'center'); %{
Cargar los datos desde el archivo .mat
load('datos_botellas.mat');
Procesamiento Avanzado de Señales e Imágenes 10

% Crear una tabla a partir de los datos imshow(imagenPromedio);


cargados title('Imagen Promediada');
tablaBotellas = table(numerosObjetos',
centroidesX', ...
'VariableNames', CODIGO DE CAPTURA DE IMAGEN POR CAMARA WEB
{'Número', 'Centroide_X'});

% Mostrar la tabla en la consola clear all;


disp('Tabla de datos de las botellas:'); close all;
disp(tablaBotellas); clc;

% Mostrar la tabla en una ventana interactiva % Inicializa la cámara


(opcional) cam = webcam(1); % Verifica el índice correcto
uitable('Data', tablaBotellas{:,:}, ... de la cámara
'ColumnName',
[Link], ... % Captura y guarda cinco imágenes
'Position', [100, 100, 300, 200]); for i = 1:100
%} % Captura la imagen
frame = snapshot(cam);

CODIGO DEL FILTRO PROMEDIADOR % Convierte la imagen a escala de grises


frame_gray = rgb2gray(frame);

clear all; % Ajusta el brillo y el contraste de la


close all; imagen en escala de grises
clc; % Aquí, ajusta los valores de [low_in,
high_in] y [low_out, high_out] para
% Número de imágenes a promediar brillo/contraste
numImagenes = 100; % Ajusta este valor según frame_adjusted = imadjust(frame_gray, [0.3
la cantidad de imágenes 0.7], [0 1]);

% Leer la primera imagen para inicializar la % Etiquetado binario de la imagen ajustada


suma en escala de grises
imagenPromedio = frame_labels = bwlabel(frame_adjusted, 8);
double(imread('[Link]'));
% Guarda la imagen en la carpeta actual
% Sumar cada imagen a la suma acumulada como captura{i}.png
for i = 2:numImagenes nombre_archivo = sprintf('captura%[Link]',
% Leer la siguiente imagen i);
img = double(imread(['captura' num2str(i) imwrite(frame, nombre_archivo);
'.png']));
% Sumarla a la acumulada % Muestra las imágenes en una figura
imagenPromedio = imagenPromedio + img; %figure(i);
end %subplot(3,1,1); imshow(frame);
title(['Imagen Captura ', num2str(i)]);
% Dividir por el número de imágenes para %subplot(3,1,2); imshow(frame_adjusted);
obtener el promedio title("Escala de Grises Ajustada");
imagenPromedio = imagenPromedio / numImagenes; %subplot(3,1,3); imshow(frame_labels, []);
title("Imagen Etiquetada");
% Convertir de nuevo a uint8 para guardar la
imagen promediada % Pausa de 2 segundos entre capturas
imagenPromedio = uint8(imagenPromedio); (ajusta según sea necesario)
pause(0.1);
% Guardar la imagen promediada en un archivo end
imwrite(imagenPromedio,
'imagen_promediada1.png'); % Libera la cámara cuando se termine el bucle
clear cam;
% Mostrar la imagen promediada
figure;
Procesamiento Avanzado de Señales e Imágenes 11

También podría gustarte