Autor Beitrag
sann
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 12.01.05 21:38 
Hallo werte Delphi-Freunde!

Ich bin neu hier in diesem Forum, und bin nicht sicher, ob ich ein wahrscheinlich für euch triviales Problem hier äußern darf. Ich muss dazu sagen, dass ich (fast) keine Kenntnisse in Delphi habe. Dafür kann ich ein bisschen C programmieren, was mir leider für mein Problem nicht hilft. Ich schildere mal mein Anliegen.

- ich möchte nacheinander eine Anzahl von ca. 2000 tiff-Bildern (Grauwerte 8bit?) für eine Analyse laden
- von jedem einzelnen Bild brauche ich die Anzahl der Pixel pro Grauwert (das sind wohl 255?) also so eine Art Histogram - ich brauche aber kein Bild!
- ich würde die ermittelten Pixelanzahlen eines jeden Bildes (also immer 255 Werte pro Bild) gerne in ein .dat-file (einfach alles untereinander weg) schreiben, welches ich dann später mit meinem C-Programm auslesen und -werten kann.

Ich vermute, dass das mit Delphi zu programmieren ist, oder? Jetzt meine wichtigste Frage: Da ich keine Erfahrung mit Delphi habe, weiß ich nicht, wie hoch der Aufwand für ein solches Programm wäre. Kann man das abschätzen? Ich sehe im Moment keine andere Möglichkeit für mich, diese automatische Bildanalyse hinzukriegen.

Oder gibt es für ein solches Problem vielleicht sogar eine Art Vorlage. Ich würde das wirklich gerne hinkriegen. Ist das für einen Neuling wie mich denn überhaupt machbar?

Vielen Dank für Euren Rat.
MfG sann
Spaceguide
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 552


(D3/D7/D8) Prof.
BeitragVerfasst: Do 13.01.05 10:32 
Ich gehe mal davon aus, dass du die Bilder schon laden kannst und die Grauwerte in einem Byte-Array vorliegen, mit der Pixelanzahl Count = Width*Height. Dann gehst du einfach durch das Array durch und erhöhst einen Zähler für den entsprechenden Grauwert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
//trocken geschrieben

var Pix : PByteArray; //Quelle
    i : integer;
    GrayCount : array [0..255] of integer;

begin
 for i:=0 to 255 do GrayCount[i]:=0;
 for i:=0 to Count-1 do Inc(GrayCount[Pix[i]]);
end;


Abspeichern kannst du so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var sl : TStringList;

begin
 sl : TStringList.Create;
 try
  for i:=0 to 255 do 
   sl.add(IntToStr(GrayCount[i])); 

  sl.savetofile('dump.txt');

 finally
  sl.free;
 end;
end;


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 13.01.05 10:46 
Ich will ja nicht Werbung für die Konkurrenz machen, aber kann man nicht auch mit C Bilder auslesen? Du hast die im TIFF-Format? Dann kann Delphi die auch nicht problemlos lesen (AFAIK können die mitgeleiferten Kompos nur jpg und bmp).

Du kannst natürlich nach Tiff-Komponenten suchen, die es mit Sicherheit gibt, aber günstiger wäre wahrscheinlich, sich bei www.wotsit.org über das Tiff-Format zu erkundigen, die Dateien per hand auszulesen (Header auslesen und verarbeiten) und die Bilddaten in ein Byte-Array zu packen. Das kann man dann mit entsprechender C-Syntax so durchgehen, wie es SpaceGuide beschrieben hat.

Ist doch besser, wenn ein Programm beides kann. Nur fürs auslesen ein Delphi-Programm zu nehmen, und den Rest in C machen ist doch Unsinn.

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



BeitragVerfasst: Do 13.01.05 20:04 
Vielen Dank erstmal für die Antworten.

@Gausi: Wenn das ganze mit C ginge, wäre das natürlich noch viel optimaler. Ich hab jetzt mehrere Stunden im Netz nach Ansatzpunkten gesucht, wie ich ein tiff-File in C aufrufen/laden kann - aber leider ohne Erfolg. Dabei will ich ja nichtmal was anzeigen, oder so. Auch keine grafische Oberfläche.

Sondern nur das Histogram eines tiff-Files in einfachen Zahlen (z.B. die jeweiligen Pixelanzahlen der 255 Grauwerte einfach untereinander - Vektor?) in ein dat-File schreiben. Mehr nicht. Bin echt verzweifelt.

Kann mir bitte noch jemand einen Hinweis, Link o.ä. geben?

mfg sann
sann Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 13.01.05 20:25 
...ich habe die Möglichkeit die Bild-Files auch als Bitmap .bmp zu bekommen. Würden sich die leichter auslesen lassen?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 13.01.05 21:20 
Kannst du denn mit C binäre Dateien öffnen und lesen? Also eine Datei öffnen und diese in irgendeiner Form einlesen? In ein Byte-Array oder sowas? Wenn ja, musst du dich nur mit dem Format auseinandersetzen, wo und wie da die Bildinformationen gespeichert sind. Bei bmp hab ich das mal per Hand gemacht, ist nicht wirklich schwer. Wie kompliziert Tiff ist, weiss ich nicht. Aber da das AFAIK auch unkomprimiert ist (also ohne FFT oder so wie bei JPGs) dürfte das nicht zu schwierig sein.

Mit Delphi Bitmaps einlesen ist natürlich sehr bequem. Geht einfach mit MeinBitmap.loadfromfile(MeineDatei); Und mit scanline kann man recht schnell auf die einzelnen Bildzeilen eines Bitmaps zugreifen.

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



BeitragVerfasst: Do 13.01.05 23:31 
Ich arbeite mit dem ICC-win32 als C-Compiler. Das einzige, was ich bisher in C eingelesen habe, sind .dat-Files. Und dann halt die Werte entsprechenden Variablen zugeordnet und weitergerechnet. Das wird hier nicht reichen, oder? Ich hab jetzt weiter im Netz nach verwertbaren Sachen gesucht, bin aber nicht fündig geworden. Es handelt sich tatsächlich um Bitmaps!

Kann man abschätzen, wie aufwändig das Programm wäre. Wenn es nicht alzu "krass" wird, würde ich das bestimmt hinkriegen, ich bräuchte halt nur ne Grundlage. Das Programm für die Weiterarbeit mit den Histogramm-Werten hab ich ja schon geschrieben. Hab da mit Vektoren (255 Elemente) gearbeitet.

Vielleicht kannst Du mir noch nen Hinweis geben.

Vielen Dank im Voraus.
mfg sascha
Phantom1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 390



BeitragVerfasst: Fr 14.01.05 07:07 
Es ist wirklich relativ einfach in Delphi.
Da ich etwas Zeit hatte, habe ich es mal probiert.
Hier kannst du das Programm bzw den SourceCode downloaden: [url]www.members.aol.com/...bmpanalyse.zip[/url] (179KB)

Achja, Programm arbeitet nur mit Bitmaps. Einfach programm starten, Verzeichnis auswählen und alle Bitmaps markieren. Anschließend auf start klicken.

mfg
phantom1
sann Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 14.01.05 18:54 
@ Phantom 1

Ich weiß garnicht, was ich sagen soll. Das ist total genial. Vielen, vielen Dank. Ich werd mich übers WE hinsetzen um den Code nachzuvollziehen. Und werde versuchen, mein bestehendes C-Programm einzubinden, damit am Ende alles in Einem ist.

mfg sann