Autor: javierluiso

Segmentación en imágenes basada en la dinámica del movimiento de regiones.

Implementación de la técnica propuesta en el trabajo de R. Lublinerman, M. Sznaier y O. Camps “Dynamics based robust motion segmentation

En este ensayo se prueba la solución propuesta simulando la detección de N regiones de interés de un supuesto frame de un sensor de imágenes. Las N regiones son representadas mediante su posición inicial (x0, y0) y una velocidad en el plano del frame que se supone constante (vx, vy). Se simula de detección y M puntos característicos sobre cada objeto, los cuales se simulará el seguimiento sobre el plano del frame durante una ventana de tiempo Tv determinada. Al final de la etapa de simulación se generan NxM secuencias de F puntos cada una, que representan la trayectoria de todos los puntos característicos realizada durante el tiempo Tv. F representa la cantidad de frames obtenidos en ese tiempo.

captura01
N=10 regiones simuladas. Cada región está representada por la circunferencia verde y en su posición inicial (x0, y0). Se superpone el vector velocidad de cada región.

Como cada región representa un objeto rígido, las posiciones relativas entre si de los M puntos característicos se conservan. Son invariantes ante el desplazamiento de la región sobre el plano del frame debido a la velocidad asignada.

captura02
M=10 puntos característicos elegidos aleatoriamente se asocian con cada objeto. 

La matriz de rango dinámica resultante de aplicar el método propuesto para esta simulación es:

captura03
Matriz de rango dinámica. Pueden verse claramente 3 clases, a partir de analizar los puntos característicos que tiene dinámicas de movimiento similares.

El algoritmo segmenta los NxM puntos en 3 clases, claramente distingibles en la representación gráfica de la matriz. Las zonas oscuras correponden a valores menores al umbral fijado, del rango de la matriz de Hankel, indicando que los puntos (pi, pj) correspondiente a la fila  y columna corresondiente, tiene una dinámica similar.

En esta simulación, puntos con dinámicas similares se correponden con puntos de un mismo objeto o de objetos que se mueven con velocidades similares.

captura04
Las velocidades asignadas a las regiones definen 3 clases, como queda expuesto en la representación de la matriz de rango dinámico.

En la solución implementada no es posible identificar los puntos característicos asociados a cada clase expuesta en la matriz de rango dinámica, pero es posible incorporar esta posibilidad para una vez obtenida la matriz, identificar sobre el frame los puntos de cada clase.

La simulación de las regiones y sus movimientos, como la implementación del algoritmo se realizó en Octave.

JunoCam – RGB channel merged.

The following picture shows the result of merge 16 sequencial frames

merged_frame

%
% This script show how to load a .IMG raw data file and merge the color channel 
% in order to get a real color image.
%
% javierluiso@gmail.com
% 2016.06.28

function Example_merge_frames()

% The PDS Header is parsed
pds_header = readPDSHeader('JNCE_2013282_00C102_V01.LBL');

