Foros del Web » Programación para mayores de 30 ;) » C/C++ »

ejercicio de c++ con arrays

Estas en el tema de ejercicio de c++ con arrays en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 10/01/2013, 15:12
 
Fecha de Ingreso: mayo-2012
Mensajes: 19
Antigüedad: 11 años, 11 meses
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.
  #2 (permalink)  
Antiguo 10/01/2013, 16:01
 
Fecha de Ingreso: mayo-2012
Mensajes: 19
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: ejercicio de c++ con arrays

A nadie se le ocurre como puede resolverse el problema?
  #3 (permalink)  
Antiguo 10/01/2013, 22:09
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: ejercicio de c++ con arrays

Mira yo lo haria con dos for para recorrer de izquierda a derecha y de arriba abajo. Este ultimo seria el primero y el otro estaria adentro. Imaginemos que esas son las coordenadas x , y

for( y = 0 ; y < TAMY - 1 ; y ++)
for( x = 0 ; x < TAMX - 1 ; x ++)

Despues tendria una funcion llamada promedio que devuelve el promedio entre cuatro numeros entonces dentro del For haria:

if (promedio(matriz[y][x] , matriz[y+1][x] , matriz[y][ x + 1] , matriz[y+1][x+1] ) >= 240 )

Ahora dentro de ese if usaria una pila o una lista enlazada para almacenar las celulas. O simplemente un array lo suficientemente grande. Utilizaria una structura para manejar la informacion de manera sencilla:

struct celula {
int x , y:
int promedio;
}
struct celula Lcelula[500];

Dentro del if seria algo asi

Lcelula [i].x = x;
Lcelula [i].y = y;
Lcelula [i].promedio = ....
i++;

Al terminar los dos for tenes un array con las celulas y la variable i te dice la cantidad de celulas.

Esa seria mi idea. Espero que algo te sirva. Cualquier duda comenta.

Para evitar el uso repetido de los pixeles simplemente podes multiplicar la intensidad de cada pixel por -1 para que al probar con el pixel nuevamente el promedio de negativo y escape de esa opciones.
Lo bueno de multiplicar por menos uno es que facilmente podes restaurar la matriz original.

Saludos.

PD: Tenes en cuenta que pasaron 50 minutos desde un mensaje tuyo y el siguiente. Tenes que ser mas paciente.
  #4 (permalink)  
Antiguo 11/01/2013, 02:10
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Respuesta: ejercicio de c++ con arrays

Veo que ya te respondieron.

Bueno, sólo me gustaría agregar que usé tu ejercicio (adaptado a mis necesidades) para trabajar con pixeles, te dejo el código por si quieres revisarlo. Requiere que haya una imagen llamada "image.png" en la misma carpeta, y crea una imagen llamada "resultado.png", dónde se resaltan las células madres en blanco y el resto se pone de negro.

Código C++:
Ver original
  1. #include <SFML/Graphics.hpp>
  2.  
  3. #include <string>
  4. using std::string;
  5.  
  6. sf::Image &cargarImagen(const string &filename)
  7. {
  8.     sf::Image img;
  9.     img.LoadFromFile(filename);
  10.     return img;
  11. }
  12.  
  13. void guardarImagen(const sf::Image &imagen, const string &filename)
  14. {
  15.     imagen.SaveToFile(filename);
  16. }
  17.  
  18.  
  19. void procesarImagen(const sf::Image &imagen)
  20. {
  21.     sf::Image resultado;
  22.     sf::Color blanco(255, 255, 255);
  23.     int x = imagen.GetWidth();
  24.     int y = imagen.GetHeight();
  25.     short arreglo[2000][2000] = {0};
  26.  
  27.     resultado.Create(imagen.GetWidth(), imagen.GetHeight(), sf::Color(0, 0, 0, 255));
  28.  
  29.     for(int i = 1; i < x-1; i++)
  30.     {
  31.         for(int j = 1; j < y-1; j++)
  32.         {
  33.             if(arreglo[i][j] == 0 && arreglo[i][j+1] == 0 && arreglo[i+1][j] == 0
  34.                 && arreglo[i+1][j+1] == 0)
  35.             {
  36.                 sf::Color a1 = imagen.GetPixel(i, j);
  37.                 sf::Color a2 = imagen.GetPixel(i, j+1);
  38.                 sf::Color a3 = imagen.GetPixel(i+1, j);
  39.                 sf::Color a4 = imagen.GetPixel(i+1, j+1);
  40.  
  41.                     // saturación de colores,
  42.                     // Negro = 0, 0, 0, por ende,
  43.                     // 240 de tu ejercicio = 15 en pixeles
  44.                     // y 15 * 3 colores * 4 pixeles = 180
  45.                 if((a1.r + a1.g + a1.b + a2.r + a2.g + a2.b +
  46.                     a3.r + a3.g + a3.b + a4.r + a4.g + a4.b <= 180))
  47.  
  48.                 {
  49.                     arreglo[i][j] = arreglo[i][j+1] = arreglo[i+1][j] = arreglo[i+1][j+1] = 1;
  50.                     resultado.SetPixel(i, j, blanco);
  51.                     resultado.SetPixel(i, j+1, blanco);
  52.                     resultado.SetPixel(i+1, j, blanco);
  53.                     resultado.SetPixel(i+1, j+1, blanco);
  54.                 }
  55.             }
  56.         }
  57.     }
  58.  
  59.     resultado.SaveToFile("resultado.png");
  60. }
  61.  
  62. int main()
  63. {
  64.     sf::Image imagen;
  65.  
  66.     imagen.LoadFromFile("image.png");
  67.     procesarImagen(imagen);
  68.     return 0;
  69. }

Etiquetas: arrays, ejercicio, funcion, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:31.