Разработка и реализация программного инструмента для оцифровки двумерного графика функции

Литературный обзор методов распознавания кромок для схожих задач. Объекты в приложении и их отображение. Генерация выходных данных. Алгоритм распознавания линии (графика), отличный от градиентных подходов и использующий алгоритм предварительной обработки.

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

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

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

pack = packs.get(i);

}

}

packs.clear();

packs.add(pack);

return packs;

}

return result;

}

6. Реализация вспомогательного алгоритма

private void ordAction(Point in,double ord_angel){

Dimension dim = this.getSize();

int dx = dim.width / 2 - image.getWidth(null) / 2;

int dy = dim.height / 2 - image.getHeight(null) / 2;

Point p_tmp = this.toInitCord(p);

Point pt = new Point (p_tmp.x - dx,p_tmp.y - dy);

BufferedImage bimage = new BufferedImage(image.getWidth(null),

image.getHeight(null), BufferedImage.TYPE_INT_RGB);

// Draw the image on to the buffered image

Graphics2D g2 = bimage.createGraphics();

g2.drawImage(image, 0, 0, null);

g2.dispose();

int defColour = -1;

if (isPtInBImg(bimage,pt.x,pt.y)){

defColour = bimage.getRGB(pt.x, pt.y);

}

if(defColour==-1){

return;

}

int radius = 1;

ArrayList<Point> pair_ordInx_ptInx = new ArrayList<Point>();

ArrayList<Point> ord_vectors = new ArrayList<Point>();

ArrayList<List<Point>> packs = new ArrayList<List<Point>>();

boolean exit=true;

while (radius<max(dim.height,dim.width)/2){

packs = new ArrayList<List<Point>>();

ArrayList<Point> content = new ArrayList<Point>();

boolean contentwrite = false;

Point pt_tmp = new Point(pt.x - radius, pt.y - radius);

for (int i=0;i<=8*radius-1;i++){

double alpha = PI/2 * (i/(2*radius));

if (isPtInBImg(bimage,pt_tmp.x,pt_tmp.y) && defColour ==bimage.getRGB(pt_tmp.x, pt_tmp.y)){

content.add(pt_tmp);

contentwrite = true;

}

else if (contentwrite){

packs.add(content);

content = new ArrayList<Point>();

contentwrite = false;

}

pt_tmp = new Point(pt_tmp.x + (int)cos(alpha),pt_tmp.y + (int)sin(alpha));

}

if (contentwrite ){

if(!packs.isEmpty() && (packs.get(0).get(0).x == pt.x - radius ||

packs.get(0).get(0).y == pt.y - radius) ){

content.addAll(0, packs.get(0));

packs.set(0,content);

contentwrite = false;

}else{

packs.add(content);

contentwrite = false;

}

}

if(packs.size()>=2 && packs.size()!=3){

exit = false;

for (int i=0;i<4;i++){

Point ord_tmp = new Point(pt.x - (int) (cos(ord_angel*PI/180+PI/2*i)*10000),pt.y +

(int) (sin(ord_angel*PI/180+PI/2*i)*10000));

int best = 0;

int bestPoint = 0;

double s = -3;

int pVx = ord_tmp.x - pt.x;

int pVy = ord_tmp.y - pt.y;

double pL = sqrt(pow(pVx,2) + pow(pVy,2));

//check all points->

for (int k=0;k<packs.size();k++){

for (int j = 0;j<packs.get(k).size();j++){

Point middle = packs.get(k).get(j);

int cVx = middle.x-pt.x;

int cVy = middle.y-pt.y;

double cL = sqrt(pow(cVx,2) + pow(cVy,2));

double s_tmp = ((double)pVx/pL)*((double)cVx/cL) +

((double)pVy/pL)*((double)cVy/cL);

if (s_tmp>=s){

s=s_tmp;

best = k;

bestPoint = j;

}

}

}

//<-check all points

ord_vectors.add(new Point(pVx,pVy));

pair_ordInx_ptInx.add(new Point(best,bestPoint));

}

break;

}else{

radius++;

}

}

if (exit){return;}

ArrayList<List<Point>> ord_packs = packs;

for(int indx = 0;indx<4;indx++){

pt = ord_packs.get(pair_ordInx_ptInx.get(indx).x)

.get(pair_ordInx_ptInx.get(indx).y);

Point pt_vect = ord_vectors.get(indx);

int radius_tmp=ord_packs.get(pair_ordInx_ptInx.get(indx).x).size();

radius = radius_tmp/2+1;

int width = ord_packs.get(pair_ordInx_ptInx.get(indx).x).size() ;

int iterations = 1;

boolean clearAllowed=true;

while (pt != null){

packs = new ArrayList<List<Point>>();

ArrayList<Point> content = new ArrayList<Point>();

boolean contentwrite = false;

boolean allPixelsAreFull = true;

Point pt_tmp = new Point(pt.x - radius, pt.y - radius);

for (int i=0;i<=8*radius-1;i++){

double alpha = PI/2 * (i/(2*radius));

if (isPtInBImg(bimage,pt_tmp.x,pt_tmp.y) && defColour ==

bimage.getRGB(pt_tmp.x, pt_tmp.y)){

content.add(pt_tmp);

contentwrite = true;

}

else if (contentwrite){

allPixelsAreFull = false;

packs.add(content);

content = new ArrayList<Point>();

contentwrite = false;

}

pt_tmp = new Point(pt_tmp.x + (int)cos(alpha),pt_tmp.y +

(int)sin(alpha));

}

if (contentwrite ){

if(!packs.isEmpty() && (packs.get(0).get(0).x == pt.x - radius ||

packs.get(0).get(0).y == pt.y - radius) ){

content.addAll(0, packs.get(0));

packs.set(0,content);

contentwrite = false;

}else{

packs.add(content);

contentwrite = false;

}

}

if (allPixelsAreFull && !packs.isEmpty()){

radius++;

}

else

{

iterations++;

List<List<Point>> tmp = getNextPoint_vectorAngelCriterion(packs,pt_vect,0,pt);

if (tmp != null){

if (tmp.get(0).size()>width/(iterations-1)){

clearAllowed = false;

radius++;

iterations--;

}

else

{

if((packs.size()<=2 /*|| iterations == 2*/) && clearAllowed){

for (int i=-(radius-1);i<=(radius-1);i++){

for (int j=-(radius-1);j<=(radius-1);j++){

if (isPtInBImg(bimage,pt.x + i,pt.y + j)){

bimage.setRGB(pt.x + i, pt.y + j, -1);

}

}

}

}

clearAllowed=true;

width = width + tmp.get(0).size();

if (width !=0){

radius = (width/iterations)/2+1;

}

int best = (tmp.get(0).size()-1)/2;

Point old_pt = pt;

pt = tmp.get(0).get(best);

}

}else{

pt = null;

}

}

}

}

image = bimage.getScaledInstance(bimage.getWidth(),bimage.getHeight(),BufferedImage.SCALE_DEFAULT);

};

