Смекни!
smekni.com

Система автоматизированного анализа пространственной структуры изображений Подсистема центроидной (стр. 11 из 14)

throw Exception("");

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

//---------------------------------------------------------------------------

П.1.2. Файл «ParamCentriod.cpp»

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Seria.h"

#include "ParamCentroid.h"

#include "CentroidRelax.h"

#include "About.h"

#include <dir.h>

#include <stdlib.h>

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TFormParam *FormParam;

HDC dc;

//---------------------------------------------------------------------------

__fastcall TFormParam::TFormParam(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

// Открытие входного файла и подготовка его к работе

//---------------------------------------------------------------------------

void __fastcall TFormParam::OpenBtnClick(TObject *Sender)

{

char buffer[MAXPATH];

if (OpenDialog1->Execute())

{

if (ExtractFileExt(OpenDialog1->FileName)==".bmp")

{

OpenBMP();

RelaxBtn->Enabled=true;

}

else

if (ExtractFileExt(OpenDialog1->FileName)==".fld")

{

OpenFLD();

RelaxBtn->Enabled=true;

}

else

Application->MessageBoxA("Недопустимый тип файла", "Ошибка", MB_OK | MB_ICONEXCLAMATION);

}

}

//---------------------------------------------------------------------------

// Обработка нажатия кнопки "О программе..."

//---------------------------------------------------------------------------

void __fastcall TFormParam::AboutBtnClick(TObject *Sender)

{

FormAbout->Show();

}

//---------------------------------------------------------------------------

// Обработка нажатия кнопки "Релаксация"

//---------------------------------------------------------------------------

void __fastcall TFormParam::RelaxBtnClick(TObject *Sender)

{

string Name;

AnsiString FileSafeName;

int index;

if ((insideR && outsideR)&& (insideR <= outsideR))

{

for(int i=0;i<=exp;i++)

{

// показ имени открытого файла

FormParam->Caption=ExtractFileName("Обработка изображения....");

Imaging(insideR,outsideR);

// BEGIN DEBUG

dc=bmp->Canvas->Handle;

BitBlt(dc,0,0,Width,Height,bmp->Canvas->Handle,0,0,SRCCOPY);

// формирование имени файла

index=AnsiPos(ExtractFileExt(OpenDialog1->FileName),ExtractFileName(OpenDialog1->FileName));

Name = ExtractFileName(OpenDialog1->FileName).c_str();

Name = Name.substr(0,index-1);

Name = Name.substr(0,4)+"_" ; //вырезать первые 4 символа

FileSafeName=StrPas(Name.c_str()) + IntToStr(outsideR)+"_"+ IntToStr(insideR)+".bmp";

bmp->SaveToFile(FileSafeName);

// END DEBUG

insideR+=step;

outsideR+=step;

} // for

Application->MessageBoxA("Обработка завершена", "Информация", MB_OK | MB_ICONINFORMATION);

// показ имени открытого файла

FormParam->Caption=ExtractFileName(OpenDialog1->FileName);

}

else

Application->MessageBoxA("Внешний и внутренний радиусы заданы неверно", "Ошибка", MB_OK | MB_ICONEXCLAMATION);

}

//---------------------------------------------------------------------------

// Создание формы

//---------------------------------------------------------------------------

void __fastcall TFormParam::FormCreate(TObject *Sender)

{

char buffer[MAXPATH];

RelaxBtn->Enabled=false;

bmp=new Graphics::TBitmap;

// получение текущей директории проекта

OpenDialog1->InitialDir=getcwd(buffer, MAXPATH);

step=0;

exp=0;

}

//---------------------------------------------------------------------------

// Обработка ввода внешнего радиуса

//---------------------------------------------------------------------------

void __fastcall TFormParam::OutsideREditChange(TObject *Sender)

{

outsideR=StrToIntDef(OutsideREdit->Text,0);

if (outsideR==0) OutsideREdit->Text='0';

if (outsideR>=25)

{

Application->MessageBoxA("Значение внешнего радиуса должно быть не более 24", "Ошибка", MB_OK | MB_ICONEXCLAMATION);

OutsideREdit->Text='0';

}

}

//---------------------------------------------------------------------------

// Обработка ввода внутреннего радиуса

//---------------------------------------------------------------------------

void __fastcall TFormParam::InsideREditChange(TObject *Sender)

{

insideR=StrToIntDef(InsideREdit->Text,0);

if (insideR==0) InsideREdit->Text='0';

if (insideR>=25)

{

Application->MessageBoxA("Значение внутреннего радиуса должно быть не более 24", "Ошибка", MB_OK | MB_ICONEXCLAMATION);

InsideREdit->Text='0';

}

}

//---------------------------------------------------------------------------

// Выделение памяти массиву ImArr

//---------------------------------------------------------------------------

void __fastcall TFormParam::ImArrTakeMemory( unsigned short int Width, unsigned short int Height)

{

if (ImArr!=NULL)

{

// удаляем предыдущий массив

for (int i=0;i<=LastWidth;i++)

delete[] ImArr[i];

delete[] ImArr;

}

LastWidth= Width;

// выделяем память

ImArr = new unsigned short int*[Width];

for (int i=0;i<=Width;i++)

ImArr[i] = new unsigned short int [Height];

// обнуление массива

for (int i=0;i<=Width;i++)

{

for (int j=0;j<=Height;j++)

{

ImArr[i][j]=0;

}

}

}

//---------------------------------------------------------------------------

// Выделение памяти массиву СкArr

//---------------------------------------------------------------------------

void __fastcall TFormParam::CrArrTakeMemory(unsigned short int Width, unsigned short int Height)

{

if (CrArr!=NULL)

{

// удаляем предыдущий массив

for (int i=0;i<=LastWidth;i++)

delete[] CrArr[i];

delete[] CrArr;

}

LastWidth= Width;

// выделяем память

CrArr = new unsigned short int*[Width];

for (int i=0;i<=Width;i++)

CrArr[i] = new unsigned short int [Height];

// обнуление массива

for (int i=0;i<=Width;i++)

{

for (int j=0;j<=Height;j++)

{

CrArr[i][j]=0;

}

}

}

//---------------------------------------------------------------------------

// Серия

//---------------------------------------------------------------------------

void __fastcall TFormParam::SeriaBtnClick(TObject *Sender)

{

FormSeria->Show();

}

//---------------------------------------------------------------------------

// Открытие файла *.bmp

//---------------------------------------------------------------------------

void TFormParam::OpenBMP()

{

bmp->LoadFromFile( OpenDialog1->FileName);

Width=bmp->Width;

Height=bmp->Height;

ImArrTakeMemory(Width,Height);

CrArrTakeMemory(Width,Height);

// Transform coordinate

for (int i=0;i<=Width;i++)

{

for (int j=0;j<=Height;j++)

{

ImArr[i][j]=bmp->Canvas->Pixels[i][bmp->Height-j];

}

}

// показ имени открытого файла

FormParam->Caption=ExtractFileName(OpenDialog1->FileName);

}

//---------------------------------------------------------------------------

// Открытие файла *.fld

//---------------------------------------------------------------------------

void TFormParam::OpenFLD()

{

FILE *InFile;

void *data;

//FFileName = ;

if((InFile=fopen(OpenDialog1->FileName.c_str(), "rb"))==NULL)

{

Application->MessageBoxA("Ошибка открытия файла", "Ошибка", MB_OK | MB_ICONEXCLAMATION);

}

else

{

fread(&data,sizeof(unsigned short int),1, InFile);

Width=(unsigned short int)data;//ширина изображения

fread(&data,sizeof(unsigned short int),1, InFile);

Height=(unsigned short int)data;// длина изображения

ImArrTakeMemory(Width,Height);

CrArrTakeMemory(Width,Height);

for (int i=0;i<Width;i++)

{

for (int j=0;j<Height;j++)

{

fread(&data,sizeof(unsigned short int),1, InFile);

ImArr[i][j]=(unsigned short int)data;

} // for (j)

} // for (i)

// показ имени открытого файла

FormParam->Caption=ExtractFileName(OpenDialog1->FileName);

}

}

//---------------------------------------------------------------------------

// Закрытие программы

//---------------------------------------------------------------------------

void __fastcall TFormParam::FormClose(TObject *Sender,

TCloseAction &Action)

{

//освобождаем используемую память

if (Width!=0)

{

for (int i=0;i<=Width;i++)

{

delete[] ImArr[i];

delete[] CrArr[i];

}

delete[] ImArr;

delete[] CrArr;

}

delete(bmp);

FormSeria->Close();

}

//---------------------------------------------------------------------------

П.1.3.Файл «ParamCentriod.h»

//---------------------------------------------------------------------------

#ifndef ParamCentroidH

#define ParamCentroidH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Buttons.hpp>

#include <Dialogs.hpp>

#include <ExtCtrls.hpp>

//---------------------------------------------------------------------------

class TFormParam : public TForm

{

__published: // IDE-managed Components

TGroupBox *GroupRadius;

TLabel *Label1;

TEdit *OutsideREdit;

TLabel *Label2;

TEdit *InsideREdit;

TBitBtn *OpenBtn;

TBitBtn *RelaxBtn;

TOpenDialog *OpenDialog1;

TBitBtn *AboutBtn;

TBitBtn *SeriaBtn;

void __fastcall OpenBtnClick(TObject *Sender);

void __fastcall AboutBtnClick(TObject *Sender);

void __fastcall RelaxBtnClick(TObject *Sender);

void __fastcall FormCreate(TObject *Sender);

void __fastcall OutsideREditChange(TObject *Sender);

void __fastcall InsideREditChange(TObject *Sender);

void __fastcall SeriaBtnClick(TObject *Sender);

void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

private: // User declarations

int insideR;//внутренний

int outsideR;//внешний

public: // User declarations

// Global variable

unsigned short int **ImArr; // считанное изображение из файла *.bmp или *.mass

unsigned short int **CrArr; // массив кривизны

unsigned short int Width;

unsigned short int Height;

unsigned short int LastWidth;

int step;// шаг

int exp; // эксперименты

Graphics::TBitmap *bmp;

__fastcall TFormParam(TComponent* Owner);

void __fastcall ImArrTakeMemory( unsigned short int Width,unsigned short int Height);

void OpenBMP();

void OpenFLD();

void __fastcall CrArrTakeMemory(unsigned short int Width, unsigned short int Height); // выделение памяти динамическому массиву

};

//---------------------------------------------------------------------------

extern PACKAGE TFormParam *FormParam;

//---------------------------------------------------------------------------

#endif

П.1.4.Файл «CentriodRelax.cpp»

//---------------------------------------------------------------------------

#pragma hdrstop

#include "ParamCentroid.h"

#include "CentroidRelax.h"

// definitions

#define MASK_SIZE 24

#define PI 3.1415926535897932384626433832795

//---------------------------------------------------------------------------

COORDINATE FltArr[MASK_SIZE*MASK_SIZE]; // массив координат точек фильтра

int FltArr_index;

#pragma package(smart_init)

// Piksels Filter

void ClearFltArr(void);

//---------------------------------------------------------------------------

// Вычисление центра масс

//---------------------------------------------------------------------------

COORDINATE CentrMass(PIXEL CF)

{

COORDINATE P;

int M=0,Wx=0,Wy=0;

int Cx=0,Cy=0;

// работа с маской

for (int k=0;k<FltArr_index;k++)

{

M+= FormParam->ImArr[CF.x+FltArr[k].x][CF.y+FltArr[k].y]; // масса пикселей в фильтре

Wx+=(CF.x+FltArr[k].x)*FormParam->ImArr[CF.x+FltArr[k].x][CF.y+FltArr[k].y]; //веса пикселей по x

Wy+=(CF.y+FltArr[k].y)*FormParam->ImArr[CF.x+FltArr[k].x][CF.y+FltArr[k].y];//веса пикселей по y

}

// масса пикселей

M=M/255;

// масса пикселей по оси Ox

Wx=Wx/255;

// масса пикселей по оси Oy

Wy=Wy/255;

if (M!=0)

{

Cx=(int)Wx/M + 0.5;

Cy=Wy/M;

}

//центр масс

P.x=Cx;

P.y=Cy;

return P;

}

//--------------------------------------------------------------------------

// Вычисление кривизны в точке i,j

//--------------------------------------------------------------------------

int CentroidRelax(int i,int j,int insideR,int outsideR)

{ COORDINATE P;

double h;

int C;

PIXEL CF;

CF.mass=FormParam->ImArr[i][j];

if ((CF.mass==0)||(CF.mass==140))

return 140; // точка не на линии - фон цвет серый

else

{

CF.x=i;

CF.y=j;

P=CentrMass(CF);//определить координаты центра масс

// определить длину вектора h

h=sqrt(pow(P.x-CF.x,2.0)+pow(P.y-CF.y,2.0));

// вычислить кривизну для текущей точки изображения

//*100, потому что кривизна находится в промежутке [0;1)

C=(h/pow(insideR,2.0)+0.005)*100;

//C=h/insideR+0.5;

// сохранить в массив

}

return C;

}

//--------------------------------------------------------------------------

// Вычисление точек фильтра

//--------------------------------------------------------------------------

void RingFiltrPoint(int insideR,int outsideR)

{

float s;

ClearFltArr();

for(int i=-MASK_SIZE;i<=MASK_SIZE;i++)

{

for(int j=MASK_SIZE;j>=-MASK_SIZE;j--)

{

s=sqrt(i*i+j*j);

if ((s<=outsideR)&&(s>=insideR))

{

FltArr[FltArr_index].x=i;

FltArr[FltArr_index++].y=j;

}

} //for

} //for

}

//--------------------------------------------------------------------------

// Очистка массива точек фильтра

//--------------------------------------------------------------------------