2008-11-24 3 views
1

Une image de CT cancéreuse est stockée à l'intérieur d'un réseau court non signé (unidimensionnel). J'ai les informations de localisation de la région cancéreuse à l'intérieur de l'image, mais les coordonnées (x, y) sont en superpixel (128x128 non signé court). Ma tâche est de mettre en évidence cette région.Traitement d'image: solution intelligente pour convertir les coordonnées superixel (128x128 pixels) nécessaires

J'ai déjà résolu celui-ci en convertissant des coordonnées de superpixel en un décalage que peut utiliser le tableau court non signé. Cela fonctionne bien mais je me demande s'il existe une façon plus intelligente de résoudre ce problème, car ma solution nécessite 3 boucles for-imbriquées.

Est-il possible d'accéder au tableau ushort "superpixelwise", donc je peux naviguer dans le tableau ushort en superpixels.

Je sais que cela ne fonctionne pas. Pour vous donner une idée de ce que je pensais:

typedef struct 
{ 
    unsigned short[128x128] 
} 
spix; 

spix *spixptr; 

unsigned short * bufptr = img->getBuf(); 

spixptr = bufptr; 

Mise à jour 1:

Yep sa vague, je vais essayer à nouveau avec une image:

[0][1][2] ... [127]| ... [x] | 
[1]    |   | 
[2]    |   | 
.     |   | 
.     | <-- this is a superpixel 
.     |   | 
[127]    |   | 
--------------------   | 
.       | 
.       | 
.       | 
[y]       |<--whole picture stored in a ushort* buf = new ushort[x*y] 
------------------------------ 

J'aime accéder le 128x128 ushorts à la fois avec un pointeur, donc je peux memcpy données dans le champ 128x128.

Mise à jour 2:

L'indice de transfert de bitblit beaucoup aidé.

+0

Spécifier la langue (C++ je suppose) dans les balises pourrait vous aider ... – PhiLho

+0

question est un peu vague pour dire le moins, je vous suggère de poster votre code de travail avec 3 pour les boucles, quelqu'un sera sans doute en mesure d'améliorer le code, ou vous dire qu'il ne peut pas être amélioré ... – Pieter

Répondre

0

D'après ce que je comprends que vous avez:

  • Une grande image est un scanner
  • Une zone rectangulaire dans cette image qui est un cancer

Ensuite, il devient un peu plus difficile comprendre. Je crois que vous voulez créer une sorte de classe afin que vous puissiez accéder efficacement à 128x128 blocs de l'image comme s'il s'agissait d'un seul pixel. Donc, si l'image était de 1024x1024 pixels, vous souhaiterez pouvoir y accéder sous la forme d'une grille 8x8 de blocs de 128x128 pixels. Maintenant, si c'est le cas, vous avez besoin de créer une classe qui représente l'un de ces blocs 128x128. Cette classe doit référencer l'image, de sorte que vous ne copiez pas les données d'image, et devrait contenir toutes les opérations que vous voudriez faire sur ce "superpixel".

Cependant, si tout ce que vous voulez faire est de pouvoir extraire un bloc particulier de 128x128 de l'image plus grande, alors vous avez besoin de l'algorithme bit blit.Le bit block transfer (généralement appelé juste blit) vous permettra de copier le bit de données sélectionné de l'image plus grande à un plus petit. L'algorithme peut également être adapté pour faire presque tout ce que vous voulez à une zone particulière dans l'image plus grande.

Si un blit est tout ce dont vous avez besoin alors chaque API graphique relativement moderne devrait avoir des fonctions blit (s).

1

Ceci est difficile à répondre, car il est plutôt vague.

Si vous ne dire « comment puis-je accéder à un pixel à (x, y) étant donné cette définition d'une image », la réponse ne devrait pas être très surprenant:

typedef struct 
{ 
    unsigned short data[128 * 128]; // This was broken in the question. 
} spix; 


void spix_set_pixel(spix *s, unsigned int x, unsigned int y, unsigned short value) 
{ 
    s->data[y * 128 + x] = value; 
} 

Je ne sais pas du tout si cela répond à votre question, mais cela semble ... plausible, au moins.

Questions connexes