7. Тестирование

В данном разделе приведен пример обработки и оцифровки тестового изображения с помощью предложенного алгоритма. Отсканированное изображение 3-х парабол показано на рис. 7. Попробуем идентифицировать самую правую из парабол

Рисунок 7. Пример графиков

После предварительной обработки со значением threshold=172 и включенной опцией утоньшения линий, получаем следующую картину

Рисунок 9. Результат фильтрации со значением threshold=172 и включенной опцией утоньшения линий

Выбрав крайние точки параболы, как конечные, произведем оцифровку с применением основного алгоритма. Получим варианты (рис 10)

Рисунок 10. Полученные варианты распознавания графиков

Правильный вариант, очевидно, первый (слева), который и выбираем. Далее выставляем оси координат в то же положение, что и на рисунке и затем генерируем точки в масштабе со значением по умолчанию

Рисунок 11. Полученные варианты распознавания графиков

Сохраним таблицу:

118.0

-45.11111116409302

118.0

-44.0

118.0

-42.88888883590698

116.88888895511627

-41.77777761220932

116.88888883590698

-40.66666668653488

116.88888907432556

-39.555555522441864

116.88888883590698

-38.444444596767426

115.77777791023254

-37.33333337306976

115.77777779102325

-36.222222208976746

115.77777779102325

-35.11111104488373

115.77777779102325

-33.99999988079071

115.77777779102325

-32.88888895511627

115.77777779102325

-31.777777791023254

114.66666662693024

-30.666666626930237

114.66666686534882

-29.5555557012558

114.66666662693024

-28.44444453716278

113.55555546283722

-27.333333253860474

113.55555546283722

-26.222222089767456

113.55555546283722

-25.111111164093018

113.55555546283722

-24.0

112.44444453716278

-22.888888835906982

112.44444453716278

-21.777777910232544

112.44444453716278

-20.666666746139526

112.44444453716278

-19.55555558204651

111.33333313465118

-18.4444442987442

111.33333337306976

-17.333333373069763

111.33333325386047

-16.222222208976746

110.22222220897675

-15.111111283302309

110.22222220897675

-14.000000119209291

109.11111104488373

-12.888888895511627

109.11111104488373

-11.777777731418611

109.11111104488373

-10.666666567325597

109.11111116409302

-9.555555403232578

108.0

-8.444444417953491

108.0

