DD Pdi
DD Pdi
Autores
Alcca Ramírez Luis Maximiliano U20211B184
Docente Evaluador
Erwin Junger Dianderas Caut
Sección
El83
Noviembre de 2024
Procesamiento Avanzado de Señales e Imágenes 2
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
9.5
𝐴𝐴. 𝑉𝑉 = 2 ∗ arctan � � = 92.5°
2 ∗ 4.5
- Distancia de trabajo:
- Resolución espacial:
Formula:
Vertical:
- FOV horizontal (Campo de visión horizontal): 6.2𝑚𝑚𝑚𝑚
𝑅𝑅. 𝐻𝐻 = = 0.00069𝑚𝑚𝑚𝑚/𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝𝑝
9000
Formula:
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
VI. PRUEBAS
VII. CONCLUSIONES
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));
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);
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