Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/01/2013, 15:12
morisco_17
 
Fecha de Ingreso: mayo-2012
Mensajes: 19
Antigüedad: 12 años
Puntos: 1
ejercicio de c++ con arrays

Hola muy buenas, tengo un problema con el siguiente ejercicio:

Una laboratorio de investigación celular necesita desarrollar un software para la detección de
células madre no embrionarias procedentes de cultivos celulares en placas de Petri. Para ello, el
laboratorio toma imágenes digitales de las placas con objeto de realizar una detección de las células
obtenidas y determinar su número y sus características. Se dispone de imágenes consideradas como
una matriz bidimensional de píxeles cuyo valor numérico indica la intensidad de la correspondiente
región de la foto (0 indica negro, y 255 indica blanco). Una imagen puede tener hasta 512 filas y
hasta 512 columnas.
Para detectar una célula madre se considerará que:
• Una célula madre ocupa región de 2x2 pixels cuyo promedio de intensidad es igual o mayor
de 240.
• La detección de las células madre en la imagen se realiza comenzando por la esquina
superior izquierda y siguiendo un orden de izquierda a derecha y de arriba hacia abajo.
• Un píxel no puede pertenecer a dos células madre distintas. Es decir, una vez que se ha
marcado un píxel como perteneciente a una célula, ya no se tomará en cuenta para la
detección de otras células.
Se pide implementar un programa en C++ para la detección de células madre en una imagen. Debe
diseñarse la función DetectarCelulas que recibe como argumento una imagen y que se
encarga de mostrar por la pantalla:
• La intensidad promedio y posición de la esquina superior izquierda de cada célula detectada.
• El número total de células detectadas.
• La intensidad promedio de todas las células detectadas.


Debe aparecer por pantalla lo siguiente como resultado de la ejecución del programa:
Célula madre en pos (1,2) con promedio de intensidad 242.50
Célula madre en pos (1,4) con promedio de intensidad 246.25
Célula madre en pos (3,3) con promedio de intensidad 240.00
Célula madre en pos (4,6) con promedio de intensidad 250.00
Célula madre en pos (5,1) con promedio de intensidad 240.00
5 células madre con un promedio de de intensidad 243.75

Yo he dividido el programa en 3 partes:

- El algoritmo principal:

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. // Constante global, que indica el numero maximo de de filas y de columnas que puede tener el array.
  6.  
  7. const int TAM=512;
  8.  
  9. // Se definen dos arrays con un tamaño de fila y de columna de 512 como maximo. Uno tipo float para almacenar los numeros de la celula, y otro tipo
  10. // bool para almecenar si la casilla está o no ya seleccionada por otra celula.
  11.  
  12. typedef float Timagen[TAM][TAM];
  13. typedef bool Tmarcar[TAM][TAM];
  14.  
  15. struct TCelula {
  16.  
  17.     Tmarcar marcel;
  18.     Timagen imacel;
  19. };
  20.  
  21. bool marcarcelula (TCelula &p);
  22. void DetectarCelulas (TCelula &p);
  23.  
  24. int main() {
  25.  
  26.     int ancho, alto, intensidadmaxima;
  27.    
  28.     Timagen imagen;
  29.  
  30.     cout << "Dime el ancho de la imagen: ";
  31.     cin >> ancho;
  32.  
  33.     if (ancho>TAM) {
  34.        
  35.         cout << "El ancho no puede ser mayor a 512. Vuelva a introducir el ancho: ";
  36.         cin >> ancho;
  37.     }
  38.    
  39.     cout << "Dime el alto de la imagen: ";
  40.     cin >> alto;
  41.  
  42.     if (alto>TAM) {
  43.    
  44.         cout << "El alto de la imagen no puede ser mayor de 512. Vuelva a introducir el alto: ";
  45.         cin >> alto;
  46.     }
  47.  
  48.     intensidadmaxima=255;
  49.  
  50.     for (int j=0; j<alto; j++) {
  51.    
  52.         for (int i=0; i<ancho; i++) {
  53.            
  54.             cout << "Introduce el valor del pixel en la posicion (" << j << "," << i << "): " << endl;
  55.             cin >> imagen[j][i];
  56.            
  57.             if (imagen[j][i] > intensidadmaxima) {
  58.            
  59.                 cout << "Introduce el valor del pixel en la posicion (" << j << "," << i << ") dentro del rango: " << endl;
  60.                 cin >> imagen[j][i];
  61.             }
  62.            
  63.         }
  64.     }
  65.     ---Aqui irian luego las llamadas a las funciones.
  66.  
  67.     return 0;
  68. }

- Un subalgoritmo que busca una celula madre 2x2 con una intensidad promedio de 240 y la marca a true o false. Y aqui es donde tengo el problema: que no se como asociar el valor bool al valor de intensidad para poder operar con el.

Código C++:
Ver original
  1. bool marcarcelula (TCelula &p) {
  2.  
  3.     bool marca;
  4.  
  5.     marca=false;
  6.    
  7.     float marcado;
  8.  
  9.     for (int y=0; y<TAM; y++) {
  10.    
  11.         for (int x=0; x<TAM; x++) {
  12.  
  13.             while (p.marcel[y][x] = false) {
  14.                
  15.                 for (int j=0; j<TAM; j++) {
  16.                    
  17.                     for (int i=0; i<TAM; i++) {
  18.  
  19.                         marcado=p.imacel[j][i]+p.imacel[j][i+1]+p.imacel[j+1][i]+p.imacel[j+1][i+1];
  20.    
  21.                         if (marcado>240) {
  22.    
  23.                             p.marcel[y][x] = true;
  24.                             p.marcel[y][x+1] = true;
  25.                             p.marcel[y+1][x] = true;
  26.                             p.marcel[y+1][x+1] =true;
  27.                         }
  28.                     }
  29.                 }
  30.             }
  31.         }
  32.     }
  33.     return marca;
  34. }

- Subalgoritmo detectar celula:

Código C++:
Ver original
  1. void DetectarCelulas (TCelula &p) {
  2.  
  3.  
  4.  
  5.     float intenpro, intentotal, sumaintensidad;
  6.  
  7.     float celdet;
  8.  
  9.     celdet=0;
  10.  
  11.     intentotal=0;
  12.  
  13.     for (int y=0; y<TAM; y++) {
  14.    
  15.         for (int x=0; x<TAM; x++) {
  16.  
  17.             if ((p.marcel[y][x] = true) && (p.marcel[y][x+1] = true) && (p.marcel[y+1][x] = true) && (p.marcel[y+1][x+1] = true)) {
  18.            
  19.                 for (int j=0; j<TAM; j++) {
  20.                    
  21.                     for (int i=0; i<TAM; i++) {
  22.  
  23.    
  24.                         intenpro = ((p.imacel[j][i] + p.imacel[j][i+1] + p.imacel[j+1][i] + p.imacel[j+1][i+1])/4);
  25.                
  26.                         cout << "Celula madre en posicion (" << j << "," << i << ") con promedio de intensidad " << intenpro << endl;
  27.  
  28.                         celdet++;
  29.  
  30.                         sumaintensidad=sumaintensidad+intenpro;
  31.                     }
  32.                 }
  33.             }
  34.         }
  35.     }
  36.  
  37.     intentotal=sumaintensidad/celdet;
  38.  
  39.     cout << "Se han encontrado " << celdet << " celulas madre, con un promedio de intensidad de " << intentotal << endl;
  40. }

Espero que lo hayais entendido, si no es asi decirlo y os lo intentare explicar mejor lo que quiero hacer para ver si me podeis dar una solucion.

Muchas gracias.