000
01.09.2003, 03:11 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft... (Operator)
|
zu schreiben ist die folgende Funktion
C++: |
void filter(int* picture,int xdim, int ydim);
|
picture ist hierbei ein zeiger auf ein 1D-Array in dem ein schwarz-weiss-bild zeilenweise gespeichert ist. xdim und ydim sind dann die dimensionen des bildes nach dem der filter auf das bild angewendet worden ist, soll in picture das neue gefilterte picture stehen
zum filtern ist zunächst die folgende filterkoeffinzienten zu verwenden
C++: |
int laplacefilter[] ={1,0,1,0,-4,0,1,0,1};
|
dies entspricht dann dieser filtermatrix 1 0 1 0 -4 0 1 0 1
jedes neue Pixel bestimmt sich durch Faltung mit dieser Matrix
sei Pixel(x,y) das Pixel an der Stelle x,y angenommen man will das Pixel an der Stelle x=4 und y=4 errechnen.
das ermittelt sich dann so 1*Pixel(x-1,y-1) + 0*Pixel(x,y-1) + 1*Pixel(x+1,y-1) 1*Pixel(x-1,y ) - 4*Pixel(x,y ) + 1*Pixel(x+1,y ) 1*Pixel(x-1,y+1) + 0*Pixel(x,y-1) + 1*Pixel(x+1,y+1)
die multiplikationen mit den Nullen mögen an dieser stelle nicht viel sinn machen, aber man könnte auch einen anderen Filter verwenden, wo dieser Koeffizient nicht automatisch null sein müsste
Bei Randpixeln sollen die fehlenden einfach mit Pixelwert=0 angenommen bzw weggelassen werden.
Ich bräuchte irgendwie noch ein bisschen Serverkapazität damit ich mal ein bild vor und nach filter hochladen kann. Damit ihr auch selber testen könnt ob eure funktion funzt
nachdem ihr den filter auf das bild angewendet habt müsst ihr die neu ermittelten werte noch auf werte zwischen 0 und 255 transformieren, damit man diese als Bild abspeichern kann das transformieren sollte auch innerhalb der funktion filter passieren
mit dieser funktion könnt ihr aus einem Bild (das ich dann hoffentlich morgen irgendwo hochladen kann) die daten die ihr verarbeiten müsst extrahieren
C++: |
int* bmp2raw(char* bmp_filename){ FILE *fp=fopen(bmp_filename,"rb"); int *raw_data; int xdim,ydim,i,j;
fseek(fp,10,SEEK_CUR); j=fgetc(fp); j+=fgetc(fp)*256; j+=fgetc(fp)*256*256; j+=fgetc(fp)*256*256*256; fseek(fp,4,SEEK_CUR); xdim=fgetc(fp); xdim+=fgetc(fp)*256; xdim+=fgetc(fp)*256*256; xdim+=fgetc(fp)*256*256*256; ydim=fgetc(fp); ydim+=fgetc(fp)*256; ydim+=fgetc(fp)*256*256; ydim+=fgetc(fp)*256*256*256; raw_data= new int[xdim*ydim]; fseek(fp,j-26,SEEK_CUR); for(j=ydim-1;j>=0;j--){ for(i=0;i<xdim;i++){ raw_data[i+j*xdim]=fgetc(fp); } } fclose(fp); return raw_data; }
|
hiermit erstellt ihr wieder ein neues Bitmap nachdem ihr den Filter auf das Bild angewendet habt.
C++: |
void raw2bmp(int* raw_data,char* bmp_filename, int xdim, int ydim){ FILE *fp; int i,j; fp=fopen(bmp_filename,"wb"); i=xdim*ydim + 4*256 + 54; //Dateilaenge ermitteln
//Datei-Header schreiben
fputc(66,fp);fputc(77,fp); //Magic Number j=i%256; fputc(j,fp); //Dateilaenge j=(i%(256*256))/256; fputc(j,fp); j=(i%(256*256*256))/(256*256); fputc(j,fp); j=i/(256*256*256); fputc(j,fp);
fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);//4 reservierte Byts fputc(54,fp);fputc(4,fp);fputc(0,fp);fputc(0,fp);//Zeiger auf Datenanfang
//Format-Header schreiben fputc(40,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);//Format-Header-Laenge j=xdim%256; fputc(j,fp); //Bildbreite j=(xdim%(256*256))/256; fputc(j,fp); j=(xdim%(256*256*256))/(256*256); fputc(j,fp); j=xdim/(256*256*256); fputc(j,fp);
j=ydim%256; fputc(j,fp); //Bildhoehe j=(ydim%(256*256))/256; fputc(j,fp); j=(ydim%(256*256*256))/(256*256); fputc(j,fp); j=ydim/(256*256*256); fputc(j,fp); fputc(1,fp);fputc(0,fp); //Anzahl der Ebenen
fputc(8,fp);fputc(0,fp); //Bits pro Pixel
fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp); //Kompression i=xdim*ydim; j=i%256; fputc(j,fp); //Groesse der Pixeldaten j=(i%(256*256))/256; fputc(j,fp); j=(i%(256*256*256))/(256*256); fputc(j,fp); j=i/(256*256*256); fputc(j,fp);
fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp); //x-Auflösung(in Pixel pro Meter) fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp); //y-Auflösung(in Pixel pro Meter)
fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp); //Anzahl genutzter Farben fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp); //Anzahl wichtiger Farben
for(i=0;i<256;i++){fputc(i,fp);fputc(i,fp);fputc(i,fp);fputc(0,fp);} for(j=ydim-1;j>=0;j--){ for(i=0;i<xdim;i++){ fputc(raw_data[i+j*xdim],fp); } } fclose(fp); }
|
falls das mit dem hochladen nicht klappen sollte kann ich denen die mitspielen wollen auch die bilder mailen.
Das hauptprogramm sieht dann in etwa so aus
C++: |
int main(){ int xdim,ydim; xdim=...; ydim=...; int *pic=bmp2raw("test.bmp"); filter(pic,xdim,ydim); //hier ist der aufruf der von euch zu schreibenden funktion raw2bmp(pic,"filterpic.bmp",xdim,ydim);
|
So ich hoffe das Rätsel ist diesmal gut. Hab länger dran gesessen als ich geplant hatt Viel Spass -- ...fleißig wie zwei Weißbrote Dieser Post wurde am 01.09.2003 um 03:15 Uhr von Windalf editiert. |