-7.333333492279053

108.0

-6.222222328186035

108.0

-5.111111164093018

106.88888895511627

-3.9999999403953623

106.88888895511627

-2.88888877630236

106.88888895511627

-1.7777778506279152

105.77777791023254

0.4444442987442656

104.66666674613953

2.6666666269302395

104.66666674613953

3.7777777910232544

104.66666674613953

4.888888955116274

103.55555546283722

6.000000000000004

103.55555546283722

7.111111164093021

102.44444453716278

8.22222208976746

102.44444453716278

9.333333253860477

102.44444453716278

10.444444417953495

101.33333313465118

11.555555701255798

101.33333325386047

12.666666626930237

100.22222220897675

13.777777791023256

100.22222220897675

14.888888716697695

99.11111104488373

15.999999940395357

98.0

17.111111164093018

98.0

18.222222328186035

96.88888895511627

19.33333331346512

95.77777791023254

20.4444442987442

95.77777767181396

21.55555546283722

94.66666674613953

22.666666626930237

93.55555546283722

23.777777910232547

92.44444453716278

24.888888835906982

91.33333325386047

25.99999988079071

90.22222220897675

27.11111104488373

89.11111104488373

28.222222268581394

88.0

29.333333492279053

86.88888907432556

30.444444477558136

85.77777791023254

30.4444442987442

84.66666662693024

31.55555546283722

83.55555546283722

32.666666746139526

82.44444453716278

32.666666746139526

81.33333325386047

32.66666662693024

80.22222220897675

32.666666626930244

76.88888895511627

29.33333331346512

75.77777779102325

28.222222208976746

74.66666674613953

27.111111283302307

73.55555546283722

27.111111164093018

72.44444453716278

26.0

71.33333325386047

24.888888716697693

71.33333325386047

23.777777791023254

70.22222220897675

22.66666662693024

69.11111092567444

21.555555522441868

69.11111116409302

20.444444596767426

68.0

19.333333492279053

66.88888895511627

18.222222149372104

66.88888895511627

17.111111223697666

65.77777779102325

16.00000011920929

65.77777779102325

14.888888955116277

64.66666674613953

13.777777791023254

64.66666674613953

12.666666626930237

63.55555546283722

11.55555558204651

63.55555546283722

10.444444417953495

62.44444453716278

9.333333253860477

62.44444453716278

8.22222208976746

62.44444453716278

7.111111164093021

61.333333253860474

5.9999998807907104

61.333333253860474

4.888888716697695

60.222222208976746

3.777777791023262

60.222222208976746

2.666666626930261

58.0

-2.8888888359069824

58.0

-4.0

56.88888895511627

-5.111111104488375

56.88888895511627

-6.222222268581395

56.88888895511627

-7.333333432674417

55.777777671813965

-8.444444537162784

55.777777910232544

-9.555555701255802

55.777777791023254

-10.666666626930242

54.666666746139526

-11.777777791023254

54.666666746139526

-12.888888716697693

54.666666746139526

-13.99999988079071

53.55555546283722

-15.11111116409302

53.55555546283722

-16.222222089767456

53.55555546283722

-17.333333253860474

52.44444453716278

-18.44444441795349

52.44444453716278

-19.55555558204651

52.44444453716278

-20.666666746139526

52.44444453716278

-21.777777910232544

51.333333253860474

-22.888888955116272

51.333333253860474

-24.00000011920929

51.333333253860474

-25.111111283302307

50.222222208976746

-26.222222208976746

50.222222328186035

-27.333333373069767

50.222222089767456

-28.4444442987442

49.11111116409302

-29.555555403232574

49.11111092567444

-30.666666567325596

49.11111104488373

-31.77777773141861

49.11111104488373

-32.88888889551163

48.0

-34.0

48.0

-35.11111116409302

46.88888895511627

-36.22222226858139

46.88888907432556

-37.33333343267441

46.88888883590698

-38.444444596767426

45.777777910232544

-39.5555557012558

45.777777671813965

-40.66666662693024

45.777777791023254

-41.777777791023254

45.777777791023254

-42.88888895511627

44.666666746139526

-43.99999988079071

44.666666746139526

-46.222222208976746

По полученным точкам строим график функции.

Рисунок 12. График, построенный по оцифрованным значениям

Как можно видеть, график, построенный по оцифрованным значениям, достаточно точно совпадает с оригинальным графиком, что подтверждает работоспособность разработанного алгоритма и программы.

алгоритм кромка градиентный данные

Заключение

В дипломной работе выполнена поставленная задача, а именно:

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

- разработана программа на Java реализующая этот алгоритм. Программа позволяет:

- читать с диска изображение, содержащее график функции;

