Разработка методов совмещения фрагментов и инструментария на примере формирования панорамных изображений медицинских микроскопических препаратов

Анализ системы получения изображений микропрепарата Атлант-микро. Разработка модели, алгоритмов совмещения фрагментов. Разработка пользовательского интерфейса системы. Оценка качества совмещения фрагментов алгоритмом с бинаризацией на основе гистограмм.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 23.09.2012
Размер файла 8,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

if(vbin10_dif_mask[i]>max)

{

max=vbin10_dif_mask[i];

x1=vdx[i];

}

}// конец расчёта маски дифференса и поиска максимума

Form12->allg4_differens_mask.push_back(99999999);

vpic.push_back(max);

// обработка маской для сшивки по вертикали

Mask5x5vert(Ltmp,VPP[k].L);

Mask5x5vert(Ltmp1,VPP[k+1].L);

f.Binarization(VPP[k].L,Ltmp,7);

f.Binarization(VPP[k+1].L,Ltmp1,7);

Ltmp=VPP[k].LB;

Ltmp1=VPP[k+1].LB;

size_t sumdif2;

x2=x1;

y2=0;

for(size_t j=5;j<H-5;++j)// средний профиль по оси Y

{

double c_bin1=0,c_bin2=0;

for(size_t i=x2;i<(W-5);++i)

{

c_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+

Ltmp(i,j).comp[lyr::g_rgb]+Ltmp(i,j).comp[lyr::b_rgb])/3.0;

c_bin2+=(double)(Ltmp1(i-x2+5,j).comp[lyr::r_rgb]+

Ltmp1(i-x2+5,j).comp[lyr::g_rgb]+Ltmp1(i-x2+5,j).comp[lyr::b_rgb])/3.0;

}

vbin10_1_y.push_back(c_bin1/(double)(W-5-x2));

vbin10_2_y.push_back(c_bin2/(double)(W-5-x2));

}// конец расчёта среднего профиля по оси Y

double min=99999999;

for(int x=0;x<5;++x)// расчёт дифференса при смещении картинок отнсительно друг друга вверх и вниз

{

double sdifbin10=0;

double sdifbin10_1=0;

for(size_t i=x;i<vbin10_1_y.size();++i)

{

sdifbin10+=abs(vbin10_1_y[i]-vbin10_2_y[i-x]);

sdifbin10_1+=abs(vbin10_1_y[i-x]-vbin10_2_y[i]);

}

sdifbin10/=(double)(vbin10_1_y.size()-x);

sdifbin10_1/=(double)(vbin10_1_y.size()-x);

vbin10_dif_up.push_back(sdifbin10);

vbin10_dif_down.push_back(sdifbin10_1);

vdy_up.push_back(x);

vdy_down.push_back(-x);

if(sdifbin10<min)

{

min=sdifbin10;

y2=x;

}

if(sdifbin10_1<min)

{

min=sdifbin10_1;

y2=-x;

}

}// конец расчёта дифференса при смещении картинок отнсительно друг друга вверх и вниз

vdeltax.push_back(x2);

vdeltay.push_back(y2);

VPan[k+1]->Left=VPan[k]->Left+x2;

VPan[k+1]->Top=VPan[k]->Top+y2;

VPan[k+1]->Refresh();

ScrollBox1->Refresh();

++ProgressBar1->Position;

ProgressBar1->Refresh();

}// конец цикла по x_idx

double mid=0;

size_t count=0;

double mid_y=0;

size_t count_y=0;

for(size_t i=0;i<vdeltax.size();++i)

{

if(vpic[i]>0.011)

{

mid+=vdeltax[i];

++count;

mid_y+=vdeltay[i];

++count_y;

}

}

if(count==0)++count;

if(count_y==0)++count_y;

mid/=static_cast<double>(count);

mid_y/=static_cast<double>(count_y);

size_t n=ColCount;

for(size_t i=0;i<vpic.size();++i)

{

if(Vfixed[n*y_idx+i])

{

continue;

}

if(vpic[i]<0.011)

VPan[n*y_idx+i+1]->Left=VPan[n*y_idx+i]->Left+mid;

else

VPan[n*y_idx+i+1]->Left=VPan[n*y_idx+i]->Left+vdeltax[i];

}

} // конец цикла по y_idx

