Autor Beitrag
penthesilea
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: 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 ;)

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Phantom1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: Mi 27.07.05 19:13 
user profile iconpenthesilea 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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:

_________________
We are, we were and will not be.
penthesilea Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 28.07.05 09:35 
Hab hier mal ein Stück Quellcode ausgegraben, was ein 24bit-Bitmap auf ein Schwarz-Weiss-Bild runterrechnet:

ausblenden volle Höhe 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:
// Ist der Piexel eher Schwarz, oder eher weiss?
function GetClosestColor(b,g,r:integer):integer;
begin
    if ((b+g+r) DIV 3) > 128 then result := 255
    else result := 0;
end;

//Ändert die Farbwerte eines Pixels 
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
        // eine Bldzeile einlesen
        Zeile1 := aBitmap.Scanline[y];
        // wenn noch eine Weitere vorhanden, dann noch eine einlesen
        if y<aBitmap.Height-1 then
            zeile2:=aBitmap.Scanline[y+1];
        for x := 0 to aBitmap.Width -1 do
        begin
            // neue Farbe des aktuellen Pixels bestimmen
            closestcolor:=getClosestColor(Zeile1[3*x],Zeile1[3*x+1],Zeile1[3*x+2]);
            // Fehler berechnen
            bdif:=closestcolor-Zeile1[3*x];
            gdif:=closestcolor-Zeile1[3*x+1];
            rdif:=closestcolor-Zeile1[3*x+2];
            // Pixel ändern
            Zeile1[3*x]:=closestcolor;
            Zeile1[3*x+1]:=closestcolor;
            Zeile1[3*x+2]:=closestcolor;
            // Dithering, d.h. der fehler wird auf umgebende Pixel verteilt
            // dabei müssen die Grenzen des Bildes beachtet werden
            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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.