Entwickler-Ecke
Multimedia / Grafik - Matrix Manipulation usw.
penthesilea - Mi 27.07.05 14:40
Titel: Matrix Manipulation usw.
Hallo,
da ich neu hier bin möchte ich erstmal alle begrüssen.
Für mein gerade laufendes Praktikum suche ich eine freie Delphi Bibliothek, mit der ich so Bildmanipulationen wie in Matlab machen kann. Also Bild in eine Matrix einlesen, Filter drüberlaufen lassen, Bild abspeichern. Gibts sowas?
Ich google schon den ganzen Tag und finde eigentlich nur kommerzielle Sachen, die einiges an Geld kosten.
Ach ja und falls das in Delphi nicht Bibliothek heisst, möchte ich mich hierfür entschuldigen, bin Delphi Neuling.
Gruß,
penthesilea
maxk - Mi 27.07.05 16:10
Hallo und :welcome: im DF!
Es tut mir Leid, wenn ich dich enttäuschen muss. Aber eine kostenlose, fertige Unit wirst du nicht finden. Und da du gerade erst mit Delphi angefangen hast, wäre es vllt. auch sinnvoller mit etwas leichterem anzufangen. Es hat ja sein Grund, dass die meiste Software etwas kostet....
Gruß,
maxk
PS: Bibliothek ist korrekt, falls du von DLLs sprichst. Ansonsten Units ;)
Phantom1 - Mi 27.07.05 16:35
Also ich kenne jetzt Matlab nicht, aber meinst du mit Matrix eine 2D-Matrix wie man sie in zahlreichen Bildbearbeitungsprogrammen benutzen kann? wenn ja, dann könnte ich dir weiterhelfen.
MfG
Phantom1
penthesilea - Mi 27.07.05 18:51
@maxk: klar wäre es sinnvoller erstmal richtig Delphi zu lernen, nur leider habe ich mir das nicht ausgesucht.
@Phantom1:Habe meine Ansprüche nun ein bisschen gesenkt. Also ich stelle mir das so vor. Ich habe ein Bild auf der Platte und rufe dann eine Funktion auf, die mir ein zweidimensionales Array zurückgibt, indem die Intensitäten des Bildes drin stehen. Den Rest irgendwelche Filter drüberlaufen lassen, kann ich dann auch selber Programmieren. Und dann sollte ich dieses Array wieder in ein Bild umwandeln können und auf Platte speichern.
Phantom1 - Mi 27.07.05 19:13
penthesilea hat folgendes geschrieben: |
@Phantom1:Habe meine Ansprüche nun ein bisschen gesenkt. Also ich stelle mir das so vor. Ich habe ein Bild auf der Platte und rufe dann eine Funktion auf, die mir ein zweidimensionales Array zurückgibt, indem die Intensitäten des Bildes drin stehen. Den Rest irgendwelche Filter drüberlaufen lassen, kann ich dann auch selber Programmieren. Und dann sollte ich dieses Array wieder in ein Bild umwandeln können und auf Platte speichern. |
Was verstehst du genau unter "Intensitäten des Bildes"? Das kann man doch sicher mit irgendeiner Formel berechnen, wo ist da jetzt das Problem?
mfg
Phantom1
Gausi - Mi 27.07.05 19:18
Wenn ich das richtig sehe, dann reichen penthesilea Grauwertbilder. Intensitäten sind dann also unterschiedliche Helligkeiten/Grauwerte.
Einfache Bildmanipulation ist leicht möglich. Ich müsste irgendwo ein Beispiel für "Dithering" mit Delphi rumliegen haben. Da dürfte das Prinzip dran klar werden. Dauert aber n bissel, bis ich das gefunden habe :wink:
penthesilea - Do 28.07.05 08:47
Leider reichen Grauwertbilder, wie ich gerade erfahren habe nicht aus. Aber es reicht dass es für Bitmaps funktioniert
Gausi - Do 28.07.05 09:35
Hab hier mal ein Stück Quellcode ausgegraben, was ein 24bit-Bitmap auf ein Schwarz-Weiss-Bild runterrechnet:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80:
| function GetClosestColor(b,g,r:integer):integer; begin if ((b+g+r) DIV 3) > 128 then result := 255 else result := 0; end;
procedure AddError(var b,g,r:byte; bdif,gdif,rdif:double); var btmp,rtmp,gtmp:integer; begin btmp:=b; gtmp:=g; rtmp:=r;
btmp:=round(b-bdif); if btmp<0 then b:=0 else if btmp>255 then b:=255 else b:=btmp;
gtmp:=round(g-gdif); if gtmp<0 then g:=0 else if gtmp>255 then g:=255 else g:=gtmp;
rtmp:=round(r-rdif); if rtmp<0 then r:=0 else if rtmp>255 then r:=255 else r:=rtmp; end;
procedure Dithering(aBitmap:TBitmap); var Zeile1,Zeile2 : PByteArray; x,y:integer; rdif,gdif,bdif:integer; closestcolor:integer; begin for y:= 0 to aBitmap.Height -1 do begin Zeile1 := aBitmap.Scanline[y]; if y<aBitmap.Height-1 then zeile2:=aBitmap.Scanline[y+1]; for x := 0 to aBitmap.Width -1 do begin closestcolor:=getClosestColor(Zeile1[3*x],Zeile1[3*x+1],Zeile1[3*x+2]); bdif:=closestcolor-Zeile1[3*x]; gdif:=closestcolor-Zeile1[3*x+1]; rdif:=closestcolor-Zeile1[3*x+2]; Zeile1[3*x]:=closestcolor; Zeile1[3*x+1]:=closestcolor; Zeile1[3*x+2]:=closestcolor; if x<aBitmap.Width-1 then AddError( Zeile1[3*x+3],Zeile1[3*x+4],Zeile1[3*x+5], bdif*7/16,gdif*7/16,rdif*7/16); if y<aBitmap.Height-1 then begin AddError( Zeile2[3*x],Zeile2[3*x+1],Zeile2[3*x+2], bdif*5/16,gdif*5/16,rdif*5/16); if x<aBitmap.Width-1 then AddError( Zeile2[3*x+3],Zeile2[3*x+4],Zeile2[3*x+5], bdif*1/16,gdif*1/16,rdif*1/16); if x>0 then AddError( Zeile2[3*x-3],Zeile2[3*x-2],Zeile2[3*x-1], bdif*3/16,gdif*3/16,rdif*3/16); end; end; end; end; |
Evtl. kannst du damit weiterarbeiten. Es wird hier nicht das Bild als ganzes gelesen, sondern das Bild Zeilenweise gelesen und dann Pixelweise mit der Dither-Matrix bearbeitet. Wenn die Filtermaske größer ist, muss man antsprechend mehr Zeilen gleichzeitig einlesen.
Das Ergebnis dieser Routine ist übrigens verblüffend gut!
penthesilea - Do 28.07.05 14:32
Vielen lieben Dank Gausi, so ähnlich werd ich es jetzt auch machen ,nur dass ich mir jedes Pixel einzeln anschauen werde.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!