% The IMG file is loaded.
raw_data = loadIMGfile(pds_header);
[R, G, B] = separateRGBframelets(raw_data');
[RGBFrames] = buildRGBFrames(R,G,B);

% Get dimenson for further use
[rows, cols, colors, total_frame] = size(RGBFrames);


TOTAL_FRAMES = 16;
frames = zeros(rows,cols, colors, TOTAL_FRAMES); 

for f=1:TOTAL_FRAMES
 frames(:,:,:,f) = RGBFrames(:,:,:,f)./255;
endfor

merged_frame = mergeChannels(frames, 115);
figure();
imshow(merged_frame);
title("Result of the merge process applide to N sequencial frames\n 115 pixel overlaping");

imwrite(merged_frame, "merged_frame.png");

endfunction;

 

JunoCam – PDS

Understanding .IMG and .LBL files.

Imaging data is available on the Internet for most NASA planetary missions that have been flown since the early 1970s

During the 1980s, the Planetary Data System established standards governing the format of image data delivered to the PDS.  Later missions conformed to that format standard, and the PDS provides online software enabling users to download data from the PDS archives and convert it into other useful data formats. PDS formatted images usually have a .IMG file extension and have detached ASCII-formatted text labels containing the image’s metadata, in a .LBL file.

JunoCam data will provided in PDS format. Indeed all the Earth Flyby data is available here.

A first version of .LBL file parser  is now available to process .IMG raw data files.

PDSHeader = readPDSHeader(lbl_file_name);

The next example shows how to use them:

%
% This script show how to load a .IMG raw data file.
% The .lbl file contains all information related to .img file data and how to parse it.
% This example read the PDS header from de .lbl file
% With all de information from PDS header the raw data is loaded en then all data is processed/
% In this example de RGB channels will be separated and then each frame of the camera sequence will be composite
% and save as a .png file.
%
% javierluiso@gmail
% 2016.06.28
function Example_process_PDS_data(lbl_file)

pds_header = readPDSHeader(lbl_file);
raw_data = loadIMGfile(pds_header);

if ( (pds_header.filter.BLUE == 1) && 
     (pds_header.filter.RED == 1) && 
     (pds_header.filter.BLUE ==1) )

    [R, G, B] = separateRGBframelets(raw_data');
    [RGBFrames] = buildRGBFrames(R,G,B);
    saveRGBFrameSequence(RGBFrames);
endif;

endfunction;

JunoCam

JunoCam (o JCM) es la cámara de luz visible e infrarrojo cercano (890 nm) de la sonda Juno que tiene como destino el planeta Júpiter, lanzada por la NASA el 5 de agosto de 2011. https://www.missionjuno.swri.edu/

A medida que  JunoCam vaya tomando las imágenes se irán  publicando para que el publico general puedan descargarlas y procesarlas a su libre elección. Luego se ofrecerá la opción de volver a subirlas al sitio de la NASA.

Se pone a disposición funciones en Octave para procesar dicha información.
El proyecto se mantendrá actualizado en el repositorio:

https://gitlab.com/javierluiso/juno-cam-processing

Procesamiento de los canales RGB

El siguiente video muestra el resultado de la extracción de los RGB framelets y reordenados para mostrar lo que ve el sensor CCD en cada exposición.
El archivo original que se ha procesado es: http://www.msss.com/junocam_efb/images/efb12.jpg

%
% This script shows how to separate de framelets for RGB channels from
% a raw swath of JunoCam.
% The RGB framelets are re-arrange to show each CCD exposure and a PNG
% image is created for each exposure.
% A video is created to show an annimation of JunoCam rotation
%
% In this example the efb12.jpg is processed. This files corresponds to 
% the Earth Fly-by made by Juno spacecraft on Wednesday, October 9, 2013
% http://www.msss.com/junocam_efb/ 
% 
% Image 12: Earth dayside
% Time: 12:12:30 PDT
% Exposure: 0.3 ms
% Time delay integration: 1
%
% javierluiso@gmail
# 2016.06.17
function example01()

[R,G,B] = separateRGBframelets('efb12.jpg');
[RawFrames] = buildRawFrames(R,G,B);
saveFrameSequence(RawFrames);

endfunction;

 

El siguiente script muestra el uso de las funciones que mapean la imagen de cada sensor al color correspondiente para visualizar en true color los que ve el CCD de la cámara.

%
% This script shows how to separate de framelets for RGB channels from
% a raw swath of JunoCam.
% The RGB framelets are re-arrange to show each CCD exposure and a PNG
% image is created for each exposure.
% Each channel is mapped to its true color.
% A video might be created whith de frame sequence to show an annimation 
% of JunoCam rotation
%
% In this example the efb12.jpg is processed. This files corresponds to 
% the Earth Fly-by made by Juno spacecraft on Wednesday, October 9, 2013
% http://www.msss.com/junocam_efb/ 
% 
% Image 12: Earth dayside
% Time: 12:12:30 PDT
% Exposure: 0.3 ms
% Time delay integration: 1
%
% javierluiso@gmail
# 2016.06.19
function ExampleBuildRGBFramesSequence()

[R,G,B] = separateRGBframelets('efb12.jpg');
[RGBFrames] = buildRGBFrames(R,G,B);
saveRGBFrameSequence(RGBFrames);

endfunction;

 

Procesamiento del canal Methane

El siguiente video muestra el resultado de la extracción de los framelets del canal de infrarrojo cercano, Methane Channel, y reordenados para mostrar lo que ve el sensor CCD en cada exposición.
El archivo original que se ha procesado es:http://www.msss.com/junocam_efb/images/efb09.jpg

 

%
% This script shows how to separate de framelets for Methane channel from
% a raw swath of JunoCam.
% A video is created to show an annimation of JunoCam rotation
%
% In this example the efb12.jpg is processed. This files corresponds to 
% the Earth Fly-by made by Juno spacecraft on Wednesday, October 9, 2013
% http://www.msss.com/junocam_efb/ 
% 
% Image 9: Earth dayside
%
% Band: Methane
% Time: 12:06:30 PDT
% Exposure: 3.2 ms
% Time delay integration: 3
%
% javierluiso@gmail
# 2016.06.20
function ExampleBuildMethaneFramesSequence()

M = separateMethaneframelets('efb09.jpg');
saveFrameSequence(M);

endfunction;

Sensor de Flujo Óptico

Tesis de Grado de Ingeniería Electrónica (UBA).

Se presenta el desarrollo de los algoritmos para el cálculo del flujo óptico y su implementación sobre una plataforma Intel Edison utilizando un sensor de imagen de bajo coste (webcam) .

El propósito de este trabajo fue el desarrollo de un sensor de flujo óptico. El sensor ha sido pensado para ser un dispositivo cerrado y autónomo, con una interfaz de control y acceso a datos definida, que pueda ser luego montado y empleado en otros desarrollos.
El dispositivo utiliza un sensor de imagen CCD y la palataforma Intel Edison donde se realiza el procesamiento de las imágenes del sensor y el cómputo del flujo  óptico.
El proyecto contempla el desarrollo del software que implemente los algoritmos de procesamiento de los frames de video. Por tratarse de un dispositivo que tiene requerimientos en cuanto al tiempo de procesamiento, dado que el flujo óptico debe ser determinado en tiempo real el proyecto implica el desarrollo de software que aproveche las capacidades de procesamiento paralelo disponibles en el hardware empleado (tecnología SSEx Intel).

El informe técnico del desarrollo se encuentra aquí.

Code: https://gitlab.com/javierluiso/optical-flow-sensor