jueves, 24 de noviembre de 2016

Cálculo del color promedio en imágenes digitales


Preguntas y preguntas

Este ejemplo surge a partir de un trabajo sobre imágenes de naranjas. El código se puede descargar desde Github.
  • ¿Cuál fue la idea?, bien, obtener el color promedio de una sección de una naranja.
Lo que motivó el ejemplo fue lo siguiente:
  • ¿Qué sucede si tengo una naranja sana?. 
  • ¿Cuál sería el color predominante?.
  • ¿Qué sucede si tengo una naranja en mal estado?. ¿Varía su color?
Habiendo presentado lo que me llevó a probar esto, lo otro que surgió fue lo siguiente :
  •  ¿Qué espacio de color utilizo para obtener el color promedio?
Se aclara que cuando se cuenta con una imagen a color, al momento de trabajar con los pixeles, desde un pixel a otro se encuentran variaciones, algo que cuando miramos desde lejos a una imagen no lo percibimos.
Hice las pruebas tanto en el espacio de color RGB como en el espacio de color HSV.

¿Para qué sirve y en que utilizo el color promedio?

El cálculo de un color promedio, en visión de computadoras permite conocer el color predominante en un sección de la imagen. Esto puede ser utilizado como un parámetro de comparación, así como las características geométricas de un objeto. Ver (http://otroblogdetecnologias.blogspot.com/2016/11/extraccion-de-caracteristicas-en.html)

Se resalta, que las pruebas ejecutadas en el código que se ofrece fueron realizadas en imágenes recortadas a partir de imágenes de naranjas extraídas desde una base de datos pública (http://es.123rf.com/).

El ejemplo ha sido bien acotado bajo las siguientes condiciones:
  • Las imágenes de naranjas cuentan con un fondo negro, lo cual facilita el procesamiento en caso de binarización.
  • Las texturas fueron recortadas cuidadosamente de las imágenes de naranjas, las mismas no cuentan con colores distintos que podrían afectar el resultado del color promedio.
Las imágenes se trataron para que tengan un fondo negro, a manera de crear un alto contraste de colores.
Se formaron pares de imagen - textura a continuación los pares de pruebas:
  • Naranja sana, naranjaN1.jpg -> texturaN1.jpg.
  • Naranja sana, naranjaN2.jpg -> texturaN2.jpg.
  • Naranja enferma, naranjaP1.jpg -> texturaP1.jpg.
  • Naranja enferma, naranjaP2.jpg -> texturaP2.jpg.

Conclusión

Al menos, en este ejemplo didáctico, el color promedio se acercó bastante al color de la naranja (visualmente hablando), también para los ejemplos presentados se notó un cambio en el color promedio, dado que en las naranjas enfermas el color promedio contó con aportes en el color verde.

El código fuente fue realizado en Matlab, la verdad que se puede mejorar mucho la idea, incluso colocar el color promedio en una ventana. No obstante, se pueden copiar los resultados de la consola a un color picker, sea uno online o de una herramienta gráfica como InkScape

Puedes descargar el fuente desde Github.

Extracción de características en imágenes digitales- Rotación de figuras en Matlab


Antes de comenzar, el código fuente puede ser visto en la cuenta Github, así como otros códigos.

A la verdad este es un ejemplo básico, las cosas se pueden complicar mucho más. La idea central es la de extraer características de un objeto único presente en una imagen, luego recortarlo y rotarlo a 90 grados.
La utilidad de este ejercicio es la de acomodar los objetos reconocidos para una posterior comparación según su geometría. Representa un paso previo en un sistema de reconocimiento de objetos.
Queda a gusto del lector aplicarle mayor complejidad.

Las sentencias utilizadas que se resaltan son:
  • imcrop.
  • imrotate.
Las sentencias importantes a utilizar son:
%% Recortar imagen
IB3=imcrop(IB1,propiedades(1).BoundingBox); %cortar imagen  
orientacionFinal=-90+propiedades(1).Orientation; %se calcula el angulo para rotar a 90 grados   
IB4 = imrotate(IB3,orientacionFinal); %rotar la imagen a 90grados


 Un ejemplo explicativo de extracción de características geométricas más completo puede ser visto en este blog en:
Allí brevemente se hace una introducción al uso de funciones en Matlab y se adjuntan imágenes de calibración.

Sobre el ejemplo

El ejemplo está pensado para una imagen con un único objeto, existen varias formas de complicar el problema, por ejemplo, teniendo varios objetos, etiquetarlos, alinearlos y separarlos contadolos.
Para evitar complicaciones, se asume que en la figura solamente se encuentra un elemento en la imagen.
En el algoritmo se realizan los pasos generales de:
  • Ajuste de parámetros iniciales.
  • Lectura de la imagen.
  • Convertir a escala de grises.
  • Umbralización y Binarización.
  • Invertir imagen.
  • Etiquetado de áreas conectadas.
  • Cálculo de propiedades de los objetos de la imagen.
  • Con los elementos etiquetados, extraer las características geométricas:
    • Area.
    • Perímetro. 
    • Exentricidad.
    • Centroides.
    • Bounding Box.
  • Recortar y copiar a una nueva imagen.
Si utilizas Matlab, descárgalo y ejecuta, si no tal vez te sea útil para entender el algoritmo y traducirlo a otro lenguaje, descarga desde Github.

viernes, 18 de noviembre de 2016

Enlaces a cursos y materiales de educación online, EMOOCS


 Para el que quiere aprender, siempre existen recursos, es necesario tener ganas, aquí se agrupan varios enlaces de plataformas con cursos online.
No hay excusas, sin duda para mi gusto (opinión personal) y a la cabeza, Edx, Coursera Khan Academy.

Cursos online, cátedras de universidades


  1. Comunidad Oracle. https://community.oracle.com/welcome
  2. Coursera. https://www.coursera.org/
  3. EDX. https://www.edx.org/
  4. Khan Academy. https://www.khanacademy.org/
  5. Microsoft Virtual Academy. https://mva.microsoft.com/
  6. Miriada X. https://miriadax.net/home
  7. MIT Open Course Ware. https://ocw.mit.edu/index.htm
  8. Udacity. https://www.udacity.com/
  9. UniMOOC, http://unimooc.com/



Otras plataformas

  1. Canvas Network. https://www.canvas.net/
  2. Tutellus. https://www.tutellus.com/
  3. www.class.stanford.edu
  4. Edraak. https://www.edraak.org/
  5. Open Learning Initiative. http://oli.cmu.edu/
  6. Open HPI. https://open.hpi.de/
  7. Open Yale Courses. http://oyc.yale.edu/
  8. Skillshare. https://www.skillshare.com/
  9. NovoEd. https://novoed.com/

Free Linux Training. https://training.linuxfoundation.org/free-linux-training
Guía Técnica Google. https://www.google.com/about/careers/students/guide-to-technical-development.html


miércoles, 9 de noviembre de 2016

Extracción de características en imágenes digitales- Implementación Matlab

 ¿Para qué extraer características?

En el área de visión de computadoras, muchas veces  se requiere obtener características geométricas de los objetos existentes en imágenes digitales, esto se realiza con el objetivo de poder tomar decisiones. Por ejemplo, si una figura es redonda se puede hacer algo, otro caso sería si está inclinada corregir la posición.

En este artículo, se presentan ejemplos exploratorios que involucran el uso de Matlab como herramienta.

Además se proveen los conjuntos de imágenes generados para la realización de las pruebas. Estos conjuntos podrán ser utilizados como imágenes de comparación contra otras herramientas.

Se agregaron los códigos fuentes, el conjunto de imágenes y un documento explicativo que han sido subidos a un repositorio público en la cuenta de GitHub
Las características geométricas buscadas fueron:
  • Área en pixeles. ¿Cuanto ocupa (muy relacionado con las medidas reales)?
  • Perímetro. ¿Cuanto mide si rodeo la figura?
  • Excentricidad. ¿Qué tan parecido a una elipse es la figura?
  • Orientación. ¿Que ángulo tiene su eje inercial?
  • Redondez. ¿Qué tan redonda es una figura?
  • Centroide. ¿Cuál es el punto medio de una figura?
  • Etiquetado de figuras. ¿Cuantas figuras hay?
  • Medición de distancias a partir de pixeles. (No desarrolladas en este material)

Se llevaron a cabo dos pruebas:

Materiales utilizados

  • Herramienta Inkscape para la producción de imágenes vectoriales. 
  • Matlab.
  • Conjunto de imágenes en escala de grises en formato .png (presentes en cada directorio con el código fuente).
Se crearon un total de 13 (trece) imágenes en formato vectorial .svg, con una resolución de 400x400 pixeles, las mismas fueron importadas a formato .png, tanto en la creación como en la importación se utilizó la herramienta open source Inkscape.

Tablas con las mediciones realizadas pueden ser vistas en el archivo explicativo.
El conjunto de imágenes de calibración cuenta con distintas figuras geométricas, las cuales fueron dibujadas utilizando como unidad de medida el pixel.
Imágenes de círculos .png


Imágenes de cuadrados .png
Imágenes de elipses .png
Imágenes de rectangulos .png


Imagen utilizada para prueba de etiquetado

jueves, 3 de noviembre de 2016

Referencia Matlab, Matlab Quick Referece, Matlab Reference

Referencia Matlab, Matlab Quick Referece, Matlab Reference





Ufff, siii otro listado de funciones, de los miles y miles que hay. Este es un pequeño listado de funciones bastante útiles y algunos ejemplos sobre el uso del Matlab y procesamiento de imágenes.Para descargar en formato pdf; https://github.com/freelanceparaguay/matlabExamples/tree/master/MatlabReference
Hay miles de guías, interminable cantidad de materiales, esta la hice en base a mis necesidades durante trabajos de procesamiento digital de imágenes.




1 Configuración de entorno

Sentencia

Ejemplo

clc

Borrar comandos en consola.

clear all

Limpiar valores en
memoria.

close all

Cerrar ventanas
abiertas.

2 Entradas y salidas

Sentencia

Ejemplo

fprintf

Impresión en pantalla con formato

ti=2.56;

paso=0.5;

va=0;

vi=0;

vti=0;

fprintf('ti=%.2i seg ti+paso=%.2f seg va=%.2i km/seg
vi= %.2f km/seg vti= %.2f km/seg \n',ti,ti+paso,va,vi,vti);

disp

Impresión en pantalla de cualquier tipo de datos

Vti=0.9;

disp(vti);
%muestra valor solo

disp('mensaje'); %muestra
mensaje

input

Ingreso por
teclado

M=input('Mensaje
entrada1->');

B=input('Mensaje entrada2
->');

disp(M);

disp(B);

3 Control del flujo y variables

Sentencia

Ejemplo

if ...
end

ti=2;

if ti==2

fprintf('Igual a dos');

else

fprintf('No es igual a dos');

end

ti=2; vi=0;

if (ti==2
& vi==0)

fprintf('ti=2 y vi=0
\n');

else

fprint('no cumple \n');

end

Existe
variable

switch ..
end

valor=input('Mensaje
entrada1->');

switch valor

case 1

disp('Valor
-> 1.');

case 2

disp('Valor -> 2.');

case 3

disp('Valor
-> 3.');

otherwise

disp('Otros valores .');

end

while ..
end

Ti=0;

paso=0,5;

tiempoFinal=10;

while
ti < tiempoFinal

fprintf('t= %.2f
paso=%.2f \n',ti,paso);

ti=ti+paso;

end

for ...
end

for ti=0:tiempoFinal

fprintf('t= %.2f \n',ti);

end

4 Funciones y procedimientos

Sentencia

Ejemplo

function
... end

Función en archivo .m

function [ salida1 salida2 ] =
untitled2( entrada1, entrada2 )

fprintf('entrada1= %.2f \n entrada2=%.2f \',entrada1, entrada2);

salida1=10;

salida2=20

end

Llamar desde la linea de comandos como

[a,b]=ejemplofuncion(1,2);

Los parámetros se
devuelven a las variables encerradas entre corchetes.

@

Función en línea dentro de un
script

%definición de función en línea

InterpolacionLinealGrado1 = @ (x0,fx0,x1,fx1,x)
(fx0+((fx1-fx0)/(x1-x0))*(x-x0));

%llamado a función en línea

valorGrado1=InterpolacionLinealGrado1(1,3,5,99,4);

5 Matrices y vectores

Sentencia

Ejemplo

X=[1:10];

Definición y acceso a un vector

X=[1:10];

X(indice);

M(fila,
columna);

Definición y acceso a una matriz

M=[1, 2, 3; 4, 5, 6; 7, 8, 9]

M(fila, columna);

size()

Tamaño de una matriz

[filas,columnas]=size(X);

zeros()

Inicializar con ceros

matriz=zeros(n,n);

Recorrer y mostrar una
matriz

X=[1, 2, 3; 4, 5, 6; 7, 8, 9]

[n,m]=size(X);

for i=1:1:n

for
j=1:1:(m)

fprintf('%.2f ',X(i,j));

end

fprintf('\n');

end

cat(1,A,I)

Concatenar matrices

A=[1 2 3;4 5 6]

I=[1 2
3;4 5 6]

cat(2,A,I) %concatenar columnas

cat(1,A,I) % concatenar filas

A'

Transpuesta de una matriz

A=[1 2 3;4
5 6]

A'

det(A)

Determinante

A=[1 2 3;4 5 6; 7 8
9
]

determinante=det(A)

6 Ploteado de funciones

Sentencia

Ejemplo

7 Procesamiento digital de imágenes

Sentencia

Ejemplo

Abrir imagen

Iorig=imread('imagen.jpg');

imshow(Iorig);

Mostrar
imagen

Iorig=imread('imagen.jpg');

figure;
imshow(Iorig);

Guardar imagen

Iorig=imread('imagen.jpg');

imwrite(Iorig,'prueba.jpg','jpg')

Acceder a la matriz de la imagen.

size(originalImage)

Tamaño de imagen, ancho y alto

Iorig=imread('imagen.jpg');

[rows,
columns, numberOfColorBands]= size(Iorig);

im2bw(Iorig,nivel

Binarizar imagen.

1=
BLANCO.

0=NEGRO.

Iorig=imread('imagen.jpg');

nivel = graythresh(Iorig); %umbral de nivel de
gris

IB2=im2bw(Iorig,nivel);

figure;imshow(IB2); %mostrar

strel('disk', 3)

Definición de elementos
estructurantes

SE = strel('disk', 3); %disco
con radio 3 pixeles

SE =
strel('diamond', 5); %disco con radio 5 pixeles

SE = strel('line', 3, 0); %línea 3 pixeles, 0 grados

% otros: ball, octagon,
square

imerode(IB2,SE)

Erosión

SE = strel('disk', 3);

IB4 = imerode(IB2,SE);

figure;imshow(IB4);

imdilate(IB2,SE)

Dilatación

SE = strel('disk', 3);

IB4 = imdilate(IB2,SE);

figure;imshow(IB4);

imclose(IB5,SE)

Apertura

SE =
strel('disk', 3);

IB7=imclose(IB5,SE);

imclose(IB5,SE)

Cerradura

SE =
strel('disk', 3);

IB7=imclose(IB5,SE);

Invertir
imagen binaria

Iorig=imread('imagen.jpg');

IB1=im2bw(Iorig,nivel);

IB2=1-IB1;

figure; imshow(IB1);

figure; imshow(IB2);

bitxor(IB7,IB10)

XOR de
imágenes

Iorig1=imread('imagen.jpg');

Iorig2=imread('imagen.jpg');

IB1=im2bw(Iorig1,nivel);

IB2=im2bw(Iorig2,nivel);

IB3=bitxor(IB1,IB2);

figure;
imshow(IB1);

figure; imshow(IB2);

figure; imshow(IB3);

bitor(IB1,IB2)

OR de imágenes

Iorig1=imread('imagen.jpg');

Iorig2=imread('imagen.jpg');

IB1=im2bw(Iorig1,nivel);

IB2=im2bw(Iorig2,nivel);

IB8=bitor(IB1,IB2);

figure;
imshow(IB1);

figure; imshow(IB2);

rgb2gray(Iorig)

Convertir de RGB a grises

Iorig=imread('imagen.jpg');

IG=rgb2gray(Iorig);

edge(IG,'prewitt')

Filtro
Sobel, realce de bordes

Iorig=imread('imagen.jpg');

IG=rgb2gray(Iorig);

Iedges=edge(IG,'prewitt'); %puede
definirse el umbral de gris

figure;imshow(Iedges)

rgb2gray(Iorig)

Filtro Laplaciano,
realce de bordes

Iorig=imread('imagen.jpg');

IG=rgb2gray(Iorig);

Iedges=edge(IG,'log'); %puede definirse el umbral de gris

figure;imshow(Iedges)

edge(IG,'prewitt')

Filtro Prewwit, realce de bordes

Iorig=imread('imagen.jpg');

IG=rgb2gray(Iorig);

Iedges=edge(IG,'prewitt'); %puede definirse el
umbral de gris

figure;imshow(Iedges)

fspecial('average')

Filtro de la media

Iorig=imread('imagen.jpg');

IB1 = im2bw(Iorig);

f=fspecial('average');

IB2=filter2(f,IB1);

imfill(IB1,'holes')

Llenado de agujeros

Iorig=imread('imagen.jpg');

IB1 = im2bw(Iorig);

IB2 = imfill(IB1,'holes');

imshow(BW4),
figure, imshow(BW5)

regionprops(IB1,'Area')

Cálculo de
áreas

area=regionprops(IB1,'Area')

fprintf('Area= %.2i;
area.Area);

regionprops(IB1,'Perimeter')

Cálculo de
perímetro

perimetro=regionprops(IB1,'Perimeter')

fprintf('Perimetro= %.2f \n',
perimetro.Perimeter);

regionprops(IB1,'Eccentricity')

Cálculo de
excentricidad

excentricidad=regionprops(IB1,'Eccentricity')

fprintf('Excentricidad= %.4f \n', excentricidad.Eccentricity);

regionprops(IB1,'centroid')

Cálculo de centroide

centroides=regionprops(IB1,'centroid')

fprintf('X %.2f; Y %.2f\n', centroides(:,1), centroides(:,2));

subplot(2,2,1)

Mostrar matriz de imágenes

subplot(2,2,1);imshow(Iorig);

subplot(2,2,2);imshow(IB12);

subplot(2,2,3);imshow(Iorig);

subplot(2,2,4);imshow(IB2);

8 Historial de cambios

Fecha

Versión

Descripción

Autor

03/11/2016

0,1

Creación y redacción del documento

http://otroblogdetecnologias.blogspot.com