miércoles, 28 de diciembre de 2016

Fedora 25: Después de la instalación de Fedora 25 (After install Fedora 25)


Fedora 25

Luego de instalar la distribución Linux Fedora 25 Workstation, conviene ejecutar otros pasos para instalar paquetes que no se encuentran en la instalación estandard.
Se detallan algunos paquetes que pueden ser de interés general.

  Otros recursos


Actualización del sistema

Desde Fedora 22, la herramienta dnf es la nueva versión que suplanta a yum, apareció en Fedora 18, pero forma parte oficial a partir de Fedora 22.
Importante actualizar la instalación del sistema luego de instalar el sistema operativo.


dnf update -y



  Librerías de desarrollo

Instalación de las librerías de desarrollo en C, importante para muchas herramientas.


dnf groupinstall ‘Development Tools’
dnf groupinstall ‘C Development Tools and Libraries’



Repositorio RPMfusion

El repositorio RPMfusion permite la descarga de distintos paquetes que no se encuentran en los repositorios oficiales de Fedora, almacenan paquetes free y no free.


su -c ‘dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm’



  Instalar los codecs para multimedia (media codecs)

Codecs necesarios para escuchar distintos formatos de audio y video


dnf install gstreamer-plugins-bad gstreamer-plugins-bad-free-extras gstreamer-plugins-bad-nonfree gstreamer-plugins-ugly gstreamer-ffmpeg gstreamer1-libav gstreamer1-plugins-bad-free-extras gstreamer1-plugins-bad-freeworld gstreamer1-plugins-base-tools gstreamer1-plugins-good-extras gstreamer1-plugins-ugly gstreamer1-plugins-bad-free gstreamer1-plugins-good gstreamer1-plugins-base gstreamer1



102.6 Instalar Adobe Flash player y Flash Plugin

Ni que decir, aparece en todas partes y hasta pasó a ser indispensable.
(Sistemas operativos 32 bits)


rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-i386-1.0-1.noarch.rpm



(Sistemas operativos 64 bits)


rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-x86_64-1.0-1.noarch.rpm



(Importar clave)


rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux



Instalando Flash plugin


dnf install flash-plugin alsa-plugins-pulseaudio libcurl



102.7 Herramientas multimedia y otras

Instalar Skype para video conferencias.


wget http://download.skype.com/linux/skype-4.3.0.37-fedora.i586.rpm
dnf install skype-4.3.0.37-fedora.i586.rpm



VLC media player para las pelis, y Transmission para los torrents.


dnf install vlc transmission -y



102.8 Herramientas de gráficos

Sin dudar, Pinta porque es una aplicación bien básica para dibujos y se puede utilizar rápidamente sin mucho preámbulo. Inkscape, es un poderoso entorno para el dibujo profesional. Por último Gimp, que también posee avanzadas características para el retoque de imágenes y diseño.


dnf install pinta inkscape gimp



102.9 Herramientas de virtualización

Gnme boxes, el cual utiliza QEMU y hace uso del módulo KVM viene por default en Fedora 25.


102.10 Herramientas de red


Algunas herramientas útiles que pueden mencionarse son:
  • Mtr, herramienta para realizar trazas de paquetes, es un traceroute mejorado.
  • Tcpdump, analizador de protocolos de red con interfaz modo texto.
  • Filezilla, herramienta especial para copiado de archivos utilizando protocolos ftp y ssh.
  • Hping3 es el ping con esteronas, especial para hacer ping avanzados con protocolos.
  • Ngrep para extender las expresiones regulares a los paquetes de red.
  • Nmap, indudablemente el mejor scanner de puertos (opinion personal).
  • Wireshark, analizador de protocolos de red con interfaz gráfica.
Instalado por default desde el medio vivo (live) vienen: mtr, tcpdump


dnf install filezilla hping3 ngrep nmap wireshark wireshark-gtk  



Tor y Privoxy, dos herramientas muy interesantes para hacer anonimización de paquetes.


dnf install tor privoxy



102.11 Herramientas de escritorio

Lector de archivos pdf’s por default.
Lector de archivos CHM, Kchmviewer y un lector de archivos djvu Djview.


dnf install kchmviewer djview4  


Calibre, software para organización de bibliotecas de textos y conversión desde pdf a archivos .epub, por cierto muy bueno.


dnf install calibre


Para edición de .text Latexila y TextMaker


dnf install latexila
dnf install texlive-collection-latex texlive-collection-latexextra texlive-collection-science texlive-collection-latexrecommended texlive-collection-genericextra texlive-collection-genericrecommended texlive-collection-fontsrecommended tex-pst-optexp texlive-epstopdf-bin


102.12 Software para instalar

Fedora Live USB Creator, para crear versiones de medios vivos a partr de isos.


dnf liveusb-creator



lunes, 12 de diciembre de 2016

Desencriptador Genexus client.cfg server.cfg


  1 Introducción

No se si llamarla una vulnerabilidad, es mas bien un aprovechamiento de una configuración por default. Este artículo nació luego de probar configuraciones de software desarrollado en Genexus con conexión a bases de datos Tomcat - PostgreSQL y en entornos Tomcat - AS/400 DB2.
Las pruebas que se realizaron fueron llevadas a cabo como si fuera una caja negra analizando archivos temporales que generan las aplicaciones Genexus.
Otro factor fundamental, en muchos entornos AS/400, las configuraciones se encuentran por default, lo que da pie a que si se puede lograr un acceso a la base de datos, también puede ser posible acceder a FTP y en casos particulares el mismo sirve para TELNET (buen acceso, no siempre).
En bases de datos PostgreSQL y como en cualquier otra base de datos, encontrar una tabla a veces ayuda a escalar en| privilegios, y tal vez escalar privilegios desde procedimientos almacenados.
Genexus ofrece una herramienta (o al menos la ofrecía) denominada PasswordChanger para poder editar los archivos client.cfg y server.cfg.
Se utilizó el código fuente de PasswordChanger para entender la encriptación utilizada y por ende aprovechar para desencriptar las credenciales.
El código fuente del desencriptador y las bibliotecas estándares se encuentra en Github.
Si esto se llegó a corregir, disculpen, si sigue vigente espero que les de ideas para solucionar, por las dudas se aclara también que este post es con fines educativos, hasta Genexus 9 funcionaba.


2 Descripción técnica

Los programas desarrollados con la herramienta Genexus crean archivos de configuración local en las estaciones de trabajo y guardan datos para conexiones a bases de datos en directorios ocultos, entre los datos importantes están las credenciales de acceso.
El archivo client.cfg dentro del directorio “GeneXus Web Start”, contiene los datos de credenciales necesarios para el ingreso a la base de datos. El archivo mencionado se encuentra en implementaciones tanto a nivel Java Swing como en entornos web y es de conocimiento casi general que cuando las cosas fallan.
¿Cuál es la vulnerabilidad, el riesgo y su mitigación?
  • Vulnerabilidad: Contraseñas encriptadas almacenadas en archivo client.cfg que pueden ser desencriptadas.
  • Riesgo: Se puede conocer el usuario y contraseña de conexión a la base de datos que utilizan los programas creados con la herramienta Genexus. Esto permitiría el ingreso a bases de datos y el aprovechamiento de acceso a información restringida en tablas.
  • Mitigación: Se debe cambiar la forma de almacenar las contraseñas para los programas del tipo Win o Java Swing.


2.1 Ejecución de las pruebas

Se exponen los pasos que se siguieron para el análisis de la vulnerabilidad y aprovechamiento.
  • Recolección de muestras.
  • Búsqueda de información sobre el tipo de algoritmo que se utiliza para la encriptación.
  • Implementación software del algoritmo de desencriptación.

2.2 Recolección de muestras

En un entorno con una estación de trabajo Windows XP y la posibilidad de conexión a dos servidores de aplicación Apache Tomcat, se realizaron copias de la carpeta “GeneXus Web Start”, generadas por la aplicación programada en Genexus. Para tomar cada muestra, se borró previamente la carpeta GeneXus Web Start dentro de “Archivos de Programas” en la estación de trabajo.
Se analizaron los archivos client.cfg de cada servidor y se pudo verificar que las cadenas encriptadas no presentaron variaciones. Esto dió la pauta que ambos servidores utilizaban el mismo usuario y contraseña para acceder a una base de datos principal.
En el sitio oficial de Genexus se pudo verificar que el algoritmo de encriptación utilizado en estas rutinas es Twofish.
El algoritmo en particular permite una desencriptación de la clave encriptada, pero se requiere que ambas partes (emisor-receptor) conozcan la clave de encriptación.

2.3 Implementación software para desencriptar el archivo client.cfg