vector<int> vrowpart;

vrowpart.clear();

for(int y_idx=1;y_idx<RowCount;++y_idx)

{

vrowpart.clear();

vrowpart.push_back(ColCount*y_idx);

for(int x_idx=1;x_idx<=ColCount;++x_idx)

{

if(Vfixed[ColCount*y_idx+x_idx])

{

continue;

}

if(VPP[ColCount*y_idx+x_idx-1].idxRight>1000)

{

Vfixed[ColCount*y_idx+x_idx-1]=true;

}

if(VPP[ColCount*y_idx+x_idx].StitchedLeft&&x_idx<ColCount)

vrowpart.push_back(ColCount*y_idx+x_idx);

else

{

int xmax=0;

int idxT=VPP[vrowpart[0]].idxTop;

for(size_t i=0;i<vrowpart.size();++i)

if(VPP[vrowpart[i]].idxTop>idxT)

{

xmax=i;

idxT=VPP[vrowpart[i]].idxTop;

}

// сшивка по кадру

vector<double> vbin101;

vector<double> vbin102;

vector<double> vdif;

vector<double> vdif1;

vector<double> vdif_mask;

vector<int> vdx1;

vector<int> vdx2;

vector<int> vdy;

size_t idx=vrowpart[xmax]-ColCount;

size_t idx1=vrowpart[xmax];

int dTop=VPan[idx1]->Top;

int dLeft=VPan[idx1]->Left;

Ltmp=VPP[idx].L;

Ltmp1=VPP[idx1].L;

Mask5x5(VPP[idx].LB,Ltmp);

Mask5x5(VPP[idx1].LB,Ltmp1);

f.Binarization(Ltmp,VPP[idx].LB,7);//7 порог

f.Binarization(Ltmp1,VPP[idx1].LB,7);//7

double max=0;

for(size_t k=0;k<451;k+=25)

{

vbin101.clear();

vbin102.clear();

vdif.clear();

vdif_mask.clear();

vdx1.clear();

vdx2.clear();

for(size_t i=5;i<(W-5);++i)

{

double c_bin1=0;

for(size_t j=H-5-50-k;j<H-5-k;++j)

c_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+Ltmp(i,j).comp[lyr::g_rgb]+

Ltmp(i,j).comp[lyr::b_rgb])/3.0;

vbin101.push_back(c_bin1/(double)(45));

}

for(size_t i=5;i<(W-5);++i)

{

double c_bin2=0;

for(size_t j=5;j<90;++j)

c_bin2+=(double)(Ltmp1(i,j).comp[lyr::r_rgb]+Ltmp1(i,j).comp[lyr::g_rgb]+

Ltmp1(i,j).comp[lyr::b_rgb])/3.0;

vbin102.push_back(c_bin2/(double)(45));

}

for(int x=0;x<vbin101.size()-150;++x)

{

double sdifbin10=0;

double sdifbin10_1=0;

for(size_t i=x;i<vbin101.size();++i)

{

sdifbin10+=abs(vbin101[i]-vbin102[i-x]);

sdifbin10_1+=abs(vbin101[i-x]-vbin102[i]);

}

sdifbin10/=(double)(vbin101.size()-x);

sdifbin10_1/=(double)(vbin101.size()-x);

vdif.push_back(sdifbin10);

vdif1.push_back(sdifbin10_1);

vdx1.push_back(x);

vdx2.push_back(-x);

}

vdif_mask.resize(vdif.size(),0);

for(size_t i=3;i<vdif_mask.size()-3;++i)

{

double t=abs(-vdif[i-3]+vdif[i]*2-vdif[i+3]);

double t1=abs(-vdif1[i-3]+vdif1[i]*2-vdif1[i+3]);

if(t>max)

{

max=t;

y1=0;

x1=vdx1[i];

vdif_mask[i]=t;

}

if(t1>max)

{

max=t1;

y1=0;

x1=vdx2[i];

vdif_mask[i]=t1;

}

}

}

x2=x1;

y2=y1;

vbin101.clear();

vbin102.clear();

vdif.clear();

vdif1.clear();

vdif_mask.clear();

vdx1.clear();

vdx2.clear();

vbin101.reserve(100);

vbin102.reserve(100);

vdif.reserve(100);

vdif1.reserve(100);

vdif_mask.reserve(100);

vdx1.reserve(100);

vdx2.reserve(100);

Ltmp=VPP[idx].L;

Ltmp1=VPP[idx1].L;

Mask5x5vert(VPP[idx].LB,Ltmp);

Mask5x5vert(VPP[idx1].LB,Ltmp1);

f.Binarization(Ltmp,VPP[idx].LB,7);//7 порог

f.Binarization(Ltmp1,VPP[idx1].LB,7);//7

if(x1>=0)

for(size_t j=H/4;j<H-5;++j)// средний профиль по оси Y

{

double c_bin1=0,c_bin2=0;

for(size_t i=x1;i<(W-5);++i)

{

c_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+Ltmp(i,j).comp[lyr::g_rgb]+

Ltmp(i,j).comp[lyr::b_rgb])/3.0;

c_bin2+=(double)(Ltmp1(i-x1+5,j-H/4+5).comp[lyr::r_rgb]+

Ltmp1(i-x1+5,j-H/4+5).comp[lyr::g_rgb]+Ltmp1(i-x1+5,j-H/4+5).comp[lyr::b_rgb])/3.0;

}

vbin101.push_back(c_bin1/(double)(W-5-x1));

vbin102.push_back(c_bin2/(double)(W-5-x1));

}// конец расчёта среднего профиля по оси Y

else

for(size_t j=H/4;j<H-5;++j)// средний профиль по оси Y

{

double c_bin1=0,c_bin2=0;

for(size_t i=5;i<(W-5)+x1;++i)

c_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+Ltmp(i,j).comp[lyr::g_rgb]+

Ltmp(i,j).comp[lyr::b_rgb])/3.0;

c_bin2+=(double)(Ltmp1(i-x1,j-H/4+5).comp[lyr::r_rgb]+

Ltmp1(i-x1,j-H/4+5).comp[lyr::g_rgb]+Ltmp1(i-x1,j-H/4+5).comp[lyr::b_rgb])/3.0;

}

vbin101.push_back(c_bin1/(double)(W-10+x1));

vbin102.push_back(c_bin2/(double)(W-10+x1));

}// конец расчёта среднего профиля по оси Y

for(size_t x=0;x<vbin101.size()-20;++x)// дифференс

{

double sdifbin10=0;

for(size_t i=x;i<vbin101.size();++i)

sdifbin10+=abs(vbin101[i]-vbin102[i-x]);

sdifbin10/=(double)(vbin101.size()-x);

vdif.push_back(sdifbin10);

vdy.push_back(x+H/4-5);

}// конец расчёта дифференса

vdif_mask.resize(vdif.size(),0);

max=-100;

for(size_t i=3;i<vdif_mask.size()-3;++i)// маска и поиск максимума

{

double t=abs(-vdif[i-3]+vdif[i]*2-vdif[i+3]);

vdif_mask[i]=abs(-vdif[i-3]+vdif[i]*2-vdif[i+3]);

if(t>max)

{

max=t;

vdif_mask[i]=t;

y2=vdy[i];

}

} // конец поиска максимума

size_t sumdif2;

vdeltax.push_back(x2);

vdeltay.push_back(y2);

vpic.push_back(max);

VPan[idx1]->Left=VPan[idx]->Left+x2;

VPan[idx1]->Top=VPan[idx]->Top+y2;

dTop-=VPan[idx1]->Top;

dLeft=VPan[idx1]->Left-dLeft;

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

{

VPan[vrowpart[i]]->Top=VPan[vrowpart[i]]->Top-dTop;

VPan[vrowpart[i]]->Left=VPan[vrowpart[i]]->Left+dLeft;

}

for(int i=xmax+1;i<vrowpart.size();++i)

{

VPan[vrowpart[i]]->Top=VPan[vrowpart[i]]->Top-dTop;

VPan[vrowpart[i]]->Left=VPan[vrowpart[i]]->Left+dLeft;

}

//конец сшивки по кадру

vrowpart.clear();

vrowpart.push_back(ColCount*y_idx+x_idx);

}

}

}

bool check=Vfixed[0];

TDateTime t1=GetTime();

Form1->Caption="Создание панорамных изображений Время работы алгоритма №4 = "+(t1-t);

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.