Viewer complet pour le traitement de l'image : imanalyse

Soyez le premier à donner votre avis sur cette source.

Vue 9 065 fois - Téléchargée 1 100 fois

Description

L'interface graphique est en win32 natif. Ce logiciel permet de visualiser et de manipuler les images d'une manière très instinctive. Le déplacement de l'image et le zoom sur une zone précise de l'image se fait par l'utilisation de la souris et de sa molette.(Le zoom est centré sur la position de la souris). Le zoom est possible jusqu'à visualiser les pixels un à un. A ce niveau de zoom, la valeur des pixels est superposé à l'image.

Une boite de dialogue a été ajouté par rapport à la version 2 d'ImAnalyse: La modification direct des niveaux de gris de l'image.
Cette fonctionnalité permet contrôler la validité des algorithmes créés en ne sélectionnant que les niveaux de gris voulus. Une fonction random permet entre autre de visualiser les composantes connexes de l'image.

Voici quelques traitements possibles avec ce logiciel:
Filtrage, Détection optimal des contours, Morphologie Mathématique, modification non linéaire de l'intensité, seuillage automatique, exécution de scripts...

Plus d'information sont disponibles sur mon site Internet:
http://ImAnalyse.free.fr

Source / Exemple :


// Auteur : Vincent Morard
// 19 janvier 2010
// http://ImAnalyse.free.fr

Conclusion :


Merci de vos feedbacks ainsi que vos commentaires...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
5
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2015

Thank you for your project. Is Version 4 ready ?
One question on the source of cimage. The "copy" function is labeled twice, whereas one is for copy and other is for paste. On cimage.cpp this:

void CImage::Copy(HBITMAP hBmp)
{
if(hBmp==0)
return;

BITMAP Bmp;

//DesAllocation
Clean();

//Recupération des caractéristiques de l'images
GetObject(hBmp,sizeof(Bmp),&Bmp);

m_iWidth=Bmp.bmWidth;
m_iHeight=Bmp.bmHeight;

//Allocation
m_ucpBits = (UCHAR*)ALLOCMEM((m_iWidth*m_iHeight)*4);

//Création du bitmap
m_hBmp=CreateBitmap(m_iWidth,m_iHeight,1,32,m_ucpBits) ;

//On copie les données

//recupération des pixels
GetBitmapBits(hBmp,(m_iWidth*m_iHeight)*4,m_ucpBits);
SetBitmapBits(m_hBmp,(m_iWidth*m_iHeight)*4,m_ucpBits);
}


Should be named as:

void CImage::Paste(HBITMAP hBmp)
{
if(hBmp==0)
return;

BITMAP Bmp;

//DesAllocation
Clean();

//Recupération des caractéristiques de l'images
GetObject(hBmp,sizeof(Bmp),&Bmp);

m_iWidth=Bmp.bmWidth;
m_iHeight=Bmp.bmHeight;

//Allocation
m_ucpBits = (UCHAR*)ALLOCMEM((m_iWidth*m_iHeight)*4);

//Création du bitmap
m_hBmp=CreateBitmap(m_iWidth,m_iHeight,1,32,m_ucpBits) ;

//On copie les données

//recupération des pixels
GetBitmapBits(hBmp,(m_iWidth*m_iHeight)*4,m_ucpBits);
SetBitmapBits(m_hBmp,(m_iWidth*m_iHeight)*4,m_ucpBits);
}


Also, can it be avoided to use classes ? I really like your code. It is simple, and easy to mantain because 90% of it is pure win api. But, can you use only win apis, instead using classes ?

I am converting teh source to assembly language and dispites the fact that classes are mainly structures, they are a bit hard to maintain.

Can you make the image processing functions as dlls, instead making them attached to the main gui ? If i suceed translating it, i plan to make plugins for it for making easier to others build their own functions for it without "touching" inside the main app.

Also there are a few bugs on the workspace. When you zoom the image to the maximum (60 x), the RGB values that shows on each block is not precise. I mean, when you hover the mouse over a block it will display a value on the statusbar and other inside the "block" (pixel). The values on the blocks seems to be placed wrong one or 2 pixels to the right or below where the label should be


Also, on the WorkSpaceProc function (the WM_CHANGE_PICTURE case) it have some code that are never used. Why did you kept them there ?

