2012-07-14 1 views
0

Je suis à la recherche d'aide pour trouver comment supprimer un bruit de pixel de faible qualité d'une vidéo, que j'obtiens à partir d'un kinect xbox via des cadres ouverts. Je cours la logique contre le "déplacement" des parties d'une image, pour déterminer quelle couleur bouge le plus, et utilise ces régions pour détecter également la profondeur de laquelle ces pixels bougent. Je joins une photo pour essayer de mieux expliquer mon problème.Comment puis-je supprimer le bruit de pixel de la vidéo ofxKinect?

http://imago.bryanmoyles.com/xxw80

Bien sûr, je sais que le code sera demandé, donc je vais poster ce que j'ai à ce jour, mais ce que je suis à la recherche de plus que toute autre chose, est un bon algorithme de lissage pixélisée régions dans une photo en utilisant C++

for(int y = 0; y < kinect.height; y += grid_size) { 
    for(int x = 0; x < kinect.width * 3; x += 3 * grid_size) { 
     unsigned int total_r = 0, total_b = 0, total_g = 0; 

     for(int r = 0; r < grid_size; r++) { 
      for(int c = 0; c < grid_size; c++) { 
       total_r += color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 0)]; 
       total_b += color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 1)]; 
       total_g += color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 2)]; 
      } 
     } 

     unsigned char average_r = total_r/(grid_size * grid_size), 
      average_b = total_b/(grid_size * grid_size), 
      average_g = total_g/(grid_size * grid_size); 

     for(int r = 0; r < grid_size; r++) { 
      for(int c = 0; c < grid_size; c++) { 
       color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 0)] = average_r; 
       color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 1)] = average_b; 
       color_pixels[(y * kinect.width * 3 + r * kinect.width * 3) + (c * 3 + x + 2)] = average_g; 
      } 
     } 
    } 
} 

for(int y = 0; y < kinect.height; y++) { 
    for (int x = 0; x < kinect.width * 3; x += 3) { 
     int total_difference = abs(color_pixels[y * kinect.width * 3 + x + 0] - rgb[0]) 
      + abs(color_pixels[y * kinect.width * 3 + x + 1] - rgb[1]) 
      + abs(color_pixels[y * kinect.width * 3 + x + 2] - rgb[2]); 

     unsigned char defined_color; 

     if(total_difference < 40) { 
      defined_color = (unsigned char) 255; 
     } else { 
      defined_color = (unsigned char) 0; 
     } 

     color_pixels[y * kinect.width * 3 + x + 0] = defined_color; 
     color_pixels[y * kinect.width * 3 + x + 1] = defined_color; 
     color_pixels[y * kinect.width * 3 + x + 2] = defined_color; 
    } 
} 

Encore une fois, je voudrais réitérer que mon code n'est pas le problème, je signale simplement ici pour que vous compreniez que je ne demande pas seulement à l'aveuglette. Ce dont j'ai vraiment besoin, c'est une certaine direction sur la façon de lisser les images pixélisées, de sorte que mes moyennes ne soient pas gâchées image par image par mauvaise qualité.

Répondre

1

Vous pouvez traiter votre image à partir de l'appareil photo avec certaines méthodes de l'addon ofxOpenCV. Là, vous aurez des méthodes comme le flou, undistort, érode, etc. Il est facile à configurer, car il est déjà un addon. Jetez un coup d'oeil à l'openCvExample qui devrait être emballé avec votre openFrameworks. Pour plus d'informations sur les méthodes mentionnées, jetez un oeil here. Si je comprends bien votre problème, un petit flou sur l'image pourrait déjà résoudre votre problème.