void ClearFltArr(void)
{
FltArr_index=0;
for(int i=0;i<=MASK_SIZE*MASK_SIZE;i++)
{
FltArr[i].x=0;
FltArr[i].y=0;
}
}
//--------------------------------------------------------------------------
// Обработка изображения
//--------------------------------------------------------------------------
void Imaging(int insideR,int outsideR)
{
int C,index;
string Name;
AnsiString FileSafeName;
FILE *outIm;
// формирование имени файла
index=AnsiPos(ExtractFileExt(FormParam->OpenDialog1->FileName),
ExtractFileName(FormParam->OpenDialog1->FileName));
Name = ExtractFileName(FormParam->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)+".rlx";
outIm=fopen(FileSafeName.c_str(),"wb"); // открываем бинарный файл
fwrite(&FormParam->Width,sizeof(FormParam->Width),1, outIm);//ширина изображения
fwrite(&FormParam->Height,sizeof(FormParam->Height),1, outIm);//ширина изображения
// вычисляем точки фильтра
RingFiltrPoint(insideR,outsideR);
for (int i=outsideR;i<FormParam->Width-outsideR;i++)
{
for (int j=outsideR;j<FormParam->Height-outsideR;j++)
{
FormParam->CrArr[i][j]=CentroidRelax(i,j,insideR,outsideR);
FormParam->bmp->Canvas->Pixels[i][FormParam->Height-outsideR-j]=FormParam->CrArr[i][j]; // debug
}
}
// сохранение результатов в файл
for (int i=0;i<FormParam->Width;i++)
{
for (int j=0;j<FormParam->Height;j++)
{
fwrite(&FormParam->CrArr[i][j],sizeof(FormParam->CrArr[i][j]),1, outIm);//
}
}
fclose(outIm);
}
П.1.5 Файл «CentriodRelax.h»
//---------------------------------------------------------------------------
#ifndef CentroidRelaxH
#define CentroidRelaxH
#include <Math.h>
#include <fstream.h>
#include <ExtCtrls.hpp>
typedef struct
{
int mass;
int x;
int y;
} PIXEL;
typedef struct
{
int x;
int y;
} COORDINATE;
//function
//int CentroidRelax(PIXEL CF);
int CentroidRelax(int i,int j,int insideR,int outsideR) ;
void Imaging(int insideR,int outsideR);
#endif
П.1.6. Файл «Seria.cpp»
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "seria.h"
#include "ParamCentroid.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormSeria *FormSeria;
//---------------------------------------------------------------------------
__fastcall TFormSeria::TFormSeria(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// обработка нажатия кнопки -ОК
//---------------------------------------------------------------------------
void __fastcall TFormSeria::Button1Click(TObject *Sender)
{
if (seria)
{
FormParam->exp=StrToInt(EditExp->Text);
FormParam->step=StrToInt(EditStep->Text);
}
FormSeria->Hide();
}
//---------------------------------------------------------------------------
// обработка CheckBox1 - разрешить серию вычислений
//---------------------------------------------------------------------------
void __fastcall TFormSeria::CheckBox1Click(TObject *Sender)
{
if (CheckBox1->Checked)
{
seria=true;
this->Label1->Enabled=true;
this->Label2->Enabled=true;
this->UpDownExp->Enabled=true;
this->EditExp->Enabled=true;
this->UpDownStep->Enabled=true;
this->EditStep->Enabled=true;
}
else
{
seria=false;
this->Label1->Enabled=false;
this->Label2->Enabled=false;
this->UpDownExp->Enabled=false;
this->EditExp->Enabled=false;
this->UpDownStep->Enabled=false;
this->EditStep->Enabled=false;
FormParam->exp=0;
FormParam->step=0;
}
}
//---------------------------------------------------------------------------
// Создание формы
//---------------------------------------------------------------------------
void __fastcall TFormSeria::FormCreate(TObject *Sender)
{
this->Label1->Enabled=false;
this->Label2->Enabled=false;
this->UpDownExp->Enabled=false;
this->EditExp->Enabled=false;
this->UpDownStep->Enabled=false;
this->EditStep->Enabled=false;
}
//---------------------------------------------------------------------------
П.1.7. Файл «Seria.h»
//---------------------------------------------------------------------------
#ifndef seriaH
#define seriaH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TFormSeria : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TLabel *Label1;
TLabel *Label2;
TEdit *EditExp;
TUpDown *UpDownExp;
TEdit *EditStep;
TUpDown *UpDownStep;
TCheckBox *CheckBox1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall CheckBox1Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
bool seria; // true - серия
__fastcall TFormSeria(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFormSeria *FormSeria;
//---------------------------------------------------------------------------
#endif
РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ
При запуске программы, появляется главное окно, представленное на рис. П.2.1.
Главное окно программы
Рис. П.2.1
При нажатии на кнопку «Открыть» появляется диалог, представленный на рис. П.2.2.
Диалог «Отрыть»
Рис. П.2.2
При выборе файла в заголовке главного окна программы отображается имя открытого файла и кнопка «Релаксация » становится доступной (см рис. П.2.3).
Главное окно программы после открытия файла
Рис. П.2.3
При нажатии на кнопку «Серия» появляется диалог, представленный на рис. П.2.4.
Диалог «Серия»
Рис. П.2.4
При нажатии на кнопку «О программе…» появляется сообщение о версии программы и разработчике, представленное на рис. П.2.5.
Сообщение «О программе…»
Рис. П.2.5
Результаты релаксации изображения сериями кольцевых фильтров представлены на рис. П.2.6 – П.2.26. Изображения получены используя следующие параметры:
Максимальное кольцо:
– внешний радиус – 24 пиксела;
– внутренний радиусами – 20 пиксела.
Минимальное кольцо:
– внешний радиус – 5 пикселов;
– внутренний радиусами – 1 пиксел.
Шаг изменения колец – 1 пиксел.
Исходное изображение
Рис. П.2.6
Изображение, обработанное кольцевым фильтром Rвнеш=24, Rвнутр=20
Рис. П.2.7
Изображение, обработанное кольцевым фильтром Rвнеш=23, Rвнутр=19
Рис. П.2.8
Изображение, обработанное кольцевым фильтром Rвнеш=22, Rвнутр=18
Рис. П.2.9
Изображение, обработанное кольцевым фильтром Rвнеш=21, Rвнутр=17
Рис. П.2.10
Изображение, обработанное кольцевым фильтром Rвнеш=20, Rвнутр=16
Рис. П.2.11
Изображение, обработанное кольцевым фильтром Rвнеш=19, Rвнутр=15
Рис. П.2.12
Изображение, обработанное кольцевым фильтром Rвнеш=18, Rвнутр=14
Рис. П.2.13
Изображение, обработанное кольцевым фильтром Rвнеш=17, Rвнутр=13
Рис. П.2.14
Изображение, обработанное кольцевым фильтром Rвнеш=16, Rвнутр=12
Рис. П.2.15
Изображение, обработанное кольцевым фильтром Rвнеш=15, Rвнутр=11
Рис. П.2.16
Изображение, обработанное кольцевым фильтром Rвнеш=14, Rвнутр=10
Рис. П.2.17
Изображение, обработанное кольцевым фильтром Rвнеш=13, Rвнутр=9
Рис. П.2.18
Изображение, обработанное кольцевым фильтром Rвнеш=12, Rвнутр=8
Рис. П.2.19
Изображение, обработанное кольцевым фильтром Rвнеш=11, Rвнутр=7
Рис. П.2.20
Изображение, обработанное кольцевым фильтром Rвнеш=10, Rвнутр=6
Рис. П.2.21
Изображение, обработанное кольцевым фильтром Rвнеш=9, Rвнутр=5
Рис. П.2.22
Изображение, обработанное кольцевым фильтром Rвнеш=8, Rвнутр=4
Рис. П.2.23
Изображение, обработанное кольцевым фильтром Rвнеш=7, Rвнутр=3