Исследование эффективности пространственно-временной обработки изображений с использованием статистик среднего ранга при наличии импульсных помех
Задача пространственно-временной обработки изображений при наличии шумов и помех. Методы оптимизации при пространственно-временной обработке изображений. Структура специализированной программы, описание ее пользовательского интерфейса. Смета затрат.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 10.06.2013 |
Размер файла | 957,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
for (pImgCurr=pImg->curr;) {/* Бесконечный цикл обработки команд */
while (! getEvent()); WinHandleEvent();
if (SquareSize!=aBuff1 [3]||(pQ!=aBuff5 [3]&&nFilterType==4))
goto Filtering;
if (Var!=aBuff2 [3] || Pa!=aBuff3 [3] || Pb!=aBuff4 [3]) {
/* Вводим белый шум и импульсный шум */
Var=aBuff2 [3]; Pa=aBuff3 [3]; Pb=aBuff4 [3];
MsSetGraphCursor(CLOCK);
for (i=0; i<nSize; i++)
for (j=1; j<NIMAGE; j++) {
if ((Rnd=PulseRand())>=0) chr=(char) Rnd;
else chr=pImageBuff[0] [i];
chr+=(int) (Var*NRand());
if (chr==7 || chr==15) chr -;
else if (chr==8) chr++;
else if (chr>255) chr=255;
else if (chr<0) chr=0;
pImageBuff[j] [i]=chr;
}
ImageBoxItemRedraw (pImg, pImgItem[1]);
MsSetGraphCursor(ARROW);
goto Filtering;
}
if (event.what==cmComboBoxChanged) {
if (pComboBox->curr==pComboBoxItem[0]) nFilterType=event.p1;
else if (pComboBox->curr==pComboBoxItem[1])
nFilterationType=event.p1;
Filtering: /* Фильтруем зашумленное изображение */
nNSS=SquareSize=aBuff1 [3];
pQ=aBuff5 [3];
MsSetGraphCursor(CLOCK);
/* Пространственная фильтрация */
if (! nFilterationType) {
Filters2D[nFilterType] (pImageBuff[1], pImageBuff [NIMAGE-1],
nW, nH, nNSS);
/* Вычисляем СКО ошибок */
for (Rnd=Rnd1=0,
k=0.5*SquareSize, n=k*nW, l=nW - (k<<1), m=nH - (k<<1),
i=k; i<=m; i++, n+=nW)
for (j=k; j<=l; j++) {
chr=((int) pImageBuff[0] [n+j])-
((int) pImageBuff[1] [n+j]);
Rnd+=chr*chr;
chr=((int) pImageBuff[0] [n+j])-
((int) pImageBuff [NIMAGE-1] [n+j]);
Rnd1+=chr*chr;
}
FilteringError[0]=sqrt (Rnd/(l*m-1));
FilteringError[1]=sqrt (Rnd1/(l*m-1));
}
/* Временная фильтрация */
else {
for (i=0; i<nSize; i+=nW)
for (j=0; j<nW; j++) {
for (k=0; k<nNSS; k++) aTemp[k]=pImageBuff [k+1] [i+j];
pImageBuff [NIMAGE-1] [i+j]=
Filters1D[nFilterType] (aTemp, nNSS);
}
/* Вычисляем СКО ошибок */
for (Rnd=Rnd1=0, i=0; i<nSize; i++) {
chr=((int) pImageBuff[0] [i]) - ((int) pImageBuff[1] [i]);
Rnd+=chr*chr;
chr=((int) pImageBuff[0] [i]) - ((int) pImageBuff [NIMAGE-1] [i]);
Rnd1+=chr*chr;
}
FilteringError[0]=sqrt (Rnd/(nSize-1));
FilteringError[1]=sqrt (Rnd1/(nSize-1));
}
TableItemDraw (pTable, pTable->first->prev);
ImageBoxItemRedraw (pImg, pImgItem [NIMAGE-1]);
if (pImgCurr==pImgItem [NIMAGE-1]) pImgCurr=NULL;
MsSetGraphCursor(ARROW);
}
if (pImgCurr!=pImg->curr || nCurrLine!=pImgCurr->command) {
for (pImgCurr=pImg->curr, i=0; i<NIMAGE; i++)
if (pImgCurr==pImgItem[i]) {l=i; break;}
for (k=(nCurrLine=pImgCurr->command)*nW, j=0; j<nW; j++)
pImageLine[j]=pImageBuff[l] [k+j];
HistogramSetUp (pImageBuff[l]+k, pPDF[1], pHisto[1], aSrv2, nW,
nNumPoints2, nNP2);
WaitVRT();
GraphsRedraw (pGr[0]);
}
if (event.what==Command) {
switch (event.p1) {
case cmFileOpen:
/* Загружаем файл с тестовым изображением */
sprintf (aOf. FileName, «%s % s», aImagesDir, «*.pcx»);
if (BrowsePCXFile(&aOf)==cmOk) {
WinSetTitle (aFileName, pProgName, aOf. FileName);
/* Вводим белый шум и импульсный шум */
MsSetGraphCursor(CLOCK);
for (nCurrLine=-1, i=0; i<nSize; i++)
for (j=1; j<NIMAGE; j++) {
if ((Rnd=PulseRand())>=0) chr=(char) Rnd;
else chr=pImageBuff[0] [i];
chr+=(int) (Var*NRand());
if (chr==7 || chr==15) chr -;
else if (chr==8) chr++;
else if (chr>255) chr=255;
else if (chr<0) chr=0;
pImageBuff[j] [i]=chr;
}
ImageBoxItemRedraw (pImg, pImgItem[0]);
ImageBoxItemRedraw (pImg, pImgItem[1]);
MsSetGraphCursor(ARROW);
/* Фильтруем зашумленное изображение 2D фильтром */
goto Filtering;
}
break;
/* Просмотр и редактирование весов */
case cmFilterWeights:
if (GetFilterWeights()==cmOk) goto Filtering;
break;
/* Ввод параметров оптимизации */
case cmOptParams: GetOptParams();
break;
/* Оптимизация весовых коэффициентов */
case cmOptRun:
/* Пространственная фильтрация */
if (! nFilterationType) {
/* Вычисляем размерность вектора параметров X */
for (i=k=l=0; i<nNSS; i++, l+=nNSS)
for (j=0; j<nNSS; j++) if (pWSigns [l+j]) k++;
/* Если размерность задачи меньше двух, то выход */
if (k<2) break;
/* Перераспределяем память под вектор параметров X */
if (k!=MX) {
if (X!=NULL) {free(X); free(Xl); free(Xh);}
X=malloc((MX=k)*SZF);
Xl=malloc (MX*SZF);
Xh=malloc (MX*SZF);
}
/* Задаем начальное значение вектора параметров X */
for (i=k=l=0; i<nNSS; i++, l+=nNSS)
for (j=0; j<nNSS; j++)
if (pWSigns [l+j]) {
Xl[k]=XL; Xh[k]=XH; X [k++]=pWF [l+j];}
}
/* Временная фильтрация */
else {
/* Вычисляем размерность вектора параметров X */
for (i=k=0; i<nNSS; i++) if (pWSigns[i]) k++;
/* Если размерность задачи меньше двух, то выход */
if (k<2) break;
/* Перераспределяем память под вектор параметров X */
if (k!=MX) {
if (X!=NULL) {free(X); free(Xl); free(Xh);}
X=malloc((MX=k)*SZF);
Xl=malloc (MX*SZF);
Xh=malloc (MX*SZF);
}
/* Задаем начальное значение вектора параметров X */
for (i=k=0; i<nNSS; i++)
if (pWSigns[i]) {
Xl[k]=XL; Xh[k]=XH; X [k++]=pWF[i];}
}
/* Выбираем барьерную функцию */
BFunc=BFuncs[nSelBFunc];
/* Запускаем оптимизацию */
nFuncCounter=nInterpolCounter=nItrCounter=n=0;
/* Метод 1-го этапа - глобальный */
if (nSelGlobalMethod)
n=GlobalMethods [nSelGlobalMethod-1]();
/* Метод 2-го этапа - локальный */
aBegData[1]=rx;
LocalMethods[nSelMethod]();
rx=aBegData[1];
/* Получаем оптимальные веса из вектора параметров X */
Func(X);
GetOptInfo(0);
sprintf (aBuffText,
«Число итераций:%d\n»
«Число вычислений\nцелевой функции:%d»,
nItrCounter+n, nFuncCounter);
MessageBox («Статистика», aBuffText, (MaxX-280)>>1,
(MaxY-140)>>1,280,140);
break;
case cmQuit: goto exit;
} /* switch */;
} /* if command */
else if (event.what==Key) {
i=0;
switch (event.p1) {
case F2: i=cmFilterWeightsSave;
break;
case F3: i=cmFileOpen;
break;
case F4: i=cmFilterWeights;
break;
case F6: i=cmOptParams;
break;
case F9: i=cmOptRun;
break;
case F10:
/* Сохранение копии экрана в формате PCX */
ScreenToPCXFile();
break;
}
if (i) {CountResetCursor(pCount); putEvent (Command, i, 0);}
}
} /* for */
exit:
/* Освобождаем память */
for (i=0; i<NIMAGE; i++) free (pImageBuff[i]);
free(pImageLine);
free (pHisto[0]); free (pPDF[0]);
free (pHisto[1]); free (pPDF[1]);
free(pWF); free(pWSigns);
if (X!=NULL) {free(X); free(Xl); free(Xh);}
/* Восстанавливаем вектора прерываний и видеорежим */
ByeHandlers();
SaveCurrMode (argv[0]);
ReleaseMode();
}
/* файл opt2.c */
#include «opt2.h»
#define EPS_X 1e-8
/* Барьерные функции */
/* 1) Логарифмическая */
static float PASCAL
BarrierFunc1 (void) {
int i;
float x1, x2, z=0;
for (i=0; i<MX; i++) {
if ((x1=(X[i] - Xl[i]))<0.0 || (x2=(Xh[i] - X[i]))<0.0) return -1.0;
z+=-log (x1/(Xh[i] - Xl[i])+EPS_X) - log (x2/(Xh[i] - Xl[i])+EPS_X);
}
return z;
}
/* 2) Обратная */
static float PASCAL
BarrierFunc2 (void) {
int i;
float x1, x2, z=0;
for (i=0; i<MX; i++) {
if ((x1=(X[i] - Xl[i]))<0.0 || (x2=(Xh[i] - X[i]))<0.0) return -1.0;
z+=(fabs (Xl[i])/(x1+EPS_X)+fabs (Xh[i])/(x2+EPS_X));
}
return z;
}
/* Целевая функция */
float PASCAL
GoalFunc (float *X) {
int i, j, k, l, m, n, chr, nNSS=SquareSize;
float Var=0;
char aTemp[NIMAGE];
/* Фильтруем зашумленное изображение */
/* Пространственная фильтрация */
if (! nFilterationType) {
/* Получаем новые веса из вектора параметров X */
for (i=k=l=0; i<nNSS; i++, l+=nNSS)
for (j=0; j<nNSS; j++) if (pWSigns [l+j]) pWF [l+j]=X [k++];
Filters2D[nFilterType] (pImageBuff[1], pImageBuff [NIMAGE-1], nW, nH,
nNSS);
/* Вычисляем СКО ошибок */
for (k=0.5*SquareSize, n=k*nW, l=nW - (k<<1), m=nH - (k<<1),
i=k; i<=m; i++, n+=nW)
for (j=k; j<=l; j++) {
chr=((int) pImageBuff[0] [n+j])-
((int) pImageBuff [NIMAGE-1] [n+j]);
Var+=chr*chr;
}
FilteringError[1]=sqrt (Var/(l*m-1));
}
/* Временная фильтрация */
else {
/* Получаем новые веса из вектора параметров X */
for (i=k=0; i<nNSS; i++) if (pWSigns[i]) pWF[i]=X [k++];
for (i=0; i<nSize; i+=nW)
for (j=0; j<nW; j++) {
for (k=0; k<nNSS; k++) aTemp[k]=pImageBuff [k+1] [i+j];
pImageBuff [NIMAGE-1] [i+j]=Filters1D[nFilterType] (aTemp,
nNSS);
}
/* Вычисляем СКО ошибок */
for (i=0; i<nSize; i++) {
chr=((int) pImageBuff[0] [i]) - ((int) pImageBuff [NIMAGE-1] [i]);
Var+=chr*chr;
}
FilteringError[1]=sqrt (Var/(nSize-1));
}
nFuncCounter++;
return sqrt(Var);
}
/* Функция, отображающая текущие результаты оптимизации */
int PASCAL
GetOptInfo (int nItrCounter) {
WaitVRT();
TableItemDraw (pTable, pTable->first->prev);
ImageBoxItemRedraw (pImg, pImgItem [NIMAGE-1]);
return nItrCounter<100*MX;
}
/* Функция ввода параметров оптимизации */
static int near PASCAL
GetOptParams(void) {
int w=428, h=480, x=(MaxX-w)>>1, y=(MaxY-h)>>1, i, j, nOff,
nNSS=SquareSize;
float *pTmp;
LPListItem tcb1, tcb2, tcb3;
LPList pCombo=ListInit (ListNew(), HCOMBOBOX, isSelected,
tcb1=ListBoxNew (pOptText1+1, x+119, y+30,220,4,4,0),
tcb2=ListBoxNew (pOptText2+1, x+119, y+53,220,4,4,0),
tcb3=ListBoxNew (pBFuncText+1, x+119, y+76,220,2,2,0),
NULL);
int **pSigns;
LPSTR *pNameSigns;
LPDTable p1;
/* Распределение памяти */
pSigns=malloc (nNSS*sizeof (int *));
pNameSigns=malloc (nNSS*sizeof(LPSTR));
for (i=0; i<nNSS; i++) {
pSigns[i]=malloc (nNSS*sizeof(int));
pNameSigns[i]=calloc (nNSS, 4);
itoa (i+1, pNameSigns[i], 10);
for (j=0; j<nNSS; j++) pSigns[i] [j]=pWSigns [j*nNSS+i];
}
/* Создание таблицы */
p1=ListInit (DTableNew(x+10, y+268, w - 37,20,20,9, nNSS, nNSS+1),
HDTABLE, isSelected,
DTableItemNew («N/N», NULLSTR, 40,0, OUT|COUNT),
NULL);
for (i=0; i<nNSS; i++)
ListAdd (p1, DTableItemNew (pNameSigns[i], pSigns[i], 40,0, IN|INT));
tcb1->command=nSelGlobalMethod;
tcb2->command=nSelMethod;
tcb3->command=nSelBFunc;
aBegData[0]=dx; aBegData[1]=rx; aBegData[2]=qf; aBegData[3]=hg;
aBegData[4]=nIterations; aBegData[5]=N;
aBegData[6]=XL; aBegData[7]=XH;
WinCreate («Параметры оптимизации», x, y, w, h,
ListInit (ListNew(), HSTATIC, 0,
StaticTextNew (pOptText1 [0], x+10, y+33),
StaticTextNew (pOptText2 [0], x+10, y+56),
StaticTextNew (pBFuncText[0], x+10, y+79),
StaticTextNew (pBegDataText[8], x+10, y+253),
NULL),
pCombo,
ListInit (TableNew(x+10, y+99,0,20,8,8), HTABLE, isSelected,
TableItemNew (NULLSTR, pBegDataText, 260,5, OUT|STRING),
TableItemNew (NULLSTR, aBegData, 70,9, IN|FLOAT),
NULL),
p1,
ListInit (ListNew(), HBUTTON, isSelected,
ButtonNew (HB_OK, x+w-80, y+30,70,24, cmOk),
ButtonNew (HB_CANCEL, x+w-80, y+60,70,24, cmCancel),
NULL),
NULL);
for(;) {
while (! getEvent()); WinHandleEvent();
switch (event.what) {
case Command:
if (event.p1==cmOk) {
if (aBegData[0]<=0 || aBegData[1]<0 ||
aBegData[2]<0 || aBegData[3]<=0 ||
aBegData[4]<=0 || aBegData[5]<=1 ||
aBegData[6] >= aBegData[7]) {
MessageBox («Ошибка», «Некорректный ввод данных!»,
(MaxX-240)>>1, (MaxY-120)>>1,240,120);
break;
}
dx=aBegData[0]; rx=aBegData[1];
qf=aBegData[2]; hg=aBegData[3];
nIterations=aBegData[4]; N=aBegData[5];
XL=aBegData[6]; XH=aBegData[7];
nSelGlobalMethod=tcb1->command;
nSelMethod=tcb2->command;
nSelBFunc=tcb3->command;
for (i=0; i<nNSS; i++)
for (j=0; j<nNSS; j++)
pWSigns [j*nNSS+i]=pSigns[i] [j];
}
putEvent (Key, ESC, event.p1);
break;
case Key:
if (event.p1==ESC) {
/* Освобождение памяти и выход */
for (i=0; i<nNSS; i++) {
free (pSigns[i]);
free (pNameSigns[i]);
}
free(pSigns);
free(pNameSigns);
return event.p2;
}
}
}
}
Размещено на Allbest.ru
Подобные документы
Изучение современных методик компьютерной обработки биомедицинских изображений с целью улучшения изображений для их наилучшего визуального восприятия врачом-диагностом и эффективного сжатия изображений – для надежного хранения и быстрой передачи данных.
курсовая работа [2,3 M], добавлен 15.04.2019Описание математических методов представления и обработки графических изображений. Описание разработанного программного дополнения. Описание функций и их атрибутов. Представление и обработка графических изображений. Результаты тестирования программы.
курсовая работа [1,7 M], добавлен 27.01.2015Обработка изображений на современных вычислительных устройствах. Устройство и представление различных форматов изображений. Исследование алгоритмов обработки изображений на базе различных архитектур. Сжатие изображений на основе сверточных нейросетей.
дипломная работа [6,1 M], добавлен 03.06.2022Цифровые рентгенографические системы. Методы автоматического анализа изображений в среде MatLab. Анализ рентгеновского изображения. Фильтрация, сегментация, улучшение изображений. Аппаратурные возможности предварительной нормализации изображений.
курсовая работа [890,9 K], добавлен 07.12.2013История появления и основные понятия графического дизайна. Выявление главных преимуществ и недостатков недеструктивной обработки изображений. Сравнение деструктивной и недеструктивной обработки изображений. Сущность и особенности двухмерной графики.
реферат [5,2 M], добавлен 05.05.2023Обзор существующего программного обеспечения для автоматизации выделения границ на изображении. Разработка математической модели обработки изображений и выделения контуров в оттенках серого и программного обеспечения для алгоритмов обработки изображений.
дипломная работа [1,7 M], добавлен 27.03.2013Основные категории изображений: растровые и векторные. Программы, работающие с растровыми изображениями. Инструменты для работы с обоими типами графики в программе Photoshop. Обзор современных программ обработки и просмотра графических изображений.
курсовая работа [49,0 K], добавлен 20.09.2010Методы обработки растровых изображений (кластеризация, пороговая и интерактивная сегментация). Разработка программного модуля для системы мониторинга биосферы и дистанционного зондирования. Создание пользовательского интерфейса программного модуля.
курсовая работа [2,2 M], добавлен 29.04.2015Определение характеристик входного воздействия во временной и частотной области. Синтез системы временным и частотным методами. Переход от частотного коэффициента передачи к передаточной функции. Оценка степени подавления помех и эффективности работы.
курсовая работа [580,2 K], добавлен 23.04.2013Изучение и программная реализация в среде Matlab методов обработки, анализа, фильтрации, сегментации и улучшения качества рентгеновских медицинских изображений. Цифровые рентгенографические системы. Разработка статически обоснованных алгоритмов.
курсовая работа [4,7 M], добавлен 20.01.2016