Разработка и реализация программного инструмента для оцифровки двумерного графика функции
Литературный обзор методов распознавания кромок для схожих задач. Объекты в приложении и их отображение. Генерация выходных данных. Алгоритм распознавания линии (графика), отличный от градиентных подходов и использующий алгоритм предварительной обработки.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 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