Autor |
Beitrag |
penthesilea
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 27.07.05 14:40
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
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Mi 27.07.05 16:10
Hallo und  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 
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
Phantom1
      
Beiträge: 390
|
Verfasst: 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 390
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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 
_________________ We are, we were and will not be.
|
|
penthesilea 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 28.07.05 09:35
Hab hier mal ein Stück Quellcode ausgegraben, was ein 24bit-Bitmap auf ein Schwarz-Weiss-Bild runterrechnet:
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!
_________________ We are, we were and will not be.
|
|
penthesilea 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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.
|
|
|