Saftis Skrevet 23. april 2005 Del Skrevet 23. april 2005 Hei Jeg har thresholdet et bilde, og skal klassifisere sammenhengende piksler inn i regioner med felles identifikator. Kanskje jeg er litt trøtt, men jeg klarer ikke å se for meg noen andre måter å gjøre det på, på denne måten får jeg stack overflow ved bilder over ca. 200x200, jeg skal analysere ett på ca. 900x500. Noen tips til andre angrepsmåter for å unngå så mange rekursive kall ? /* Searches from top-left in a B/W image for the first pixel not yet assigned to a region, and then completes that region. */ void findRegion(imageRGB *outImg) { int width,height,w,h,color; width = (*outImg).width; height = (*outImg).height; //Padding for (w=0;w<width;w++) { for (color=0;color<3;color++) { (*outImg).data[3*(w)+color]=0; (*outImg).data[3*(w+((height-1)*width))+color]=0; } } //Padding for (h=0;h<height;h++) { for (color=0;color<3;color++) { (*outImg).data[3*(h*width)+color]=0; (*outImg).data[3*(width-1 + h*width)+color]=0; } } for (w=1;w<width;w++) { for (h=1;h<height;h++) { //255 -> pixel not yet assigned a region. if ((*outImg).data[3*(w+h*width)+1]==255) { fourConnect(outImg,w,h,regionCount); regionCount=regionCount+1; } } } } /* Using G-component of RGB pixel as region number. 255 means it has not yet been assigned a number. Uses 4-connectedness */ void fourConnect(imageRGB *img,int posX, int posY,int region) { (*img).data[3*(posX+posY*(*img).width)+1]= region % 255; if (posX > 0 && posY >0 && posX <(*img).width-1 && posY<(*img).height-1) { if ((*img).data[3*(posX-1+posY*(*img).width)+1] == 255) { fourConnect(img,posX-1,posY,region); } if ((*img).data[3*(posX+1+posY*(*img).width)+1] == 255) { fourConnect(img,posX+1,posY,region); } if ((*img).data[3*(posX+(posY-1)*(*img).width)+1] == 255) { fourConnect(img,posX,posY-1,region); } if ((*img).data[3*(posX+(posY+1)*(*img).width)+1] == 255) { fourConnect(img,posX,posY+1,region); } } } Lenke til kommentar
hishadow Skrevet 23. april 2005 Del Skrevet 23. april 2005 (endret) Hei Jeg har thresholdet et bilde, og skal klassifisere sammenhengende piksler inn i regioner med felles identifikator. Kanskje jeg er litt trøtt, men jeg klarer ikke å se for meg noen andre måter å gjøre det på, på denne måten får jeg stack overflow ved bilder over ca. 200x200, jeg skal analysere ett på ca. 900x500. Noen tips til andre angrepsmåter for å unngå så mange rekursive kall ? Tror kanskje din void fourConnect(...) løper amok. Den har jo ingen måte å kunne avslutte på, fordi den kommer "hoppende" tilbake til de pixelene den prøver å undersøker. Edit: Kanskje lagd et nytt buffer i tillegg og fylt opp dette for hver pixel sin 4-naboskap. Da slipper du rekursjon. Endret 23. april 2005 av hishadow Lenke til kommentar
Saftis Skrevet 24. april 2005 Forfatter Del Skrevet 24. april 2005 Hei Jeg har thresholdet et bilde, og skal klassifisere sammenhengende piksler inn i regioner med felles identifikator. Kanskje jeg er litt trøtt, men jeg klarer ikke å se for meg noen andre måter å gjøre det på, på denne måten får jeg stack overflow ved bilder over ca. 200x200, jeg skal analysere ett på ca. 900x500. Noen tips til andre angrepsmåter for å unngå så mange rekursive kall ? Tror kanskje din void fourConnect(...) løper amok. Den har jo ingen måte å kunne avslutte på, fordi den kommer "hoppende" tilbake til de pixelene den prøver å undersøker. Edit: Kanskje lagd et nytt buffer i tillegg og fylt opp dette for hver pixel sin 4-naboskap. Da slipper du rekursjon. Heisann. Neida, gitt nok plass til stacken terminerer den, men det blir for mange rekursive kall på store datamengder. Fant ut at jeg i bunn og grunn laget en flood fill-algoritme (slike som brukes i tegneprogram), så jeg fant et par som var effektive nok for store datamengder. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå