2010-05-31 5 views
0

je suis l'itération sur une 3 matrice bidimensionnelle (qui est une image avec 3 valeurs pour chaque pixel) pour appliquer un filtre 3x3 à chaque pixel comme suit:bord de tableau multidimensionnel/conditions de frontière

//For each value on the image  
for (i=0;i<3*width*height;i++){ 
    //For each filter value 
    for (j=0;j<9;j++){ 
     if (notOutsideEdgesCondition){ 
      *(**(outArray)+i)+= *(**(pixelArray)+i-1+(j%3)) * (*(filter+j)); 
     } 
    } 
} 

J'utilise l'arithmétique du pointeur car si j'utilisais la notation de tableau, j'aurais 4 boucles et j'essayerais d'avoir le moins de boucles possible. Mon problème est que mon notOutsideEdgesCondition est hors de portée parce que je dois considérer 8 cas de frontière. J'ai les conditions traitées suivantes

  • colonne de gauche: ((i%width)==0) && (j%3==0)
  • Colonne de droite: ((i-1)%width ==0) && (i>1) && (j%3==2)
  • Upper Row: (i<width) && (j<2)
  • Rangée du bas: (i>(width*height-width)) && (j>5)

et ils doivent encore tenir compte de la 4 cas d'angle qui auront des expressions plus longues. À ce stade, je me suis arrêté et je me suis demandé si c'était la meilleure solution, car si j'ai une évaluation conditionnelle longue de 5 lignes, il sera non seulement vraiment pénible de déboguer, mais cela ralentira la boucle interne. C'est pourquoi je viens à vous demander s'il existe un algorithme connu pour traiter ces cas ou s'il y a une meilleure approche pour mon problème. Merci beaucoup.

Répondre

1

Oui, il y a une façon beaucoup mieux. Ecrire une boucle rapide pour gérer les cas où il est garanti qu'il n'y a pas de problèmes de limites. Cela comprendra la région de la deuxième à l'avant-dernière colonne et la deuxième à l'avant-dernière rangée. Ensuite, vous pouvez écrire quatre routines pour gérer chacun des côtés (ligne 0, colonne 0, ligne N et colonne N) et vous pouvez coder à la main les quatre derniers points. Cela dit, il y a aussi beaucoup de façons plus rapides de faire les calculs d'adressage que vous faites.

+0

I J'essaierai ça, ça prendra plus de code mais j'espère pouvoir le rendre plus simple. Aussi, pouvez-vous me diriger dans la bonne direction pour accélérer les calculs d'adressage? – kirbuchi

+0

J'ai fait un rapide google pour essayer de trouver un tutoriel sur le déroulement de calculs d'adressage de tableau pour vous, mais je n'en ai pas trouvé un. En bref, évitez autant que possible les calculs d'adressage par pixel. Utilisez un pointeur qui s'incrémente de pixel en pixel pendant que vous travaillez et supprimez toutes les opérations de modulo et de multiplication. Pour implémenter l'adressage du noyau 3x3, vous devez conserver 3 pointeurs (un à votre emplacement actuel dans chaque ligne) ou un pointeur et un 'pas' constant (déplacement entre les lignes) ajouté. Utilisez plusieurs boucles pour savoir quand ajouter/soustraire la foulée. Dang. Plus de caractères – swestrup

+0

Ok, maintenant j'ai les 4 valises latérales manipulées et je vais coder manuellement les valises d'angle.L'approche de 3 pointeurs pour le noyau semble la meilleure parce que je peux individuellement désactiver chaque rangée de noyau en traitant des cas de frontière. Dans cet esprit, je peux procéder de la même manière avec le tableau d'images et les séparer plus facilement pour la mise en œuvre ultérieure de CUDA, ce qui est mon objectif ultime. Merci beaucoup. PS: Je vais chercher un livre ou un tutoriel sur les optimisations de déroulement et d'adressage de tableaux. – kirbuchi

0

Un bon conseil est d'ajouter une ligne supplémentaire en haut de la matrice, et une autre à la fin (faites la même chose pour les colonnes). Ces lignes/colonnes supplémentaires ne contiendront aucune information mais elles faciliteront le calcul (pas de cas de bordure).

Au prix de la consommation de la mémoire ...

Juste une idée :)

+0

Je pense que cela ne prendra pas beaucoup plus de mémoire. Je peux essayer – kirbuchi

+0

L'ajout d'une ligne de bordure autour de la matrice fonctionnera, mais implique la copie du tableau, ce qui pourrait ne pas être la méthode la plus efficace (en fonction des stratégies de mise en cache de vos processeurs.) – swestrup

Questions connexes