Aus Datei lesen
-
Hey,
ich hab einmal meine Deklaration gepostet und den wichtigen Teil.
Das Gegenteil von fread ist natürlich fwrite xD.int main () { FILE * pFile; long lSize,x; char * buffer; size_t result; int n=0,y,z,v=0,i; short c; short suchwerte[2] = {0x7FE0,0x0010}; short *bild; FILE *output; int *b; int ch; bild = (short *)buffer; for(i=0; i < (lSize / sizeof(short)-1); i++) if ((bild[i] == suchwerte[0]) && (bild[i+1] == suchwerte[1]) ) break; i+=(4/sizeof(short)); printf("%d\n",i); printf("%d",lSize); for(x=0;x<512*512;x++)// Hier rennt x durch das bild als zähl variable { short pixel; pixel = bild[x] - 1024; if( pixel<-900|| pixel>250)// dann wird hier geguckt ob das Pixel raus muss, wenn ja wird in bild das Pixel gespeichert undzwar so das die informationen stimmen also +1024 da ich vorher ja -1024 gerechnet hab xD { bild[x] = pixel+1024;// pixel ist dann 0 } bild[x] = pixel+1024;// wenn das nicht in die if anweisung geht dann wird das pixel einfach so gespeichert ohne veränderung } fwrite (buffer , 1 , sizeof(buffer) , output); //bei fwirte ist mir noch nicht ganz klar was die 1 bedeutet size_t size soll da rein, size_t ist soweit ich das verstanden habe doch eine funktion die mir die größe anzeigt. aber die größe ist doch schort oder irre ich mich da
Das Bild ist nun auch wieder größer, nur öffnen kann ichs nicht xD
Es kommt aber kein Fehler mehr.lg Zermy
-
Zermy schrieb:
Habt ihr evtl. gute Vorschläge für GUTE Bücher?
http://www.c-plusplus.net/forum/p2195649#2195649
Zermy schrieb:
C von A bis Z ist ganz nett hat aber nur die einfachen Beispiele, werde das aber trotzdem weiter lesen.
Damit schadest du dir, weil vieles/die überwiegende Mehrzahl der 'Erklärungen' und der Beispielcodes falsch sind. Du wirst mit dem dort vermitteltem Pfusch-Wissen später viel Ärger haben und mühsam vieles nochmal neu (richtig) lernen müssen.
http://www.c-plusplus.net/forum/272350-full
-
Zermy schrieb:
bild[x] = pixel+1024;// pixel ist dann 0
Nein. Überleg mal was rauskommt, wenn pixel z.B 1000 ist
Zermy schrieb:
fwrite (buffer , 1 , sizeof(buffer) , output);
Sind die gleichen Parameter wie bei fread.
sizeof(buffer) gibt die die Größe der Zeigervariablen an ist z.Zt. meist 4 oder 8.Die 1 gibt die Elemntgröße an.
Wenn du z.B 500 int lesen willst schreibst dufread(buffer,sizeof(int),500,file);
Aber: DU kennst deine Filegröße in Byte bereits.
-
Hey,
stimmt das war ne gute Erklärung.Danke!
Das mit dem pixel hab ich nicht richtig überlegt.
pixel = bild[i] + 1024; müsste das dann einfach sein denn damit mache ich doch pixel = bild[i] - 1024; rückgänig...lSize ist meine größe vom file
fwrite (buffer , 1 , lSize , output);ich kann nun das bild auch wieder öffnen nur an der Filterung muss ich noch arbeiten
-
Schau doch mal am Kommentar hinter der Zuweisung, welche Zeile ich genommen habe:
bild[x] = pixel+1024;// pixel ist dann 0
Tipp: Das ist nicht die Zeile zum Rückgängig machen.
-
Arg ok, Denkfehler...
-
Du willst doch die Punkte <-900 und > 250 löschen.
Bis jetzt hast du immerpixel = 0 geschrieben
Rechne doch mal per Hand durch
Fang in Zeile 29 an für
a: bild[i] = 0
b: bild[i] = 1024
c: bild[i] = 2000Was steht dann jeweils in Zeile 39 in bild[i] und pixel ? Passt das zu deinen Vorgaben?
-
Ne passt nicht zu meinen Vorgaben.Ich soll die ja auch 0 oder 1 setzen... laut meiner Rechnung kommt das aber nicht hin.
Ich will ja die Punkte löschen und nicht die Werte verändern...
Ich muss den Wert im Datensatz auf 0 setzen aber ich will immer den Wert des Pixels auf 0 setzen...
aber irgendwie komme ich grade nicht weiter.
Mit pixel=bild[i]- 1024
setze ich ja den CT Wert des pixels, so das ich filtern kann.
Und in bild[i] steht sonst 0-4095.Aber wie mach ich das jetzt, dass ich den Datensatz auf 0 bzw. 1 setze und nicht den CT-Wert des Bildpunktes?
Ich hab jetzt pixel=-1024 gesetzt und das entspricht ja 0
Ich hab nun auch ein Bild welches ohne helle stellen ist also der Knochen ist weg. Aber das Gehirngeweben sieht nur so aus als wenn dort der Kontrast hochgestellt wurde.
lg Zermy
-
Hey,
Nun habe ich ein Resultat, welches mir ein gefiltertes Bild ausgibt. Ich habe das Programm noch so erweitert, dass man nun den Namen der Datei eingeben kann und der Pfad nicht mehr fest ist.
Vielen Dank nochmal für eure Hilfe und Unterstützung!!!
Ich kümmere mich jetzt erstmal ums Rauschen und dann um den Zoom
Evtl. hört ihr dann nochmal von mirIch werde aufjedenfall dabei bleiben und c programmieren!
for(x=0;x<512*512;x++) { short pixel; pixel = bild[i] - 1024; if((pixel<-900)||( pixel>250)) { pixel=-1024; bild[i]=pixel +1024; } i++; }
LG Zermy
-
Hey,
Ich bins nochmal... jetzt geht es darum aus dem gleichen Programm nur anderes Bild, die Pixel zu vergleichen um einen Glättungseffekt zu erzielen.
Das komplette Bild ist ja bereits im Speicher und das bild[i] steht am Anfang des zu lesenden Bereiches.
Die Frage ist nun nur ob ich das Bild in eine Matrix einlesen muss oder ob ich dies in dem Speicher lassen kann.
Ich verstehe noch nicht wie ich alle umliegenden Pixel erreichen soll, wenns im Speicher bleiben soll.
Wenn ich das pixel i hab dann muss ich ja nur um rechts und links das pixel davon zu erreichen, i+1 bzw. i-1 rechnen. Aber wie soll ich die dadrüber erreichen? Ich meine im Speicher wird dies doch auch in Zeilen und Spalten gespeichert also müsste man doch mit i+512 das pixel unter i erreichen oder sehe ich das falsch?
bild = (short *)buffer; for(i=0; i < (lSize / sizeof(short)-1); i++) if ((bild[i] == suchwerte[0]) && (bild[i+1] == suchwerte[1]) ) break; i+=(4/sizeof(short)); printf("%d\n",i); printf("%d",lSize); for() { short pixel; short pixelnachbar; pixel = bild[i] - 1024; bild[i-1] bild[i+1] }
Im der nächsten Aufgabe soll dann ein Zoom erzeugt werden. Nicht mehr 512x512 sonder 256x256. Da müsste ich ja dann die umliegenden Pixel mit dem wert von einem Pixel bestücken.
Aber nun erstmal zu der Aufgabe 2
lg Zermy
-
Zermy schrieb:
Das komplette Bild ist ja bereits im Speicher und das bild[i] steht am Anfang des zu lesenden Bereiches.
Die Frage ist nun nur ob ich das Bild in eine Matrix einlesen muss oder ob ich dies in dem Speicher lassen kann.Kann so bleiben.
Und wenn du nochbild = bild+i; i = 0;
einfügst ist die ganze Sache evtl ein bisschen leichter handhabbar. Dann fängt der Bildindex immer wieder bei 0 an.
Dann brauchst du das i nicht mehr und kannst andere Zählvariablen nehmen.Zermy schrieb:
Wenn ich das pixel i hab dann muss ich ja nur um rechts und links das pixel davon zu erreichen, i+1 bzw. i-1 rechnen. Aber wie soll ich die dadrüber erreichen? Ich meine im Speicher wird dies doch auch in Zeilen und Spalten gespeichert also müsste man doch mit i+512 das pixel unter i erreichen oder sehe ich das falsch?
Ist richtig. Du musst nur an den Rändern aufpassen.
bild = (short *)buffer; for(i=0; i < (lSize / sizeof(short)-1); i++) if ((bild[i] == suchwerte[0]) && (bild[i+1] == suchwerte[1]) ) break; i+=(4/sizeof(short)); printf("%d\n",i); printf("%d",lSize); bild = bild+i; i = 0; // <-- Hier eingefügt, dann sind ab bild nur Bilddaten for() { short pixel; short pixelnachbar; pixel = bild[i] - 1024; bild[i-1] bild[i+1] }
-
Hey,
danke für die schnelle Antwort DirkB!
Das Randproblem wollte ich lösen indem ich
for(x=1;x<511*511;x++)
Dann läuft er ja nicht bis zum Rand.
Aber mit dem durchgehen und vergleichen ist mir nicht ganz klar.
Ich brauche ja erstmal eine neue Variable in der ich short Werte ablegen kann.
short mittel;
in der for-Schleife muss ich ja nun
bild = bild+i; i = 0; // bild nur Bilddaten for(x=1;x<511*511;x++) // Randproblem gelöst { short pixel; pixel = bild[i] - 1024; pixel1=(bild[i]+bild[i-511]+bild[i+511]); i++; pixel2=(bild[i]+bild[i-511]+bild[i+511]); i++; pixel3=(bild[i]+bild[i-511]+bild[i+511]); mittel=(pixel1+pixel2+pixel3)/9; bild[i]=mittel+1024; }
Ich mache aber irgendwie ein Denkfehler ich hab ja sozusagen.
pixel1 pixel2 pixel3
pixel1 pixel2 pixel3
pixel1 pixel2 pixel2Addiere die dann und errechen mein mittel und schreib dann den Wert in Bild. Nehme mittel dann noch +1024 und dann sollte das doch gehen
?
Bekomme aber ein Speicher Fehler...
lg Zermy
-
Das
for(x=1;x<511*511;x++)
wird nicht funktionieren, da du so nur die letzten Punkte nicht hast.
Du musst zwei Schleifen verschachteln.Aus Zeile y und Spalte x berechnest du dann
i = y * 512 + x;
Überleg mal:
pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9
Du willst pixel3 bearbeiten, dann ist pixel1 eine Zeile Weiniger und 1 Spalte mehr.
-
DirkB schrieb:
Du musst zwei Schleifen verschachteln.
Aus Zeile y und Spalte x berechnest du dann
i = y * 512 + x;
Klingt spannend!
DirkB schrieb:
Überleg mal:
pixel1 pixel2 pixel3 pixel4 pixel5 pixel6 pixel7 pixel8 pixel9
Du willst pixel3 bearbeiten, dann ist pixel1 eine Zeile Weiniger und 1 Spalte mehr.
In deinem Beispiel will ich doch pixel5 nehmen und mit den umliegenden vergleichen und allen den wert von pixel5 geben.
Vll. war glätten nicht richtig. Das Bild ist "verschwommen" und soll danach etwas klarer sein.
lg Zermy
-
So csollte es heißen:
Du willst pixel5 bearbeiten, dann ist pixel3 eine Zeile Weiniger und 1 Spalte mehr.Du willst schärfen. Dann musst du die einzelnen Pixel anders bewerten (malnehmen).
Sharpen ist-1 -1 -1 -1 9 -1 -1 -1 -1
Und als Divisor 1.0
Du kannst mit den Werten auch spielen
-1 -1 -1 -1 17 -1 -1 -1 -1
Und als Divisor 9.0
Du solltest darauf achten, dass als Ergebnis 1.0 heraus
Oberes Beispiel 8 *-1 + 9 = 1.0 / 1.0 = 1.0
Unteres Beispiel 8 *-1 + 17 = 9.0 / 9.0 = 1.0PS Dein Beispiel war
1 1 1 1 1 1 1 1 1
Und als Divisor 9.0
-
Hmm,
ich versuche grade dein Beispiel umzusetzen und les nochmal die Aufgabe durch. Ganz komme ich damit noch nicht klar.
die Aufgabe lautet:
Hier soll das Rauschen durch Mittelung eines Bildpunktes mit seinen
8 Nachbarpunkten vermindert werden.
Leider ist etwas verrauscht und
muss mit einem Glättungslter überarbeitet werden.Wenn das Ergebnis 1 wäre dann würde ich doch die Farbe des Pixels verändern oder?
lg Zermy
-
Du verrechnest doch die Helligkeitswerte der (acht) Nachbarpixel mit dem mittleren Pixel.
Wenn du die einfach addierst, wird der Punkt heller.
Darum teilst du die Summe der Helligkeitswerte durch die Summe der Gewichtung.Je nachdem wie du sie verrechnest, ändert sich das Filter.
Wenn du sie abziehst (* -1) und den mittleren überhöhst (*9) schärfst du das Bild.Wenn du die Parameter in einem 2D-Feld angibst, kannst du ganz einfach das Verhalten von dem Filter ändern, indem du das Feld änderst.
Schau mal da: http://tavmjong.free.fr/INKSCAPE/MANUAL/html/Filters-Pixel.html oder http://lodev.org/cgtutor/filtering.html
-
Ok, du hast vollkommen recht!!!
Ich versteh nur noch nicht ganz wie ich das mit dem sharpen machen muss. Will den Code ja auch verstehen.
Bei mir hakt es aber bei dem Coden...
Ich hab doch im Speicher keine x und y achse oder?
Ich weiß irgendwie nicht wie ich loslegen soll, ich brauche 2 for schleifen eine für x und eine für y.
Aber es soll ja nicht am Rand gestartet werden, sondern es sollen viele Pixel ausgelassen werden. Dann muss ja nach dem ausgelassenem Pixel 1 Spalte frei bleiben und dann 2 Spalten weiter springen... da ja die meisten pixel nur verglichen werden. Das gleiche dann für die Zeilen..
lg Zermy
-
Bildbreite = 512 Bildhoehe = 512 Schleife über y (1 bis < Bildhoehe-1) // 1 bis 510 Schleife über x (1 bis < Bildbreite-1) Index = y * Bildbreite + x Mache_was_mit bild[Index] ....
Überleg dir noch etwas, damit du nicht mit geänderten Daten rechnest.
Wenn du die 3. Zeile bearbeitest, stehen in der 2. schon manipulierte Werte.
-
Vielen Dank, für deine Hilfe!
ich werd mich gleich dran machen.
lg Zermy