Se procedió a buscar y analizar soluciones implementando el lenguaje de programación Java. Se verificó en las páginas de programación relacionadas a la herramienta Genexus y se encontró la herramienta PasswordChanger que permite la generación de contraseñas encriptadas. Luego se utilizó el código fuente con el fin de entender las bibliotecas utilizadas para encriptar/desencriptar las cadenas, el IDE utilizado para el proyecto fue Netbeans 7.1.2 y Netbeans 8.1.
PasswordChanger es ofrecida entre las clases estándares, su función es permitir el cambio de la contraseñas en archivos client.cfg y server.cfg.
El código fuente del desencriptador y las bibliotecas estándares se encuentra en Github.


3 Recomendación

Es recomendable utilizar un sistema de encriptación de un solo sentido, por ejemplo MD5, SHA-2, de manera que se dificulte la desencriptación a partir de una cadena encriptada. Aunque no es imposible, cuesta mucho más intentar romper la encriptación de un sentido como MD5, SHA-2 o lo que quieran colocar.
Mitigar esto, es una tarea para desarrolladores de Genexus.

4 Utilización del desencriptador

Se ofrece un ejemplo de archivos para conexión a una base de datos PostgreSQL. Se puede utilizar el desencriptador llamando a la siguiente linea.



java -jar “directorio del archivo client.cfg”








Conexión FTP a un AS/400 con el usuario desencriptado






domingo, 4 de diciembre de 2016

Un vistazo a Angular 2 y Typescript para el impaciente


Buscando un poquito me topé con este tutorial muy interesante, que trata sobre Angular 2 y Typescript. Lo desarrollé usando Ubuntu 16.10.

https://www.sitepoint.com/angular-2-tutorial/

El tutorial me pareció fácil, por lo que recomiendo seguirlo.

TL; DR. Lo que se necesita hacer para poder llegar a la aplicación de juguete es(obs: el tutorial no incluye los estilos, por lo que sale el formulario sin ellos):

- Instalar npm :
sudo apt install npm

- Instalar angular-cli
npm install -g angular-cli

Esto tardó un montón, y asumiendo que funcionó, debería poder verse la versión de npm con este comando
ng version

Ahora ya se puede crear el boilerplate de la aplicación:
ng new angular2-todo-app

Esto crea una estructura de directorios lista para trabajar. se puede probar que la aplicación funciona escribiendo en la terminal:
ng serve

Dentro del directorio de la aplicación creada.
Gracias a Typescript se puede aprovechar la bien conocida orientación a objetos. Para la aplicación de juguete del tutorial, basta con crear una clase Todo:
ng generate class Todo

Que solamente crea el fuente:
src/app/todo.ts

Probablemente angular-cli cambió en algunas cosas desde que se escribió el tutorial original. Admito que no pude correr ningún test, y para la aplicación de juguete, no creo que se demasiado necesario.
Al fuente creado anteriormente se le reemplaza los contenidos con lo que se muestra abajo:
 export class Todo {  
  id: number;  
  title: string = '';  
  complete: boolean = false;  
  constructor(values: Object = {}) {  
   Object.assign(this, values);  
  }  
 }  

Y si en el tutorial original se obvia todo lo de los test, se puede crear un service typescript de la siguiente manera:
ng generate service Todo

Éste fuente typescript maneja la lógica que se aplica sobre la clase Todo. Éste comando genera dos archivos
src/app/todo.service.spec.ts
src/app/todo.service.ts

El primero sirve para los test (no lo uso por esta vez) y el siguiente es en donde se escribe la lógica. Se puede reemplazar sin inconveniente el código que aparece en todo.service.ts por lo siguiente (exactamente igual que en el tutorial original):
 import { Injectable } from '@angular/core';
import {Todo} from './todo';
@Injectable()
export class TodoService {

 lastId: number = 0;

 todos: Todo[]=[];

 constructor() { }

 // Simulate POST /todos
 addTodo(todo: Todo): TodoService {
  if (!todo.id) {
   todo.id = ++this.lastId;
  }
  this.todos.push(todo);
  return this;
 }

 // Simulate DELETE /todos/:id
 deleteTodoById(id: number): TodoService {
  this.todos = this.todos
  .filter(todo => todo.id !== id);
  return this;
 }

 // Simulate PUT /todos/:id
 updateTodoById(id: number, values: Object = {}): Todo {
  let todo = this.getTodoById(id);
  if (!todo) {
   return null;
  }
  Object.assign(todo, values);
  return todo;
 }

 // Simulate GET /todos
 getAllTodos(): Todo[] {
  return this.todos;
 }

 // Simulate GET /todos/:id
 getTodoById(id: number): Todo {
  return this.todos
  .filter(todo => todo.id === id)
  .pop();
 }