- привязывать оси координат и определять масштабы по осям графика;

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

-генерация координат оцифрованного графика и сохранение результатов на диск в текстовой файл в виде таблицы координат точек.

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

Литература

1. Анцев Г.В.,Волков В.Ю.,Макаренко А.А.,Турнецкий Л.С. Выделение прямолинейных кромок на зашумленных изображениях методом ориентированной фильтрации // Цифровая обработка сигналов и ее применение: Тр. 13-й Междунар.конф./ИПУ РАН. Вып. 13, т.2, М., 2011, с. 93-96.

2. Анисимов Б.В.,Курганов В.Д.,Злобин В.К. Распознавание и цифровая обработка изображений. М.: Высшая школа, 1983.

3. Бутаков Е. А. Островский В. И., Фадеев И. Л. Обработка изображений на ЭВМ, М.: Радио и связь, 1987. -- 240 с.

4. Яне Б. Цифровая обработка изображений. М.: Техносфера, 2007

5. Bao P., Zhang L. and Wu X., Canny Edge Detection Enhancement by Scale Multiplication // IEEE Trans. Pattern Analysis and Machine Intelligence, v. 27, N 9, September 2005, pp. 1485-1490.

6. Canny J.A. A Computational approach to edge detection; IEEE Trans., Vol. PAMI-8, 679--698, 1986.

7. Demigny D., On Optimal Linear Filtering for Edge Detection // IEEE Trans. Image Processing, 11, 7, July 2002, 728-737.

8. Petrou M. and Kittler J., Optimal Edge Detectors for Ramp Edges // IEEE Trans. Pattern Analysis and Machine Intelligence, 13, 5, May 1991, 483-491.

9. Pratt W.K. Digital Image Processing. A John Wiley & Sons, 2007.

10. Tagare H. D. and deFigueiredo R. J. P., On the Localization Performance Measure and Optimal Edge Detection // IEEE Trans. Pattern Analysis and Machine Intelligence, v. 12,N 12, December 1990, 1186-1190.

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


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

  • Методы распознавания образов (классификаторы): байесовский, линейный, метод потенциальных функций. Разработка программы распознавания человека по его фотографиям. Примеры работы классификаторов, экспериментальные результаты о точности работы методов.

    курсовая работа [2,7 M], добавлен 15.08.2011

  • Обзор задач, возникающих при разработке систем распознавания образов. Обучаемые классификаторы образов. Алгоритм персептрона и его модификации. Создание программы, предназначенной для классификации образов методом наименьшей среднеквадратической ошибки.

    курсовая работа [645,2 K], добавлен 05.04.2015

  • Понятие системы распознавания образов. Классификация систем распознавания. Разработка системы распознавания формы микрообъектов. Алгоритм для создания системы распознавания микрообъектов на кристаллограмме, особенности его реализации в программной среде.

    курсовая работа [16,2 M], добавлен 21.06.2014

  • Оптико-электронная система идентификации объектов подвижного состава железнодорожного транспорта. Автоматический комплекс распознавания автомобильных номеров. Принципы и этапы работы систем оптического распознавания. Особенности реализации алгоритмов.

    дипломная работа [887,3 K], добавлен 26.11.2013

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

    курсовая работа [194,4 K], добавлен 16.12.2012

  • Выбор и обоснование методов составления схемы алгоритма и разработки программы для построения графика временной функции, работающей как в машинном, так и в реальном времени. Алгоритм Горнера. Программа на языке Quick BASIC (с распечаткой листинга).

    курсовая работа [55,1 K], добавлен 21.11.2012

  • Реализация интегрирования функции методами прямоугольников, трапеций, Симпсона. Построение графика сравнения точности решения методов интегрирования в зависимости от количества разбиений. Алгоритм расчета энтропии файлов с заданным расширением.

    контрольная работа [1011,0 K], добавлен 04.05.2015

  • Разработка программной базы для исследований в области распознавания речи и поиска ключевых слов в ней. Расчет mel-фильтров. Скрытые марковские модели. Применение в алгоритме сверточного декодирования Витерби. Методы визуализации и обработки аудиоданных.

    курсовая работа [1,1 M], добавлен 01.06.2015

  • Понятие и особенности построения алгоритмов распознавания образов. Различные подходы к типологии методов распознавания. Изучение основных способов представления знаний. Характеристика интенсиональных и экстенсиональных методов, оценка их качества.

    презентация [31,6 K], добавлен 06.01.2014

  • Необходимость в системах распознавания символов. Виды сканеров и их характеристики. Оптимальное разрешение при сканировании. Программы распознавания текста. Получение электронного документа. FineReader - система оптического распознавания текстов.

    презентация [469,2 K], добавлен 15.03.2015

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