Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Bildfilter

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.09.2003, 08:02 Uhr
Pablo
Supertux
(Operator)


Mann, sieht das interessant aus.

Nun habe ich aber folgende Fragen:
1.

Zitat:

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


Ich verstehe nicht ganz. xdim und ydim sind die Dimensionen vom int* picture. Heißt es, dass void filter(int*, int,int) mit diesen Dimensionen oder sie werden erst später gesetzt? Für mich ist der Satz ein bisschen verwirrend.

2. Ist die Bilddatei ein echtes BMP oder nur ein Array von Zahlen? Ich meine, funktioniert es mit allen BMP Dateien?

3. Was muss genau filter machen?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.09.2003, 11:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zu1)
filter bekommt das bild und die dimensionen übergeben.
Das was ich mit diesem verwirrenden satz meinte ist, das nach ausführen des filters das neue gefilterte Bild in dem Speicher stehen soll, in dem vorher das alte bild stand. Das alte soll also überschrieben werden

zu2)ist ein echtes bmp, funktioniert aber nicht mit allen bmp-dateien (nur sw). Ich weiss noch nicht mal ob das mit allen scharz-weiss-bitmaps funzt. Aber mit den Bitmaps die ich zur verfügung stellen kann funzt es

zu3)
was genau verstehst du nicht? Der Filter faltet das Bild mit der Filtermatrix

zu4) warum bist du so früh wach?
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 01.09.2003 um 11:27 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.09.2003, 11:28 Uhr
Pablo
Supertux
(Operator)


Kannst du vielleicht einige BMPs hochladen oder so, so dass ich sie testen kann?


Bearbeitung:
Weil ich heute ein Paper (PS-Format) für meie Hiwi-Stelle machen muss, und ich ich muss in die Uni fahren. Deshalb bin ich so früh wach!

--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 01.09.2003 um 11:30 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.09.2003, 11:30 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ich weiss leider nicht wohin.vielleicht stellt mir mike nachher sein ftp-server zur verfügung. Ist leider auch keine gute Lösung, weil der nicht immer an ist.

Schick mir ne mail, ich schick dir dann pics
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.09.2003, 11:34 Uhr
Pablo
Supertux
(Operator)


Ich würde dir meinen Server geben. Ich werde heute bis spät in der Nacht online sein. Leider habe ich keinen FTP-Server eingestellt. Man kann aber mit mit ssh sich einloggen. Abe dafür brauchst du mindesstens eine Linux-Konsole (von cygwin)

Ich werde auch wie @beefy machen, denn ich will kein SPAM bekommen.

username: pabloy
hostename: pcpool.mathematik.uni-freiburg.de
at = @
email: username at hostname
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 01.09.2003 um 11:36 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.09.2003, 11:37 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


na dann schieb ich die nachher lieber bei mike drauf, trotzdem danke. Wenn du die jetzt haben willst, musst du halt mailen
Mann kann das im zweifel aber auch ohne Bilder lösen, so schwer ist das rätsel nicht

sind ca 10-15 zeilen quellcode
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 01.09.2003 um 11:37 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.09.2003, 11:41 Uhr
Pablo
Supertux
(Operator)


Du hast eigentlich schon gesagt, wie. Ich muss in 10 Min. wegfahren, deshalb werde ich das Rätsel später lösen.

ich hab dran gedacht. Du sagst:

Zitat:

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)



ich glaube es wäre:
1*Pixel(x-1,y-1) + 0*Pixel(x-1,y) + 1*Pixel(x,y+1)
1*Pixel(x,y -1 ) - 4*Pixel(x,y ) + 1*Pixel(x,y+1)
1*Pixel(x+1,y-1) + 0*Pixel(x+1,y) + 1*Pixel(x+1,y+1)

Eine Matrix sieht so aus:
a11 a12 a13
a21 a22 a23
a31 a32 a33

Lieg ich da falsch?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 01.09.2003 um 11:46 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.09.2003, 11:49 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


BILDER
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.09.2003, 11:51 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


upsi übles fehlerchen ist mir unterlaufen war wohl die uhrzeit
1*Pixel(x-1,y-1) + 0*Pixel(x,y-1) + 1*Pixel(x+1,y-1)
0*Pixel(x-1,y ) - 4*Pixel(x,y ) + 0*Pixel(x+1,y )
1*Pixel(x-1,y+1) + 0*Pixel(x,y-1) + 1*Pixel(x+1,y+1)
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: