Application de segmentation des images médicales 3D en langage C
Application de segmentation des images médicales 3D en langage C
Cet article propose en détaille une application de segmentation des images médicales 3D en langage C.
Vous pourrez télécharger le fichier au format zip il contient le code sources complet
Cette application de segmentation des images médicales implémentée en builder6 c++, contient certains filtres connus et des gradients pour la détection du contour, ainsi que certaines transformations issues de la morphologie mathématique.
Extrait du code source :
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit6.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Unit5.h"
#include "LPE.cpp"
#include "CImage.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int moy;
double Histo[256];
typedef struct LPE{
int x;
int y;
int z; //intensité du pixel
double buffer_double;
int buffer_int;
int region;
} algo;
algo image[256][256];
int classe[256][256];
algo *minima ;
algo *minima1 ;
int nb_region;
//***********
BYTE R,G,B;
char *titre;
CImage *imagel,*image_contour,*origine,*resultat,*buffer1,*buffer2;
CImage **experience;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//------------------------- Ouvrir une image -----------------------------------
void __fastcall TForm1::ChargerImage1Click(TObject *Sender)
{
OpenPictureDialog1->Execute();
Form1->Image2->Picture->LoadFromFile(OpenPictureDialog1->FileName) ;
Form1->Image1->Visible=false;
Form1->PageControl2->Visible=true;
Form1->Label8->Visible=true;
int i,j;
//remplir la matrice image
for(i=0;i<256;i++)
{
for(j=0;j<256;j++)
{
matrix[i][j].moy=( GetRValue(Form1->Image2->Canvas->Pixels[i][j])+GetGValue(Form1->Image2->Canvas->Pixels[i][j])+GetBValue(Form1->Image2->Canvas->Pixels[i][j]) )/3;
matrix[i][j].x=i;
matrix[i][j].y=j;
}
}
}
//----------------------------- Enregistrer Image ------------------------------
void __fastcall TForm1::Enregistrer1Click(TObject *Sender)
{
if(SavePictureDialog1->Execute())
{
Form1->Image2->Picture->SaveToFile(ChangeFileExt(SavePictureDialog1->FileName, ".BMP"));
}
}
//------------------------------ Fermer la fenêtre principale ------------------
void __fastcall TForm1::Quitter1Click(TObject *Sender)
{
Form1->Close();
}
//----------------------------- A propos ---------------------------------------
void __fastcall TForm1::Apropos3Click(TObject *Sender)
{
Form6->Show();
}
//---------------------------------------------------------------------------
//--------------------Ouvrir IRM -----------------------------------------------
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
OpenPictureDialog1->Execute();
Form1->Image2->Picture->LoadFromFile(OpenPictureDialog1->FileName) ;
Form1->Image1->Visible=false;
Form1->PageControl2->Visible=true;
Form1->Label8->Visible=true;
Form1->Image8->Picture=Form1->Image2->Picture ;
Form1->Image5->Picture=Form1->Image2->Picture ;
Form1->Image3->Picture=Form1->Image2->Picture ;
int i,j;
//remplir la matrice image
for(i=0;i<=256;i++)
{
for(j=0;j<=256;j++)
{
matrix[i][j].moy=( GetRValue(Form1->Image2->Canvas->Pixels[i][j])+GetGValue(Form1->Image2->Canvas->Pixels[i][j])+GetBValue(Form1->Image2->Canvas->Pixels[i][j]) )/3;
matrix[i][j].x=i;
matrix[i][j].y=j;
}
}
}
//----------------------------- Histogramme ------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
Form2->Show();
Form1->Label1->Visible=true;
Form1->Image3->Visible=true;
TRect TheRect;
TheRect=Rect(Form2->Image1->Left+5,Form2->Image1->Top+5,290,410);
Form2->Image1->Canvas->Brush->Color = clWhite;
Form2->Image1->Canvas->FrameRect(TheRect);
Form2->Image1->Canvas->Pen->Color=clBlack;
Form2->Image1->Canvas->MoveTo(Form2->Image1->Left+15,50);
Form2->Image1->Canvas->LineTo(Form2->Image1->Left+15,380);
//Canvas->MoveTo(Form2->Image1->Left+15,380);
//Canvas->LineTo(Form2->Image1->Width-10,380);
int i,j,Nivgris;
for(i=0;i<256;i++)
{
Form2->HISTOG[i]=0;
}
for(i=0;i<=Form1->Image2->Picture->Height-1;i++)
{
for(j=0;j<=Form1->Image2->Picture->Width-1;j++)
{
Nivgris=Form1->matrix[i][j].moy;
Form2->HISTOG[Nivgris]++;
}
}
for(int i=0;i<256;i++)
{
Form2->Image1->Canvas->Pen->Color=RGB(i,i,i);
Form2->Image1->Canvas->MoveTo(i+Form2->Image1->Left+15,380);
Form2->Image1->Canvas->LineTo(i+Form2->Image1->Left+15,400);
Form1->Image3->Picture=Form1->Image2->Picture ;
}
for(int i=1;i<256;i++)
{
if(Form2->HISTOG[i]<=3800){
Form2->Image1->Canvas->Pen->Color=clBlack;
Form2->Image1->Canvas->MoveTo(i+Form2->Image1->Left+15,380);
Form2->Image1->Canvas->LineTo(i+Form2->Image1->Left+15,380-(Form2->HISTOG[i]/10)); }
else {
Form2->Image1->Canvas->Pen->Color=clBlack;
Form2->Image1->Canvas->MoveTo(i+Form2->Image1->Left+15,380);
Form2->Image1->Canvas->LineTo(i+Form2->Image1->Left+15,15);
}
}
}
//-----------------------Fermer l'application-----------------------------------
void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
Form1->Close();
}
//------------------------Bouton Save-------------------------------------------
void __fastcall TForm1::SpeedButton5Click(TObject *Sender)
{
if(SavePictureDialog1->Execute())
{
Image2->Picture->SaveToFile(ChangeFileExt(SavePictureDialog1->FileName, ".BMP"));
}
}
//-------------------- Erosion Binaire -----------------------------------------
void __fastcall TForm1::Erosion1Click(TObject *Sender)
{
int i,j,a;
float s;
s=StrToFloat(Form1->Edit3->Text);
for(i=1;i<256;i++)
{
for(j=1;j<256;j++)
{
a=erosion(i,j);
if (a>s){mat[i][j]=255;}
else mat[i][j]=0;
}
}
Form1->Image4->Height=Form1->Image2->Height;
Form1->Image4->Width=Form1->Image2->Width ;
//affichage dans image4
for(i=0;i<Form1->Image2->Picture->Width-1;i++)
{
for(j=0;j<Form1->Image2->Picture->Height-1;j++)
{
Form1->Image4->Canvas->Pixels[i][j]=RGB(mat[i][j],mat[i][j],mat[i][j]);
Form1->Image5->Picture=Form1->Image2->Picture ;
}
}
}
//----------------------Erosion au Niveaux de Gris -----------------------------
void __fastcall TForm1::Erosion2Click(TObject *Sender)
{
int i,j;
for(i=1;i<256;i++)
{
for(j=1;j<256;j++)
{
mat[i][j]=erosion(i,j);
}
}
Form1->Image4->Height=Form1->Image2->Height;
Form1->Image4->Width=Form1->Image2->Width ;
//affichage dans image4
for(i=0;i<Form1->Image2->Picture->Width-1;i++)
{
for(j=0;j<Form1->Image2->Picture->Height-1;j++)
{
Form1->Image4->Canvas->Pixels[i][j]=RGB(mat[i][j],mat[i][j],mat[i][j]);
Form1->Image5->Picture=Form1->Image2->Picture ;
}
}
}
//---------------------------------------------------------------------------
//--------------- Bouton Transformation morpho ------------------------------
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
int i,j;
switch ( ComboBox1->ItemIndex )
{
case 0 : // Erosion binaire
int i,j,a;
float s;
s=StrToFloat(Form1->Edit3->Text);
for(i=1;i<256;i++)
{
for(j=1;j<256;j++)
{
a=erosion(i,j);
if (a>s){mat[i][j]=255;}
else mat[i][j]=0;
}
}
Form1->Image4->Height=Form1->Image2->Height;
Form1->Image4->Width=Form1->Image2->Width ;
//affichage dans image4
for(i=0;i<Form1->Image2->Picture->Width-1;i++)
{
for(j=0;j<Form1->Image2->Picture->Height-1;j++)
{
Form1->Image4->Canvas->Pixels[i][j]=RGB(mat[i][j],mat[i][j],mat[i][j]);
Form1->Image5->Picture=Form1->Image2->Picture ;
}
}
break ;
case 1: // Dilatation Binaire
for(i=1;i<256;i++)
{
for(j=1;j<256;j++)
{
a=dilatation(i,j);
if (a>s){mat[i][j]=255;}
else mat[i][j]=0;
}
}
Form1->Image4->Height=Form1->Image2->Height;
Form1->Image4->Width=Form1->Image2->Width ;
//affichage dans image4
for(i=0;i<Form1->Image2->Picture->Width-1;i++)
{
for(j=0;j<Form1->Image2->Picture->Height-1;j++)
{
Form1->Image4->Canvas->Pixels[i][j]=RGB(mat[i][j],mat[i][j],mat[i][j]);
Form1->Image5->Picture=Form1->Image2->Picture ;
}
}
break ;
case 2: //Ouverture Binaire
for(i=1;i<256;i++)
{
for(j=1;j<256;j++)
{
a=erosion(i,j);
if (a>s){mat[i][j]=255;}
else mat[i][j]=0;
a=dilatation(i,j);
if (a>s){mat[i][j]=255;}
else mat[i][j]=0;
}
}
Form1->Image4->Height=Form1->Image2->Height;
Form1->Image4->Width=Form1->Image2->Width ;
//affichage dans image4
for(i=0;i<Form1->Image2->Picture->Width-1;i++)
{
for(j=0;j<Form1->Image2->Picture->Height-1;j++)
{
Form1->Image4->Canvas->Pixels[i][j]=RGB(mat[i][j],mat[i][j],mat[i][j]);
Form1->Image5->Picture=Form1->Image2->Picture ;
}
}
break ;
case 3: // Fermeture binaire
for(i=1;i<256;i++)
{
for(j=1;j<256;j++)
{
a=dilatation(i,j);
if (a>s){mat[i][j]=255;}
else mat[i][j]=0;
a=erosion(i,j);
if (a>s){mat[i][j]=255;}
else mat[i][j]=0;
}
}
Form1->Image4->Height=Form1->Image2->Height;
Form1->Image4->Width=Form1->Image2->Width ;
//affichage dans image4 et image 9
for(i=0;i<Form1->Image2->Picture->Width-1;i++)
{
for(j=0;j<Form1->Image2->Picture->Height-1;j++)
{
Form1->Image4->Canvas->Pixels[i][j]=RGB(mat[i][j],mat[i][j],mat[i][j]);
Form1->Image5->Picture=Form1->Image2->Picture ;
}
}
break ;
}