Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/32: Рейтинг темы: голосов - 32, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 50
1

Оцифровка графиков средствами Matlab

18.03.2014, 19:20. Просмотров 6343. Ответов 24
Метки нет (Все метки)

Помогите пожалуйста! пытаюсь оцифровать некоторую кривую но в итоге получается искаженный график. данную процедуру нужно провести со ложной кривой и с большой точностью, поэтому оцифровать в ручную не представляется возможным.
0
Миниатюры
Оцифровка графиков средствами Matlab  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2014, 19:20
Ответы с готовыми решениями:

Построение графиков в MATLAB
Я строю 3х мерный график из файла: a=load('сетка оси Х.txt '), b=load ('сетка по оси Y.txt ') c=...

MatLab построение графиков
Создайте скрипт-программу (m-файл) построения графиков. Создайте новое графическое окно и разбейте...

Построение графиков в MatLAB
Построение графиков в разном масштабе в одном окне трех переменных, т.е. с тремя осями ординат в...

Построение графиков в matlab
1) p=4/phi - гиперболическая спираль 2) 3xy^2=(x^3)-2 3) тут система x(t)=4cos(t) ...

24
2812 / 2109 / 86
Регистрация: 02.05.2010
Сообщений: 3,195
18.03.2014, 20:33 2
Цитата Сообщение от A___ Посмотреть сообщение
но в итоге получается искаженный график
Но ведь можно обрезать массивы х и у по краям.
0
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 50
18.03.2014, 20:58  [ТС] 3
А, что делать в этом случае? когда значения по оси Х уменьшаются
0
Миниатюры
Оцифровка графиков средствами Matlab  
2812 / 2109 / 86
Регистрация: 02.05.2010
Сообщений: 3,195
18.03.2014, 21:05 4
Цитата Сообщение от A___ Посмотреть сообщение
когда значения по оси Х уменьшаются
координаты х и у придется еще масштабировать. Вот, что у меня получилось при таком преобразовании:
Matlab M
1
2
x=(x-145)/10; y=(y-42)*100/150;
plot(x(55:end-30),y(55:end-30));grid
0
Миниатюры
Оцифровка графиков средствами Matlab   Оцифровка графиков средствами Matlab  
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 50
19.03.2014, 01:56  [ТС] 5
как быть со вторым рисунком?
0
2812 / 2109 / 86
Регистрация: 02.05.2010
Сообщений: 3,195
19.03.2014, 09:32 6
[quote="A___;5919566"]как быть со вторым рисунком?[/quote
Нужно проста знать, что именно и в каких осях вы хотите получить. На этом основании и делайте сдвиги по осям и масштабирование. В мое примере было фото параболы y = x^2. После преобразований координат получен график именно этой параболы с вершиной в начале координат на отрезке [-10; 10]
0
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
19.03.2014, 10:26 7
Цитата Сообщение от A___ Посмотреть сообщение
как быть со вторым рисунком?
сложный случай. Если одному аргументу соответствует несколько значений, при оцифровке изображения надо адаптивно подбирать окно и следовать им за линией на изображении. Общего решения тут пожалуй нет, без какой нибудь априорной информации. В общем я представляю себе алгоритм примерно такой:
1. Находим на изображении начало линии.
2. Оцениваем примерно ее толщину в пикселях и выбираем размер окна чуть больше(?) этой толщины(тут уже началась эмпирика)
3. По точкам полученным в этом окне строим линию регрессии, определяем по ней направление движения.
4. Перемещаем окно в этом направлении на некоторый шаг(?) и переходим на пункт 2.
Но этот алгоритм - первое что пришло в голову, наверно существуют более красивые, поищите.
Если значения по х не уменьшаются, то случай очень простой - просто сканируем изображения по столбцам, например так поступает функция find()
0
114 / 107 / 30
Регистрация: 29.03.2012
Сообщений: 240
19.03.2014, 17:14 8
Не так страшен черт, как его малюют=))
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
clear all; clc; close all;
a=imread('1.png');
imshow(a);
a1=rgb2gray(a);
bw=1-im2bw(a1,0.5);
figure(2), imshow(bw);
for i=1:size(bw,2)
   k=find(bw(:,i)==1);
   if isempty(k)==0
      bw(min(k):size(bw,1),i)=1;
      x1=i;
      y1=min(k);
      break;
   end
end
figure(3), imshow(bw);
for i=size(bw,2):-1:1
   k=find(bw(:,i)==1);
   if isempty(k)==0
      bw(min(k):size(bw,1),i)=1;
      x2=i;
      y2=min(k);
      break;
   end
