Conteo de granos Procesamiento de imagenes
Enviado por Beto VS • 19 de Junio de 2018 • Tarea • 1.779 Palabras (8 Páginas) • 834 Visitas
Conteo de granos por procesamiento de imágenes.
Tarea 2 Procesamiento de señales
[pic 1]
Introducción
El presente trabajo tiene la finalidad de realizar el conteo de granos de una imagen tomada por un microscopio metaligráfico, mediante procesamiento de imágenes. Se han implementado los métodos necesarios para procesar las imágenes, con la finalidad de estructurar un sistema que automáticamente realice el conteo y la separación de granos.
Implementación:
Los métodos fueron programados en el lenguaje C++, con la finalidad de tener un sistema completo y portable se generó una clase para procesamiento de imágenes, el formato único de imágenes soportado es BMP, dado que los mapas de bits no requieren descompresión adicional para la extracción de la información de los pixeles de la imagen.
La clase tiene los siguientes métodos:
void OpenVMS(Insisting Filename); | Abre imagen BMP |
void SaveBMP(AnsiString FileName); | Guarda imagen BMP |
void GrayScale(); | Convierte a escala de grises la imagen |
void Threshold(int LimInf,int LimSup); | Umbraliza la imagen entre los limites inferior y superior |
void Invert(); | Invierte la imagen |
int ParticleCount(); | Cuenta las partículas de la imagen |
void ParticlePerim(); | Mide el perímetro de las partículas de una imagen el resultado lo guarda en un arreglo P[n] |
void CopyImgPrev(Graphics::TBitmap *IMP,Graphics::TBitmap *IMN); | Copia la imagen antes de realizar un procesamiento en una matriz |
void EraseMarc(); | Dibuja el marco exterior de una imagen en color negro |
void EraseFrontH(); | Elimina las partículas que tocan los bordes horizontales de la imagen |
void EraseFrontV(); | Elimina las partículas que tocan los bordes verticales de la imagen |
void AddMarc(TColor Color); | Agrega un marco exterior en la imagen de un color determinado |
void RemoveMarc(); | Elimina un marco exterior de la imagen reduciendo su tamaño |
void EraseHoles(); | Elimina los hoyos dentro de las partículas de una imagen |
void ErasePoits(int AreaMenor); | Elimina los puntos blancos menores a un área especifica |
void ErasePoitsN(int AreaMenor); | Elimina los puntos negros menores a un área especifica |
void Distance(); | Calcula la función distancia de la imagen |
void BasicErosion(); | Realiza la erosión básica de una imagen |
void BasicDilatation(); | Realiza la dilatación básica de una imagen |
void Opening(int N); | Realiza la apertura tamaño N |
void Closing(int N); | Realiza la cerradura tamaño N |
void Reconstruction(Graphics::TBitmap *Mark); | Genera la reconstrucción de una imagen |
void LocalMin(); | Obtiene los mínimos locales de la imagen |
void LocalMax(); | Obtiene los máximos locales de la imagen |
ImgBMP& operator + (const ImgBMP &sumando); | Sobrecarga de operador suma, para dos imágenes |
ImgBMP& operator + (const int suma); | Sobrecarga de operador suma, para una imagen y una constante |
ImgBMP& operator - (const ImgBMP &resta); | Sobrecarga de operador resta, para dos imágenes |
ImgBMP& operator - (const int resta); | Sobrecarga de operador resta, para una imagen y una constante |
ImgBMP& operator * (int A); | Sobrecarga de operador multiplicación, para una imagen y una constante |
ImgBMP& operator = (const ImgBMP &Img); | Sobrecarga de operador igual |
int MinNeigborP(int x, int y, Graphics::TBitmap *Im); | Obtiene el mínimo valor de los vecinos en orden video |
int MinNeigborN(int x, int y, Graphics::TBitmap *Im); | Obtiene el mínimo valor de los vecinos en orden video inverso |
int MaxNeigborP(int x, int y, Graphics::TBitmap *Im); | Obtiene el máximo valor de los vecinos en orden video |
int MaxNeigborN(int x, int y, Graphics::TBitmap *Im); | Obtiene el máximo valor de los vecinos en orden video inverso |
Conteo
Para realizar el conteo de partículas se debe tratar la imagen y obtener parámetros que puedan ser contados con el método de conteo de partículas. Para realizar este tratamiento se realizaron diferentes pruebas paso a paso para lograr un mejor resultado.
El primer paso es convertir a escala de grises la imagen mediante un promedio ponderado entre los tres canales Rojo Azul y Verde que es igual a la intensidad de la imagen en espacio color: Color = R*0.213 + G*0.715 + B*0.072, la figura 1 muestra el resultado.
[pic 2] [pic 3]
Figura 1. Conversión a escala de grises.
Para hacer evidente los bordes no basta con hacer una moralización de la imagen, se realizaron varias pruebas para lograr mejorar la extracción de los bordes de los granos. El mejor resultado se logro haciendo el tophat de la imagen: una cerradura de tamaño 2 menos la imagen original, resultando en la imagen de la figura 2, la implementación en C++ se hizo mediante las siguientes funciones:
Im1.Closing(2);
Im1-Im2;
[pic 4]
Figura 2. Top-Hat con elemento estructural 5x5
...