Utilisateur anonyme
-
28 août 2006 à 00:05
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 2019
-
28 juil. 2008 à 09:04
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 28 juil. 2008 à 09:04
@NetHacker
En résumé :
1ère étape: Convertir ton image en niveaux de gris.
2étape : Déterminer un seuil de gris sous lequel les pixels deviendront blancs, et au dessus duquel les pixels deviendront noirs.
@Tous
Mais il y a une autre façon de transformer une image en niveaux de gris, autre que celle proposée par CPTPINGU. C'est :
Gris = R*0.2125 + V*0.7154 + B*0.0721
Cette méthode est plus proche de la sensibilité réelle de notre oeuil aux couleurs.
La question que je me pose, perso, c'est de savoir laquelle de ces deux méthodes est la mieux adaptée à un traitement tel que celui que nous propose Forman ici.
Et, question subsidiaire : Est-ce que les gris des anciennes épreuves dites "en noir et blanc" des photos argentiques tiennent compte de notre sensibilité aux couleurs, ou est-ce qu'ils ne sont qu'un simple effet photochimique sans correctif?
cs_Forman
Messages postés600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 28 juil. 2008 à 00:12
Pour faire la méthode de CptPingu avec mon source, tu peux utiliser la chaine de filtres suivante:
-RGB -> Luminance
-Seuillage (avec une valeur paramétrable)
Autre solution (mais beaucoup plus lente!):
-RGB -> Luminance
-Binarization (avec distance euclidienne et norme L infini)
cs_Forman
Messages postés600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 28 juil. 2008 à 00:04
Ben il y a la fonction Binarize dans ImgUtils.pas qui fait ça aussi, c'est même le principal intérêt de ce code...
Tout dépend dans quel contexte tu veux faire ça. Si tu veux une méthode simple (et rapide!) celle de CptPingu est très bien. Peut-être d'ailleurs faudrait-il plutôt faire son test avec la couleur verte, qui en général est mieux liée à l'intensité lumineuse.
Ma méthode est plus complexe, et sert à déterminer un seuil (la valeur 127 mentionnée par CptPingu) qui soit adapté à la statistique de l'image, par exemple pour extraire un objet sur un fond uni. Ca prend pas mal de temps. Une fois le seuil calculé, c'est exactement le même algo en remplaçant 127 par la valeur qu'on a trouvée.
Cette question aurait plus sa place sur le forum qu'ici.
Toutefois, pour réaliser cela, tu dois convertir ton image en noir et blanc
pixel.rouge = (pixel.rouge + pixel.vert + pixel.bleu) / 3
pixel.vert = (pixel.rouge + pixel.vert + pixel.bleu) / 3
pixel.bleu = (pixel.rouge + pixel.vert + pixel.bleu) /3
Puis la binariser:
pixel.rouge = si pixel.rouge > 127 alors blanc(0XFF) sinon noir (0X00)
pixel.vert = pixel.rouge
pixel.bleu = pixel.rouge
nethacker
Messages postés288Date d'inscriptionmardi 2 mai 2006StatutMembreDernière intervention12 octobre 2011 27 juil. 2008 à 23:19
Comment binariser une image en rendant tout ce qui est dans une couleur 0 et tout ce qui ne l'est pas 1 ? pour avoir enfin une image blanc et noir !
vienbv
Messages postés14Date d'inscriptionlundi 1 novembre 2004StatutMembreDernière intervention17 mars 2010 1 mars 2008 à 17:47
Merci pour votre code, cela m'aide beaucoup.
cs_Forman
Messages postés600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 5 sept. 2006 à 16:35
Salut Blatour
En ce moment je suis assez pris par la rentrée et pas mal d'autres projets en cours, donc je ne pense pas avoir le temps de beaucoup avancer sur ce projet d'ici à fin septembre au moins. En attendant, si tu as la possibilité de prendre en photo (avec un appareil numérique standard en couleurs) un grain de beauté sur une peau noire, ça m'intéresse. La coloration spécifique aux grains de beauté (du moins pour les photos que j'ai vu jusqu'ici) change surtout la teinte de la peau, plutôt que le contraste. Donc il n'est pas exclu que cette donnée (la teinte donc, qu'on peut extraire d'une photo couleur) soit suffisante pour analyser des grains de beauté peu contrastés (comme sur une peau noire par exemple).
Pour me joindre: feuvrier "at" clipper.ens.fr
blatour
Messages postés26Date d'inscriptionmardi 6 mai 2003StatutMembreDernière intervention11 décembre 2006 5 sept. 2006 à 14:00
Bonjour Caribensila,
Déjà quand je parle d'un logiciel OpenSource c'est de proposer une solution complète pour cette fonctionnalité aux médecins (mise en place d'une base de données local, interface graphique d'utilisation, fichier d'aide, etc...). D'autant plus que si le logiciel fonctionne bien, on peut trouver des subventions pour développer le projet.
Pour récupérer ce type de photo ben je ne sais pas si les médecins sont équipés de tout ça ici. Moi ma femme est sénégalaise alors je vous en ferais bien des photos mais j'ai pas le système d'éclairage adéquat (UV ou autre).
Il faudrait que je me renseigne auprès des dermatologues locaux pour voir ce qu'ils en pensent.
Mais bon déjà attendons que Forman nous propose sa version finale d'analyse de l'image.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 5 sept. 2006 à 13:43
Salut Blatour,
"un logiciel OpenSource à l'attention du corps médical"
C'est un peu ce qui se passe, non?
Pour les peaux noires, je pense que le problème est et restera douloureux. Perso, j'avais pensé à des photos prises sous éclairage UV ou autre (ou même ultrasons comme les échographies). Il faudrait tester. En tout cas, il serait utile de disposer de telles photos pour faire des tests... Malgré mes recherches, je n'en ai pas trouvé sur Internet. Si tu peux nous aider...
blatour
Messages postés26Date d'inscriptionmardi 6 mai 2003StatutMembreDernière intervention11 décembre 2006 5 sept. 2006 à 12:38
J'ai oublié de dire bravo pour ce travail.
lol
blatour
Messages postés26Date d'inscriptionmardi 6 mai 2003StatutMembreDernière intervention11 décembre 2006 5 sept. 2006 à 12:37
Bonjour tout le monde,
Moi je vis en Afrique à Dakar. Ton algo d'analyse peut t'il être adapté aussi à des peaux noires ?
Ici ça serait vraiment trés utile car il y a beaucoup de ce cancer.
Il serait certainement intéressant de créer une zone de développement pour créer un logiciel OpenSource à l'attention du corps médical. Ici en Afrique, les médecins n'ont pas la même capacité d'investissement qu'en Europe.
Qu'en pensez-vous ?
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 29 août 2006 à 14:39
Je te suis, Forman.
Un soft utilisable par des non-spécialites sera une bonne chose pour multiplier les dépistages.
C'est DRJEROME qui sera content de pouvoir faire ça "at home"! ;)
cs_Forman
Messages postés600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 29 août 2006 à 13:45
Caribensila: l'idée, c'était justement que l'utilisateur n'ait qu'à prendre la photo, la donner au soft, celui ci extrait la "zone d'intérêt", stocke la nouvelle photo dans une base de données et déclenche une alarme en cas de changement de texture par exemple. Laisser un humain découper la zone, c'est prendre le risque qu'il ne le fasse pas toujours pareil... et donc d'avoir qqchose de peu fiable. Mais j'ai bon espoir de faire qqchose qui fonctionne quasiment à tous les coups pour l'extraction de la zone d'intérêt: ma méthode de binarisation devrait fonctionner quasiment à chaque fois sur le canal de la teinte (après transformation RGB->HSV). Il faut juste que je trouve un moyen de prendre en compte le caractère cyclique de cette composante et ça devrait fonctionner. Après, je pense qu'il faudrait utiliser la méthode que CptPingu m'a envoyée en C pour comparer les variations de texture.
Elguevel: lol non j'ai juste fait un DEA de traitement d'images il y a 3 ans. C'est celui de l'ENS Cachan, il est très intéressant, et contient aussi une partie traitement du signal/réseaux de neurones.
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 29 août 2006 à 12:52
Forman le spécialiste du graphisme ... T'aurai pas travaillé chez Adobe toi ?
En tout cas bravo pour tes projets qui sont assez collossaux pour des réponses de Forum ! :-)
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 29 août 2006 à 12:14
Salut Forman,
Bin, quand tu t'y mets, tu ne fais pas les choses à moitié! ;)
Toujours aussi impressionnant ton travail!
"Je suis en train de travailler sur une méthode plus précise, mais ça risque de prendre des temps de calcul prohibitifs"...
Une idée, comme ça...
Pourquoi ne pas laisser à l'utilisateur le soin de sélectionner à la souris une zone de détourage qui seule sera analysée? En diminuant le nombre de pixels à traiter, on diminuera le temps de calcul d'autant, non?
Sinon,j'attends ta version commentée. Ca me sera bien utile...
Bravo et merci!
DRJEROME
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention 5 février 2015 28 août 2006 à 14:13
Salut,
pouah un mélanome.... ça me rappelle mes consults de dépistage
sinon, félicitation...il travaille le Forman !
cs_Forman
Messages postés600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 28 août 2006 à 13:24
Merci fOxi, je corrigerai.
Par contre je ne vois pas où j'ai utilisé un GetMem avec une variable de taille statique?
Bon je posterai une autre version prochainement, avec des commentaires.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 28 août 2006 à 00:54
Hey ça a l'air vachement interressant tout ça ...
par contre j'ai vus une erreur dans le fichier TresholdFrameUnit
procedure TTresholdFrame.TrackBar1Change(Sender: TObject);
begin
Panel1.Caption:=Format('Seuil minimum: %f',[TrackBar1.Position]);
end;
c'est %d pour integer et pas %f ! tu n'as pas d'erreur qui se produit ?
sinon il faudrait ecrire :
Format('Seuil minimum: %f',[TrackBar1.Position/1]);
ce qui boufferais un peu plus de cycles a cause de la division.
aprés dans mainform :
procedure TMainForm.FormDestroy(Sender: TObject);
begin
FSrcBitmap.Free;
FDstBitmap.Free;
FPreviewBitmap.Free;
end;
on ne doit pas appeler Destroy a moins d'etre sur du pourquoi on appel pas Free.
J'explique pourquoi, Free verifie que l'objet est instancié puis appel destroy ... destroy ne verifie pas si l'objet est instancié et donc peu provoquer des erreurs quand objet = nil.
ensuite dans :
procedure TMainForm.Exporterlachanedefiltres1Click(Sender: TObject);
var
f : TFileStream;
a : Integer;
s : ShortString;
begin
if SaveDialog1.Execute then begin
f := TFileStream.Create(SaveDialog1.FileName,fmOpenWrite or fmCreate);
try
// pas besoin de seeker aprés creation.
//f.Seek(0,soFromBeginning);
for a:=0 to ListBox1.Items.Count-1 do begin
S := ListBox1.Items.Objects[a].ClassName;
// Mieux vaut utilise WriteBuffer que Write
// en utilisant le type ShortString on evite de faire quelque manipulation en plus
// shortstring est une chaine AZT et son premier byte determine la taille de la chaine
// il nous faut donc ajouter 1 a la longeur pour ecrire l'octet de taille et la chaine.
f.WriteBuffer(S,Length(S)+1);
f.WriteComponent(ListBox1.Items.Objects[a] as TComponent);
end;
finally
f.Free;
end;
end;
end;
on modifie la lecture en consequence :
procedure TMainForm.Importerunechanedefiltres1Click(Sender: TObject);
var
f : TFileStream;
g : TFilterFrame;
a : Integer;
s : shortstring;
begin
if OpenDialog1.Execute then begin
f:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
try
for a:=0 to ListBox1.Items.Count-1 do
ListBox1.Items.Objects[a].Destroy;
ListBox1.Items.Clear;
ListBox1.ItemIndex:=-1;
// pas besoin de seeker.
// f.Seek(0,soFromBeginning);
while f.Position < f.Size do begin
f.ReadBuffer(A,SizeOf(byte));
f.Position := f.Position - 1;
f.ReadBuffer(S,A+1);
// ici la methode me semble suspecte ... car tu ne libere pas G
// cela pourrait entrainer des surcharge de memoire voir des erreurs d'allocation
// il faudrait donc utiliser un parent ou un tableau dynamique pour les objets
// et surtout ne pas oublier de les liberer a la fin du programme ou avant chaque modification.
// exemple : SetLength(Filters, Length(Filters)+1);
// Filters[high(Filters)] := TFilterFrameClasse....create(nil);
// avec Filters : array of TFilterFrameClass;
// la liberation se ferait dans une boucle : for i := 0 to high(Filters) do Filters[i].Free;
g := TFilterFrameClass(GetClass(S)).Create(nil);
g.DestroyComponents;
g.Name:='';
f.ReadComponent(g);
ListBox1.Items.AddObject(g.Caption,g);
end;
finally
f.Free;
UpdateGUI;
end;
end;
end;
dans imgutils il y'a aussi un truc a ameliorer :
function LoadBitmapFromFile(const FileName : string; BMP :TBitmap) : boolean;
// c'est l'utilisateur qui se charge de la creation de BMP! c'est mieux ainsi et offre plus de souplesse.
var
p : TPicture;
begin
result := false;
if (not FileExists(FileName)) or (not Assigned(BMP)) then exit;
p := TPicture.Create;
try
p.LoadFromFile(FileName);
// on prefereras la methode qui provoque le moins d'erreur.
BMP.Width := p.Width;
BMP.Height := p.Height;
BMP.Canvas.Draw(0,0,p.Graphic);
result := true;
finally
p.Free;
end;
end;
un oublis de else :
function TruncByte(x:Single):Byte;
begin
if x < 0 then
x := 0
else
if x > 255 then
x := 255;
Result:=Round(x);
end;
attention a GetMem et FreeMem ... mieux vaut utilisee New et Dispose :
new(p);
dispose(p);
cela evite d'avoir a gerer et calculer la taille memoire a allouer, surtout quand il s'agit de type tableau statique.
bon sinon j'ai pas ete plus loin ...
tout est correct dans l'ensemble, du bon boulot quoi, il est dommage de ne pas avoir de commentaire, surrement une refact a venir ?
bon taff.
cs_Forman
Messages postés600Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 6 avril 20101 28 août 2006 à 00:16
Oui ça m'intéresse.
Tu peux me les envoyer ici: feuvrier "at" clipper.ens.fr
Merci
Pour extraire une "sous-image" d'une image, je peux te conseiller le filtre de Gabor (je l'ai utilisé pour mon projet de 2eme année sur la reconnaissance digitale). Il te faut recupérer la frequence et la direction de l'image, puis les mettre en parametres du filtre.
Je n'ai pas le temps de te convertir les sources en Delphi, mais je peux t'envoyer les sources en C si ca t'interesse.
28 juil. 2008 à 09:04
En résumé :
1ère étape: Convertir ton image en niveaux de gris.
2étape : Déterminer un seuil de gris sous lequel les pixels deviendront blancs, et au dessus duquel les pixels deviendront noirs.
@Tous
Mais il y a une autre façon de transformer une image en niveaux de gris, autre que celle proposée par CPTPINGU. C'est :
Gris = R*0.2125 + V*0.7154 + B*0.0721
Cette méthode est plus proche de la sensibilité réelle de notre oeuil aux couleurs.
La question que je me pose, perso, c'est de savoir laquelle de ces deux méthodes est la mieux adaptée à un traitement tel que celui que nous propose Forman ici.
Et, question subsidiaire : Est-ce que les gris des anciennes épreuves dites "en noir et blanc" des photos argentiques tiennent compte de notre sensibilité aux couleurs, ou est-ce qu'ils ne sont qu'un simple effet photochimique sans correctif?
28 juil. 2008 à 00:12
-RGB -> Luminance
-Seuillage (avec une valeur paramétrable)
Autre solution (mais beaucoup plus lente!):
-RGB -> Luminance
-Binarization (avec distance euclidienne et norme L infini)
28 juil. 2008 à 00:04
Tout dépend dans quel contexte tu veux faire ça. Si tu veux une méthode simple (et rapide!) celle de CptPingu est très bien. Peut-être d'ailleurs faudrait-il plutôt faire son test avec la couleur verte, qui en général est mieux liée à l'intensité lumineuse.
Ma méthode est plus complexe, et sert à déterminer un seuil (la valeur 127 mentionnée par CptPingu) qui soit adapté à la statistique de l'image, par exemple pour extraire un objet sur un fond uni. Ca prend pas mal de temps. Une fois le seuil calculé, c'est exactement le même algo en remplaçant 127 par la valeur qu'on a trouvée.
27 juil. 2008 à 23:51
Toutefois, pour réaliser cela, tu dois convertir ton image en noir et blanc
pixel.rouge = (pixel.rouge + pixel.vert + pixel.bleu) / 3
pixel.vert = (pixel.rouge + pixel.vert + pixel.bleu) / 3
pixel.bleu = (pixel.rouge + pixel.vert + pixel.bleu) /3
Puis la binariser:
pixel.rouge = si pixel.rouge > 127 alors blanc(0XFF) sinon noir (0X00)
pixel.vert = pixel.rouge
pixel.bleu = pixel.rouge
27 juil. 2008 à 23:19
1 mars 2008 à 17:47
5 sept. 2006 à 16:35
En ce moment je suis assez pris par la rentrée et pas mal d'autres projets en cours, donc je ne pense pas avoir le temps de beaucoup avancer sur ce projet d'ici à fin septembre au moins. En attendant, si tu as la possibilité de prendre en photo (avec un appareil numérique standard en couleurs) un grain de beauté sur une peau noire, ça m'intéresse. La coloration spécifique aux grains de beauté (du moins pour les photos que j'ai vu jusqu'ici) change surtout la teinte de la peau, plutôt que le contraste. Donc il n'est pas exclu que cette donnée (la teinte donc, qu'on peut extraire d'une photo couleur) soit suffisante pour analyser des grains de beauté peu contrastés (comme sur une peau noire par exemple).
Pour me joindre: feuvrier "at" clipper.ens.fr
5 sept. 2006 à 14:00
Déjà quand je parle d'un logiciel OpenSource c'est de proposer une solution complète pour cette fonctionnalité aux médecins (mise en place d'une base de données local, interface graphique d'utilisation, fichier d'aide, etc...). D'autant plus que si le logiciel fonctionne bien, on peut trouver des subventions pour développer le projet.
Pour récupérer ce type de photo ben je ne sais pas si les médecins sont équipés de tout ça ici. Moi ma femme est sénégalaise alors je vous en ferais bien des photos mais j'ai pas le système d'éclairage adéquat (UV ou autre).
Il faudrait que je me renseigne auprès des dermatologues locaux pour voir ce qu'ils en pensent.
Mais bon déjà attendons que Forman nous propose sa version finale d'analyse de l'image.
5 sept. 2006 à 13:43
"un logiciel OpenSource à l'attention du corps médical"
C'est un peu ce qui se passe, non?
Pour les peaux noires, je pense que le problème est et restera douloureux. Perso, j'avais pensé à des photos prises sous éclairage UV ou autre (ou même ultrasons comme les échographies). Il faudrait tester. En tout cas, il serait utile de disposer de telles photos pour faire des tests... Malgré mes recherches, je n'en ai pas trouvé sur Internet. Si tu peux nous aider...
5 sept. 2006 à 12:38
lol
5 sept. 2006 à 12:37
Moi je vis en Afrique à Dakar. Ton algo d'analyse peut t'il être adapté aussi à des peaux noires ?
Ici ça serait vraiment trés utile car il y a beaucoup de ce cancer.
Il serait certainement intéressant de créer une zone de développement pour créer un logiciel OpenSource à l'attention du corps médical. Ici en Afrique, les médecins n'ont pas la même capacité d'investissement qu'en Europe.
Qu'en pensez-vous ?
29 août 2006 à 14:39
Un soft utilisable par des non-spécialites sera une bonne chose pour multiplier les dépistages.
C'est DRJEROME qui sera content de pouvoir faire ça "at home"! ;)
29 août 2006 à 13:45
Elguevel: lol non j'ai juste fait un DEA de traitement d'images il y a 3 ans. C'est celui de l'ENS Cachan, il est très intéressant, et contient aussi une partie traitement du signal/réseaux de neurones.
29 août 2006 à 12:52
En tout cas bravo pour tes projets qui sont assez collossaux pour des réponses de Forum ! :-)
29 août 2006 à 12:14
Bin, quand tu t'y mets, tu ne fais pas les choses à moitié! ;)
Toujours aussi impressionnant ton travail!
"Je suis en train de travailler sur une méthode plus précise, mais ça risque de prendre des temps de calcul prohibitifs"...
Une idée, comme ça...
Pourquoi ne pas laisser à l'utilisateur le soin de sélectionner à la souris une zone de détourage qui seule sera analysée? En diminuant le nombre de pixels à traiter, on diminuera le temps de calcul d'autant, non?
Sinon,j'attends ta version commentée. Ca me sera bien utile...
Bravo et merci!
28 août 2006 à 14:13
pouah un mélanome.... ça me rappelle mes consults de dépistage
sinon, félicitation...il travaille le Forman !
28 août 2006 à 13:24
Par contre je ne vois pas où j'ai utilisé un GetMem avec une variable de taille statique?
Bon je posterai une autre version prochainement, avec des commentaires.
28 août 2006 à 00:54
par contre j'ai vus une erreur dans le fichier TresholdFrameUnit
procedure TTresholdFrame.TrackBar1Change(Sender: TObject);
begin
Panel1.Caption:=Format('Seuil minimum: %f',[TrackBar1.Position]);
end;
c'est %d pour integer et pas %f ! tu n'as pas d'erreur qui se produit ?
sinon il faudrait ecrire :
Format('Seuil minimum: %f',[TrackBar1.Position/1]);
ce qui boufferais un peu plus de cycles a cause de la division.
aprés dans mainform :
procedure TMainForm.FormDestroy(Sender: TObject);
begin
FSrcBitmap.Free;
FDstBitmap.Free;
FPreviewBitmap.Free;
end;
on ne doit pas appeler Destroy a moins d'etre sur du pourquoi on appel pas Free.
J'explique pourquoi, Free verifie que l'objet est instancié puis appel destroy ... destroy ne verifie pas si l'objet est instancié et donc peu provoquer des erreurs quand objet = nil.
ensuite dans :
procedure TMainForm.Exporterlachanedefiltres1Click(Sender: TObject);
var
f : TFileStream;
a : Integer;
s : ShortString;
begin
if SaveDialog1.Execute then begin
f := TFileStream.Create(SaveDialog1.FileName,fmOpenWrite or fmCreate);
try
// pas besoin de seeker aprés creation.
//f.Seek(0,soFromBeginning);
for a:=0 to ListBox1.Items.Count-1 do begin
S := ListBox1.Items.Objects[a].ClassName;
// Mieux vaut utilise WriteBuffer que Write
// en utilisant le type ShortString on evite de faire quelque manipulation en plus
// shortstring est une chaine AZT et son premier byte determine la taille de la chaine
// il nous faut donc ajouter 1 a la longeur pour ecrire l'octet de taille et la chaine.
f.WriteBuffer(S,Length(S)+1);
f.WriteComponent(ListBox1.Items.Objects[a] as TComponent);
end;
finally
f.Free;
end;
end;
end;
on modifie la lecture en consequence :
procedure TMainForm.Importerunechanedefiltres1Click(Sender: TObject);
var
f : TFileStream;
g : TFilterFrame;
a : Integer;
s : shortstring;
begin
if OpenDialog1.Execute then begin
f:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
try
for a:=0 to ListBox1.Items.Count-1 do
ListBox1.Items.Objects[a].Destroy;
ListBox1.Items.Clear;
ListBox1.ItemIndex:=-1;
// pas besoin de seeker.
// f.Seek(0,soFromBeginning);
while f.Position < f.Size do begin
f.ReadBuffer(A,SizeOf(byte));
f.Position := f.Position - 1;
f.ReadBuffer(S,A+1);
// ici la methode me semble suspecte ... car tu ne libere pas G
// cela pourrait entrainer des surcharge de memoire voir des erreurs d'allocation
// il faudrait donc utiliser un parent ou un tableau dynamique pour les objets
// et surtout ne pas oublier de les liberer a la fin du programme ou avant chaque modification.
// exemple : SetLength(Filters, Length(Filters)+1);
// Filters[high(Filters)] := TFilterFrameClasse....create(nil);
// avec Filters : array of TFilterFrameClass;
// la liberation se ferait dans une boucle : for i := 0 to high(Filters) do Filters[i].Free;
g := TFilterFrameClass(GetClass(S)).Create(nil);
g.DestroyComponents;
g.Name:='';
f.ReadComponent(g);
ListBox1.Items.AddObject(g.Caption,g);
end;
finally
f.Free;
UpdateGUI;
end;
end;
end;
dans imgutils il y'a aussi un truc a ameliorer :
function LoadBitmapFromFile(const FileName : string; BMP :TBitmap) : boolean;
// c'est l'utilisateur qui se charge de la creation de BMP! c'est mieux ainsi et offre plus de souplesse.
var
p : TPicture;
begin
result := false;
if (not FileExists(FileName)) or (not Assigned(BMP)) then exit;
p := TPicture.Create;
try
p.LoadFromFile(FileName);
// on prefereras la methode qui provoque le moins d'erreur.
BMP.Width := p.Width;
BMP.Height := p.Height;
BMP.Canvas.Draw(0,0,p.Graphic);
result := true;
finally
p.Free;
end;
end;
un oublis de else :
function TruncByte(x:Single):Byte;
begin
if x < 0 then
x := 0
else
if x > 255 then
x := 255;
Result:=Round(x);
end;
attention a GetMem et FreeMem ... mieux vaut utilisee New et Dispose :
new(p);
dispose(p);
cela evite d'avoir a gerer et calculer la taille memoire a allouer, surtout quand il s'agit de type tableau statique.
bon sinon j'ai pas ete plus loin ...
tout est correct dans l'ensemble, du bon boulot quoi, il est dommage de ne pas avoir de commentaire, surrement une refact a venir ?
bon taff.
28 août 2006 à 00:16
Tu peux me les envoyer ici: feuvrier "at" clipper.ens.fr
Merci
28 août 2006 à 00:05
Pour extraire une "sous-image" d'une image, je peux te conseiller le filtre de Gabor (je l'ai utilisé pour mon projet de 2eme année sur la reconnaissance digitale). Il te faut recupérer la frequence et la direction de l'image, puis les mettre en parametres du filtre.
Je n'ai pas le temps de te convertir les sources en Delphi, mais je peux t'envoyer les sources en C si ca t'interesse.