end
figure(4), imshow(bw);
bw(end,x1:x2)=1;
figure(5), imshow(bw);
BWfill=imfill(bw,'holes');
figure(6), imshow(BWfill);
BWfinal = bwperim(BWfill); %обводим периметр замкнутой фигуры
figure(7), imshow(BWfinal);
BWfinal(y1:size(bw,1),x1)=0;
BWfinal(y2:size(bw,1),x2)=0;
BWfinal(end,x1:x2)=0;
figure(8), imshow(BWfinal);
%%% А дальше самое интересное, нужно записать массив точек по порядку=)
[X0, Y0]=find(BWfinal==1, 1, 'first');
[G,H]=find(BWfinal==1);
iks=[];
igr=[];
iks=[iks X0];
igr=[igr Y0];
display([X0 Y0]);
for i=1:length(G)
   tochka=[X0-1 X0-1 X0 X0+1 X0+1 X0+1 X0 X0-1; Y0 Y0+1 Y0+1 Y0+1 Y0 Y0-1 Y0-1 Y0-1];
   XX=tochka(1, 1);
   YY=tochka(2, 1);
    if BWfinal(XX, YY)==1
       iks=[iks XX];
       igr=[igr YY];
       X0=XX;
       Y0=YY;
    else
           XX=tochka(1, 2);
           YY=tochka(2, 2);
        if BWfinal(XX, YY)==1
           iks=[iks XX];
           igr=[igr YY];
           X0=XX;
           Y0=YY;
        else 
               XX=tochka(1, 3);
               YY=tochka(2, 3);
            if BWfinal(XX, YY)==1
               iks=[iks XX];
               igr=[igr YY];
               X0=XX;
               Y0=YY;
            else
                   XX=tochka(1, 4);
                   YY=tochka(2, 4);
                if BWfinal(XX, YY)==1
                   iks=[iks XX];
                   igr=[igr YY];
                   X0=XX;
                   Y0=YY;
                else
                       XX=tochka(1, 5);
                       YY=tochka(2, 5);
                    if  BWfinal(XX, YY)==1
                        iks=[iks XX];
                        igr=[igr YY];
                        X0=XX;
                        Y0=YY;
                    else
                           XX=tochka(1, 6);
                           YY=tochka(2, 6);
                        if BWfinal(XX, YY)==1
                           iks=[iks XX];
                           igr=[igr YY];
                           X0=XX;
                           Y0=YY;
                        else
                               XX=tochka(1, 7);
                               YY=tochka(2, 7);
                            if BWfinal(XX, YY)==1
                               iks=[iks XX];
                               igr=[igr YY];
                               X0=XX;
                               Y0=YY;
                            else
                                   XX=tochka(1, 8);
                                   YY=tochka(2, 8);
                                if BWfinal(XX, YY)==1
                                   iks=[iks XX];
                                   igr=[igr YY];
                                   X0=XX;
                                   Y0=YY;
                                else 
                                    break;
                                end
                            end
                        end
                    end
                end
            end
        end
    end
    BWfinal(iks(i+1), igr(i+1))=0;           
end
figure(33), hold off, plot(igr, -iks), hold on, grid on;
Оцифровка графиков средствами Matlab


Оцифровка графиков средствами Matlab
0
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 50
19.03.2014, 18:17  [ТС] 9
этот код подойдет и для других подобных рисунков?
0
114 / 107 / 30
Регистрация: 29.03.2012
Сообщений: 240
19.03.2014, 18:31 10
"подобных" - понятие растяжимое=) Этот код не универсален, например если в начале или в конце графика будет петля, то он отработает не корректно. Но и это не особо страшно, ведь глазами мы всегда видим где начало и конец графика, а значит для частных случаев можем слегка скорректировать код. В общем отличаться будет только та часть кода, где происходит выделение контура (толщиной в 1 пиксель). А этот страшный цикл должен работать для любой кривой=) Проверь, если будут вопросы, пиши.
1
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 50
19.03.2014, 18:39  [ТС] 11
Хорошо, спасибо большое за помощь!
0
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 50
19.03.2014, 20:12  [ТС] 12
Прошу прощения KAV0221, надоел наверно. Посмотрите пожалуйста, а если например вот такой рисунок?
0
Миниатюры
Оцифровка графиков средствами Matlab  
114 / 107 / 30
Регистрация: 29.03.2012
Сообщений: 240
19.03.2014, 22:54 13
Лучший ответ Сообщение было отмечено A___ как решение

Решение

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

Ну а дальше слегка подкорректировал код под этот случай.
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
clear all; clc; close all;
a=imread('1.jpg');
a1=rgb2gray(a);
a2=1-im2bw(a1,0.5); %бинаризация по порогу яркости
figure(2), imshow(a2);
kray1=find(a2(:,1)==1); %левая грань изображения
kray2=find(a2(1,:)==1);%верхняя грань изображения
kray3=find(a2(:,size(a2,2))==1); %правая грань изображения
kray4=find(a2(size(a2,1),:)==1);%нижняя грань изображения
if isempty(kray1)==0
    a2(min(kray1):max(kray1),1)=1;
end
if isempty(kray2)==0
    a2(1,min(kray2):max(kray2))=1;
end
if isempty(kray3)==0
    a2(min(kray3):max(kray3),size(a2,2))=1;
end
if isempty(kray4)==0
    a2(size(a2,1),min(kray4):max(kray4))=1;
end
figure(4),imshow(a2);
BWfill=imfill(a2,'holes'); %заливаем замкнутую фигуру
figure(5),imshow(BWfill);
BWfinal = bwperim(BWfill); %обводим периметр замкнутой фигуры
figure(6), imshow(BWfinal);
BWfinal=BWfinal(2:end-1,2:end-1); %обрезаем рамку
figure(7), imshow(BWfinal);
BWfinal(end:end+10,:)=0;
%%% А дальше самое интересное, нужно записать массив точек по порядку=)
 