 // Toggle todo complete
 toggleTodoComplete(todo: Todo){
  let updatedTodo = this.updateTodoById(todo.id, {
   complete: !todo.complete
  });
  return updatedTodo;
 }

}


Después de obviar los test si se puede pasar a la sección: Creating the TodoApp Component. Ahí es donde en el tutorial tuve que hacer algunas cosas un poquito distintas (tal vez por los cambios que va sufriendo Angular 2 y Typescript). Luego de generar el boilerplate del componente:
ng generate component TodoApp

Se tienen los siguientes fuentes, tal como el tutorial original:

src/app/todo-app/todo-app.component.css
src/app/todo-app/todo-app.component.html
src/app/todo-app/todo-app.component.spec.ts
src/app/todo-app/todo-app.component.ts
src/app/todo-app/index.ts

Ahora bien, en todo-app.component.html se puede reemplazar el código html por el que muestra en el tutorial (no lo muestro acá porque blogger interpreta que es código de la entrada).

Ahora bien, a partir de acá es donde encontré diferencias, y es cuando se debe reemplazar el código de src/app/todo-app/todo-app.component.ts. El mío quedó así, a diferencia del tutorial original:
 import { Component, OnInit } from '@angular/core';
import {TodoService} from '../todo.service';
import {Todo} from '../todo';

@Component({
 selector: 'app-todo-app',
 templateUrl: './todo-app.component.html',
 styleUrls: ['./todo-app.component.css'],
 providers: [TodoService]
})
export class TodoAppComponent implements OnInit {

 //constructor() { }

 ngOnInit() {
 }

 newTodo: Todo = new Todo();

 constructor(private todoService: TodoService) {
 }

 addTodo() {
  this.todoService.addTodo(this.newTodo);
  this.newTodo = new Todo();
 }

 toggleTodoComplete(todo) {
  this.todoService.toggleTodoComplete(todo);
 }

 removeTodo(todo) {
  this.todoService.deleteTodoById(todo.id);
 }

 get todos() {
  return this.todoService.getAllTodos();
 }

}



Y si le das en seco ng serve la página no funciona como se espera, ésto es porque en el tutorial original no se menciona que se debe modificar el archivo src/app/app.component.html, y reemplazarlo por lo siguiente:

<app-todo-app></app-todo-app>

Ésto sirve para que se rutee de la página principal a la aplicación todo. Con esto debería ser suficiente para que la aplicación funcione en http://localhost:4200/angular2-todo-app/

Por último, la parte que habla de subir el código a github pages no me funcionó, por lo que tuve que verlo por mi cuenta. Mi sugerencia es que se versione todo el código, porque al tratar de subir a github pages se reemplazan los fuentes por código optimizado. Les recomiendo seguir un tutorial para subir una aplicación angular a github pages. Algo como esto:

http://developer.telerik.com/featured/quick-angular-2-hosting-angular-cli-github-pages/

Tengan en cuenta, que el index.html del código generado necesita una modificación, a saber:

  <base href="/angular2-todo-app/">

Esto debe quedar así, porque o sino en github pages no resuelve bien los js ni css.

Al final la fuente de la demo se encuentra en

https://github.com/lgmore/angular2-todo-app/

en la rama master

y en

https://lgmore.github.io/angular2-todo-app/

se encuentra la aplicación de juguete funcionando. Cheers!!

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/
  10. Class Central, https://www.class-central.com/ 

Aprendizaje automático, EMOOCS

  1. Datacamp, data science online. https://www.datacamp.com/ 
  2. Data School, data science. http://www.dataschool.io/
  3. Kaggle, desafíos de data science. https://www.kaggle.com/ 
  4. Data Science Central, recursos en línea. http://www.datasciencecentral.com
  5. Deep Learning. http://www.deeplearningbook.org/ 
  6. Libro (Free ebook online) Neural Networks and Deep Learning. http://neuralnetworksanddeeplearning.com/
  7.  

Desarrollo, desafíos de programación

  1. Free Code Camp, programación. https://www.freecodecamp.org
  2. Guía Técnica Google para aprendizaje de tecnologías. https://www.google.com/about/careers/students/guide-to-technical-development.html
  3. Hacker Earth, https://www.hackerearth.com/
  4. Acepto el Reto, desafíos de programación.  http://aceptaelreto.com/
  5. Hacker Rank, desafíos de programación. https://www.hackerrank.com/

Linux

  1. Free Linux Training. https://training.linuxfoundation.org/free-linux-training


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/



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