Here:
case WM_CHANGE_PICTURE:
SetFocus(hwnd);
if(wParam==100)SendMessage(hwndWorkSpace,WM_ZOOMFIT,0,0);
if(lParam >=0 && lParam<NB_BUFFER)
CurrentImg=(int)lParam;
SendMessage(hwndImageSmall,WM_UPDATE,0,0);
SendMessage(hwndToolBar,WM_UPDATE,0,0);
Img[CurrentImg].CreateMiniature(90,90);
InvalidateRect(hwndMain,0,1);
SendMessage(hwndEdition,WM_CHANGE_PICTURE,0,0);
if(KeepZoomAndPos==0){
SendMessage(hwnd,WM_ZOOMFIT,0,0);
InvalidateRect(hwndImageSmall,0,1);
//****************InvalidateRect(hwndImage,0,1);
SendMessage(hwndStatutBar,WM_CHANGE_PICTURE,0,0);

break;
}
else{

W=Img[CurrentImg].GetWidth();
H=Img[CurrentImg].GetHeight();
sizeImageX=(int)(W*Zoom);
sizeImageY=(int)(H*Zoom);
InvalidateRect(hwnd,0,0);
//*****MoveWindow(hwndImage,X,Y,(int)(W*Zoom),(int)(H*Zoom),1);
InvalidateRect(hwndImageSmall,0,1);
//*****InvalidateRect(hwndImage,0,1);
SendMessage(hwndStatutBar,WM_CHANGE_PICTURE,0,0);

break;
}

// ---------- ALL OF THIS CODE BELOW IS NEVER USED

if(X<0)X=0;
if(Y<0)Y=0;
if(X>cx || Y>cy){
X=cx-10;Y=cy-10;
}
W=Img[CurrentImg].GetWidth();
H=Img[CurrentImg].GetHeight();
sizeImageX=(int)(W*Zoom);
sizeImageY=(int)(H*Zoom);
InvalidateRect(hwnd,0,0);
//*****MoveWindow(hwndImage,X,Y,(int)(W*Zoom),(int)(H*Zoom),1);
InvalidateRect(hwndImageSmall,0,1);

break;
Messages postés
147
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
14 novembre 2009

Hi!
Bon, pour l'histoire du chevauchement, j'ai l'explication : c'est à cause de la taille des caractères de WinXP (paramètres\affichage\avancé), positionnée sur "grande taille" (120ppp), ce qui fait que tes labels prennent plus de place et repoussent les zones d'édition qui à leur tour empiètent sur l'image, dont le positionnement devait être à mon avis "absolu" (à moins que ce soit à cause des dimensions de la boîte de dialogue qui s'avère du coup trop petite?). Pour éviter ces désagréments, tout mettre dans des "layout", des "grid" ou des "group", sans jamais préciser de coordonnées "en dur", mais bon, tu dois certainement savoir tout çà...
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
Bonjour
Merci beaucoup pour vos retours et vos mots d'encouragement! Cela fait très plaisir.

>Opossum_farceur : Pour les problèmes de chevauchement sur les boites de dialogue, je n'ai pas réussi à reproduire le problème. Je suis aussi sous XP et j'ai essayé toutes les résolutions possibles... Pas de soucis aussi avec mon Vista. Je ne sais pas d'où cela peut venir...

Pour ta proposition (très intéressante soit dit en passant), j'y avais pensé il y a déjà quelques temps et j'avais fait une tentative inachevé... Je voulais faire l'équivalent des macros: Pouvoir enregistrer le traitement de l'utilisateur et ensuite l'appliquer sur tout une série d'image. Les macros étant un fichier txt banal avec des appels fonctions de mon programme. Cependant, je me suis rendu compte que c'est un travail qui prend BEAUCOUP de temps... et j'ai perdu la motivation en cours de route.
Ceci dit, peut être un jour...
Messages postés
19
Date d'inscription
samedi 7 novembre 2009
Statut
Membre
Dernière intervention
16 mai 2010

Excellent boulot! Projet interessant et avancé, interface claire & soignée... Je pense que tu mérites amplement la note maximale! ;)
Messages postés
147
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
14 novembre 2009

Impressionnant!
Je me garderai bien de critiquer ton code, il est trop volumineux pour çà, les algorithmes que tu utilises me sont pour la plupart totalement inconnus, et je n'utilise pas les outils de développement Microsoft.
Aussi je me contenterai de faire quelques remarques sur la forme.
L'image d'adresse :
http://michel.vanthodiep.free.fr/misc/img1.png
montre un chevauchement qui apparaît dans plusieurs boîtes de dialogue; on y voit aussi que certaines légendes sont à moitié escamotées (je suis sous WinXP, résolution 1024x768).
Quelques fautes en passant :
"augmentation" et non pas "augmantation" dans le menu "Morphologie"
dans "Traitement\FloodFill", "couleur de fond" et non pas "couleur de font", etc...
Un aspect fort intéressant d'ImAnalyse (et à mon avis à développer) est son système de scripts, qui permet de faire toute une batterie de tests et d'en comparer les résultats : sous chaque image, cependant, il serait judicieux de préciser le nom du test; d'autre part, les "scripts" sont codés en C++ et sont donc incorporés à l'exécutable, ce qui fait qu'une modif ou un ajout requiert une recompilation! Il devrait être possible (du point de vue de l'utilisateur!) de rédiger un script dans un banal fichier texte, en respectant une syntaxe qui n'a pas à être très élaborée.
En espérant ces quelques remarques constructives...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.