for i=size(BWfinal,1):-1:1
   k=find(BWfinal(i,:)==1);
   if isempty(k)==0
      X0=i;
      Y0=min(k);
      break;
   end
end
% Y0=size(BWfinal,1)+1;
% X0=min(kray4);
[G,H]=find(BWfinal==1);
iks=[];
igr=[];
iks=[iks X0];
igr=[igr Y0];
display([X0 Y0]);
for i=1:length(G)
   tochka=[X0-1 X0-1 X0 X0+1 X0+1 X0+1 X0 X0-1; Y0 Y0+1 Y0+1 Y0+1 Y0 Y0-1 Y0-1 Y0-1];
   XX=tochka(1, 1);
   YY=tochka(2, 1);
    if BWfinal(XX, YY)==1
       iks=[iks XX];
       igr=[igr YY];
       X0=XX;
       Y0=YY;
    else
           XX=tochka(1, 2);
           YY=tochka(2, 2);
        if BWfinal(XX, YY)==1
           iks=[iks XX];
           igr=[igr YY];
           X0=XX;
           Y0=YY;
        else 
               XX=tochka(1, 3);
               YY=tochka(2, 3);
            if BWfinal(XX, YY)==1
               iks=[iks XX];
               igr=[igr YY];
               X0=XX;
               Y0=YY;
            else
                   XX=tochka(1, 4);
                   YY=tochka(2, 4);
                if BWfinal(XX, YY)==1
                   iks=[iks XX];
                   igr=[igr YY];
                   X0=XX;
                   Y0=YY;
                else
                       XX=tochka(1, 5);
                       YY=tochka(2, 5);
                    if  BWfinal(XX, YY)==1
                        iks=[iks XX];
                        igr=[igr YY];
                        X0=XX;
                        Y0=YY;
                    else
                           XX=tochka(1, 6);
                           YY=tochka(2, 6);
                        if BWfinal(XX, YY)==1
                           iks=[iks XX];
                           igr=[igr YY];
                           X0=XX;
                           Y0=YY;
                        else
                               XX=tochka(1, 7);
                               YY=tochka(2, 7);
                            if BWfinal(XX, YY)==1
                               iks=[iks XX];
                               igr=[igr YY];
                               X0=XX;
                               Y0=YY;
                            else
                                   XX=tochka(1, 8);
                                   YY=tochka(2, 8);
                                if BWfinal(XX, YY)==1
                                   iks=[iks XX];
                                   igr=[igr YY];
                                   X0=XX;
                                   Y0=YY;
                                else 
                                    break;
                                end
                            end
                        end
                    end
                end
            end
        end
    end
    BWfinal(iks(i+1), igr(i+1))=0;           
end
figure(33), hold off, plot(igr, -iks), hold on, grid on;
0
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 50
19.03.2014, 23:09  [ТС] 14
Огромное спасибо! Вы мне очень помогли.
0
0 / 0 / 0
Регистрация: 02.04.2014
Сообщений: 8
02.04.2014, 20:29 15
использовал код для данной картинки, но в итоге не получилось. Помогите пожалуйста подправить код для данной картинки
Оцифровка графиков средствами Matlab
0
114 / 107 / 30
Регистрация: 29.03.2012
Сообщений: 240
02.04.2014, 20:52 16
Странно, я скачал это изображение и скопировал код с моего последнего сообщения, все прекрасно работает

Оцифровка графиков средствами Matlab
0
0 / 0 / 0
Регистрация: 02.04.2014
Сообщений: 8
02.04.2014, 22:09 17
Видимо что то сделал не правильно, со второй попытки получилось). Не подскажите как можно сделать так, чтобы конечные значения по оси X чередовались с одинаковым шагом?
Оцифровка графиков средствами Matlab
0
114 / 107 / 30
Регистрация: 29.03.2012
Сообщений: 240
02.04.2014, 22:36 18
Не понял вопроса.... А сейчас они как чередуются?
0
0 / 0 / 0
Регистрация: 02.04.2014
Сообщений: 8
02.04.2014, 23:22 19
Есть числа по оси X которые повторяются, можно сделать так чтобы они не повторялись?
0
114 / 107 / 30
Регистрация: 29.03.2012
Сообщений: 240
03.04.2014, 10:09 20
по оси Y тут тоже есть повторяющиеся. Если вырезать повторяющиеся значения по оси Х, то вся форма графика потеряется
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2014, 10:09

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

Построение графиков в Matlab
как построить график подскажите пожалуйста)

Matlab создание графиков
задал в matlab переменные (картинка №1), прописал в m-file код уравнений, что нужно посчитать...

Построение графиков в Matlab
Подскажите пожалуйста как записать правильно эти формулы? На области я разбил должно быть 5 разных...

Перенос графиков из MATLAB в EXCEL
Имеются графики переходных процессов в маткаде, возможно их как то перенести в EXCEL?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.