function varargout = prog(varargin)
% PROG M-file for prog.fig
% PROG, by itself, creates a new PROG or raises the existing
% singleton*.
%
% H = PROG returns the handle to a new PROG or the handle to
% the existing singleton*.
%
% PROG('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in PROG.M with the given input arguments.
%
% PROG('Property','Value',...) creates a new PROG or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before prog_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to prog_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help prog
% Last Modified by GUIDE v2.5 08-Mar-2011 23:25:27
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @prog_OpeningFcn, ...
'gui_OutputFcn', @prog_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before prog is made visible.
function prog_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to prog (see VARARGIN)
% Choose default command line output for prog
handles.output = hObject;
Canny= get(handles.sliderCanny, 'Value');
set(handles.textCanny, 'String', Canny)
Rho= get(handles.sliderRho, 'Value');
set(handles.textRho, 'String', Rho)
Theta= get(handles.sliderTheta, 'Value');
set(handles.textTheta, 'String', Theta)
Threshold= get(handles.sliderThreshold, 'Value');
set(handles.textThreshold, 'String', Threshold)
Fillgap= get(handles.sliderFillgap, 'Value');
set(handles.textFillgap, 'String', Fillgap)
Minlength= get(handles.sliderMinlength, 'Value');
set(handles.textMinlength, 'String', Minlength)
NHood= get(handles.sliderNHood, 'Value');
set(handles.textNHood, 'String', NHood)
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes prog wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = prog_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in btnOpen.
function btnOpen_Callback(hObject, eventdata, handles)
% hObject handle to btnOpen (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Открываем
[filename, pathname] = uigetfile( ...
{'*.jpg;*.jpeg;*.jpe','JPEG (*.jpg;*.jpeg;*.jpe)'; ...
'*.png', 'PNG (*.PNG)'; ...
'*.tiff;*.tif','TIFF (*.tiff;*.tif)'; ...
'*.*', 'All Files (*.*)'}, ...
'Выберите изображение');
fullname=strcat(char(pathname),char(filename));
handles.file_my = filename;
guidata(gcbo, handles);
% читаем и проверяем
try
image = imread(fullname);
catch
% Проверка, был ли открыт файл
if (filename == 0)
errordlg('Вы ничего не выбрали!', 'Внимание!')
return
else
errordlg('Такие не обрабатываем!', 'Ошибка!')
return
end
end
% Отображение исходного изображения
axes(handles.axes1);
imshow(image),title(['Исходное изображение:',filename]),hold off;
% Предобработка изображения
% обрезка + преобразоввание в оттенки серого + приведение
% значений пикселов к диапазону [0, 1]
%Интелектуальная обрезка изображения по горизону + 10%
[M,N]=size(image);
N=N/ndims(image);%делим на размерность матрицы т.к. RGB
nebo=rgb2gray(mat2gray(image(:,ceil(N/2),:)));%получаем центральный
% вектор столбец на изображении (полутоновый [0, 1] в double)
for s=ceil(M*.2):M
if (nebo(s,1) < 0.7*median(nebo(:)))% подбираем оптимальный
nebo=s;% размер по высоте: обрезать не меньше 20% а дальше до тех пор
break;% пока не встретим пиксел с яркостью меньше средней в этом столбце
elseif (s>M*.7)%если прошли больше 70% то обрезать на половину
nebo=ceil(M*.5);
break;
end;
end;
m=round(N*0.8);% m=round(s(1,2)*a) cy=round(s(1,2)*b)
cy=round(N*0.1);%должно выполняться условие a+2*b=1
colhigh=cy+m-1;%т.е. по горизонтали обрезаем на b% с двух сторон
image=image(nebo+M*.1:end,cy:colhigh,1:3); %обрезаем все три измерения
I=rgb2gray(mat2gray(image));% диапазон значений на выходе [0 1] в double
%Обрезка изображения на заданную величину
% [M,N]=size(image)
% N=N/ndims(image);%делим на размерность матрицы т.к. RGB
% m=round(M*0.4);% m=round(M*a); rx=round(M*b)
% rx=round(M*0.6);%должно выполняться условие a+b=1
% rowhigh=rx+m-1;%т.е. по вертикали обрезаем на b% с одной стороны (сверху)
% n=round(N*0.8);% m=round(s(1,2)*a) cy=round(s(1,2)*b)
% cy=round(N*0.1);%должно выполняться условие a+2*b=1
% colhigh=cy+n-1;%т.е. по горизонтали обрезаем на b% с двух сторон
% image=image(rx:rowhigh,cy:colhigh,1:3); %обрезаем все три измерения
% I=rgb2gray(mat2gray(image));% диапазон значений на выходе [0 1] в double
filter2=figure('name','filter2');
figure(filter2)
h=imhist(I);
h1=h(1:10:256);
horz=1:10:256;stem(horz,h1,'r-o','fill')
title('Гистограмма исходного обрезанного Ч/Б изображения', 'FontSize',14 ,'fontName','Nautilus Pompilius');
% ВОССТАНОВЛЕНИЕ
%выполняет операцию заливки фоновыми пикселами исходного изображения (тип связности 4)
%пр. убирает темные пятна на белом фоне
I=imfill(I,4, 'holes');
%стабилизирем уровень яркости
%выравниваем средний уровень яркости изображения к значению 0.5
%пропорционально среднему уровеню яркости исходного Ч/Б изображения
x=mean(I(:))*100/0.5;
x=abs(abs(x)-100);
if mean(I(:))>0.5
k=.08;
g=intrans(I,'gamma',1+k*x);
elseif mean(I(:))<0.5
k=-.01;
g=intrans(I,'gamma',abs(1+k*x));
end
filter3=figure('name','filter3');
figure(filter3)
h=imhist(g);
h1=h(1:10:256);
horz=1:10:256;stem(horz,h1,'r-o','fill')
title('Гистограмма со стабилизированным уровнем яркости', 'FontSize',14 ,'fontName','Nautilus Pompilius');
handles.F1 = filter3;
%Убираем размытие
w=fspecial('log',3,0.9);%возвращает маску h фильтра, аналогичного последовательному
g1=imfilter(g,w,'conv','replicate');%применению фильтров Гаусса и Лапласа,
g=g-g1;% так называемого лапласиана-гауссиана.
%вычетаем изображение обработанное фильтром из исходного для
%восстановления полутонового изображения
%Повышаем контрастность
I=imadjust(g,[(find(h==max(h))/256) 1],[0 1],1);%min входной порог выставляется по значению
%яркости пикселов с самым большим одинаковым уровнем яркости на изображении
%(самый большой пик на гистограмме)
%Убираем шум
%Виньеровская фльтрация
%значение пиксела определяет среднее квадратичное отклонение яркости (дисперсия)
%и средние значение яркости
I = wiener2(I,[3 3]);
filter4=figure('name','filter4');
figure(filter4)
imshow(I,[])
title({'Изображение с преминением всех фильтров'}, 'FontSize',14 ,'fontName','Nautilus Pompilius');
handles.F2 = filter4;
% ВЫДЕЛЕНИЕ КОНТУРОВ
%первый проход с низким порогом
% выделение контуров на изображении методом Канни
canny= get(handles.sliderCanny, 'Value');
E = edge(I, 'canny', canny);
%увеличиваем толщину контуров
w=fspecial('gaussian',2,0.7);%возвращает маску h фильтра нижних частот Гаусса.
E=imfilter(E,w,'conv','replicate');%применение маски
filter4E=figure('name','filter4E');
figure(filter4E)
imshow(E,[])
title('выделение контуров на изображении (методом Канни)', 'FontSize',14 ,'fontName','Nautilus Pompilius');
handles.F3 = filter4E;
%отображение изображения преобразованного методом Канни
axes(handles.axes2);
imshow(E),title('выделение контуров на изображении (методом Канни)'),hold off;
% ПОИСК ЛИНИЙ
%параметры для преобрахования Хафа настроенные на изображения с низким качеством
a= get(handles.sliderRho, 'Value');%hough. [0...1] default 1 (в основном влияет на размер мат H по гор) + огран длины перпендикуляра
% (почти не влияет)
b= get(handles.sliderTheta, 'Value');%hough. [-90...89] default 89 огран угла (тета изм по часовой стрелке)
c= get(handles.sliderThreshold, 'Value');%houghpeaks. [0...Inf] default 0.5*max(H(:)) значение порога мат H
d= get(handles.sliderFillgap, 'Value');%houghlines. default 20 на растоянии меньше этого линии скеиваются
e= get(handles.sliderMinlength, 'Value');%houghlines. default 40 min длина
f= get(handles.sliderNHood, 'Value');%houghpeaks. default size(H)/50 учитывает влияние окрестности в мат Н
%максимальное значение парметра Rho для графического интерфейса
max_rho= norm(size(I))-0.1;
set(handles.sliderRho, 'Max', max_rho)
%создание матрицы Хафа
[H, T, R] = hough(E,'RhoResolution',a,'Theta', -85:0.5:b);
%поиск пиков в матрице
P = houghpeaks(H,10,'threshold',c*max(H(:)),'NHoodSize', max(2*ceil((size(H)/f)/2) + 1, 1));
%если пиков больше 10 (хорошее изображение) переход в режим для изображений с хорошим качеством
%повторное выделение контуров с высоким порогом и задания более жестких
%параметров для преобразования Хафа
if numel(P)/2==10
E = edge(I, 'canny', 0.5);
E = wiener2(E,[3 3]);
E=imfill(E,4, 'holes');
E=adpmedian(E,5);
%отображение изображения преобразованного через Канни
figure(filter4E)
imshow(E,[])
title('выделение контуров на изображении (методом Канни)', 'FontSize',14 ,'fontName','Nautilus Pompilius');
axes(handles.axes2);
imshow(E),title('выделение контуров на изображении (методом Канни)'),hold off;
handles.F3 = filter4E;
[H, T, R] = hough(E,'RhoResolution',a,'Theta', -85:0.5:b);
P = houghpeaks(H,5,'threshold',0.5*max(H(:)),'NHoodSize', max(2*ceil((size(H)/7)/2) + 1, 1));
end;
%отображение преобразования Хафа
axes(handles.axes3);
imshow(imadjust(mat2gray(H)),'XData',T,'YData',R,...
'InitialMagnification','fit');
title('Отображение пространства Хафа');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
colormap(hot);
plot(T(P(:,2)),R(P(:,1)),'o','color','blue');
hold off;
%получение координат линий
lines = houghlines(E,T,R,P, 'FillGap', d, 'MinLength', e);
%отображение выделенных линий
handles.F4 = figure('name','Search_of_lines');
imshow(image);
title('Отображение выделенных линий', 'FontSize',14 ,'fontName','Nautilus Pompilius'), hold on;
% ФИЛЬТРАЦИЯ ЛИНИЙ
%создание матрицы (из нулевых эл-тов для далальнейшего заполнения) для выделения одной пары линий
%по критерию min разницы между углами пресечения линий дороги с
%горизонтальной осью (по модулю)
good_lines=zeros(length(lines),length(lines));
for k = 1:length(lines) % цикл от 1 до кол-во линий
try
xy = [lines(k).point1; lines(k).point2];
catch
errordlg('Линии не найдены!', 'Внимание!')
end;
%значение угла между горизонтальной осью и перпендикуляром опущенным на
%линию (взят из преобразования Хафа)
tn=abs(lines(k).theta);
%он же но со знаком
tn1=lines(k).theta;
%длниа перпендикуляра
rho=lines(k).rho;
%угол пересечения с дорогой
ugol=180-90-tn;
%выдел. всей линии в зел. цв.
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
%отображение начала и конца линий подсвечиваемых соотв. жёлт. и пурпурный. цв.
plot(xy(1,1),xy(1,2),'x','LineWidth',7,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',7,'Color','m');
%подписываем параметры каждой линии
text(xy(1,1),xy(1,2),{['Theta: ' num2str(tn1)]; ['Rho: ',num2str(rho)]; ['ugol: ',num2str(ugol)]}, 'FontSize',14 ,'fontName','Nautilus Pompilius',...
'Color','white','HorizontalAlignment','left','BackgroundColor',[0.9 0.3 0.1],'EdgeColor', 'y');
%поиск линий под нужным углом
for t = 1:length(lines)%внутренний цикл от 1 до кол-во линий (сравниваем текущую линию с другими линиями)
if (t ~= k)%кроме самой себя
tc=abs(lines(t).theta);
tc1=lines(t).theta;
rho_two=lines(t).rho;
ugol_two=180-90-tc;
%разница по модулю между длинами препендикуляров
delta_rho=abs(abs(rho)-abs(rho_two));
%линии являются полосами дороги, если удовлетворяют критериям:
%1) разница по модулю между углами пересечения с дорогой не более 40град.
%2) если они имею разную длину перпендикуляров
%3) значения перпендикуляров положительные (отрицательные используются для гор. линий)
%4) углы между гор. осью и перпендикуляром имеют разный знак
%5) углы пересечения с дорогой лежат в диаразоне от 10 до 65 град.
if (ugol_two-40<=ugol && ugol<=ugol_two+40) && (delta_rho>2) && (rho>0 && rho_two>0) &&...
~(tn1>0 && tc1>0) && ~(tn1<0 && tc1<0) && (ugol>10 && ugol<65) && (ugol_two>10 && ugol_two<65)
%если условие выполнено то разница между углами
%пересечения с дорогой записываются в матрицу
good_lines(k,t)=abs(ugol_two-ugol);
end;
end;
end;
end;
% ОПРЕДЕЛЯЕМ НАШЕ ПОЛОЖЕНИЕ НА ДОРОГЕ
%отсеиваем все линии и оставляем лишь одну пару
%используем два способа определения своего положения на дороге:
%1) min разность двух углов пересечения с горизонтальной осью найденные
% на изображении должна быть меньше 35 градусов
%ИЛИ
%2) расстояние между точкой пересечения линий дороги (в проекции на ось X)
% и средней линией между линиями дороги меньше 60 (в пикселах)
%если лини удовлетворяющие критериям существуют, то
%из матрицы найти min елемент и если есть одинаковые
%(а их минумум 2 т.к. каждая линия входящая в пару на себе пару)
%взять первый элемент
if sum(good_lines(:)>0)
zero=1000*(good_lines==0);%т.к. нам нужен min элемент, а мат. изначально была
good_lines=good_lines+zero;%заполнена 0, то чтобы от них избавиться все 0 эл-ты увеличиваем на 1000
[k,t]=find(good_lines==min(good_lines(:)));
k=k(1,1);
t=t(1,1);
%берем координаты этой пары линий
xy_good=[lines(k).point1; lines(k).point2];
xy_two_good=[lines(t).point1; lines(t).point2];
%решаем задачю нахождения точки пересечения двух линий
%для этого представляем лини в обощенном виде A*x+B*y+C=0
%коэфф. первой линии
A1=(xy_good(1,2)-xy_good(2,2));
B1=(xy_good(2,1)-xy_good(1,1));
C1=det(xy_good);
%коэфф. второой линии
A2=(xy_two_good(1,2)-xy_two_good(2,2));
B2=(xy_two_good(2,1)-xy_two_good(1,1));
C2=det(xy_two_good);
%формула для точки пересечения (https://ru.wikipedia.org/wiki/%CF%F0%FF%EC%E0%FF)
tocka=(B1*C2-B2*C1)/(A1*B2-A2*B1);
%находим лнию лежащую посередине дороги
%ищем min разность между координатами 2-х линий дороги в проекции на ось X
rx=[abs(xy_good(1,1)-xy_two_good(1,1)), abs(xy_good(1,1)-xy_two_good(2,1)),...
abs(xy_good(2,1)-xy_two_good(1,1)), abs(xy_good(2,1)-xy_two_good(2,1))];
[raznx,nx]=min(rx);
switch nx
case 1
x_otr=min(xy_good(1,1),xy_two_good(1,1))+raznx/2;
otr=[x_otr, 1;x_otr, size(I,1)];
case 2
x_otr=min(xy_good(1,1),xy_two_good(2,1))+raznx/2;
otr=[x_otr, 1;x_otr, size(I,1)];
case 3
x_otr=min(xy_good(2,1),xy_two_good(1,1))+raznx/2;
otr=[x_otr, 1;x_otr, size(I,1)];
case 4
x_otr=min(xy_good(2,1),xy_two_good(2,1))+raznx/2;
otr=[x_otr, 1;x_otr, size(I,1)];
end;
%строим эту линию
plot(xy_two_good(:,1),xy_two_good(:,2),'LineWidth',4,'Color','red');
plot(xy_good(:,1),xy_good(:,2),'LineWidth',4,'Color','red');
plot(otr(:,1),otr(:,2),'LineWidth',4,'Color','blue');
plot(otr(1,1),otr(1,2),'x','LineWidth',7,'Color','yellow');
plot(otr(2,1),otr(2,2),'x','LineWidth',7,'Color','m');
%находим разность между средней линией и точкой пересечения линий дороги
delta=abs(tocka-x_otr);
%определяем находимся ли мы надороге или будем перескать трассу
%используя эти 2 способа
if (good_lines(k,t)>35) || (delta>60)
text(otr(1,1),(otr(1,2)+otr(2,2))/2,{['Траектория движения'];['Разница между углами: ',num2str(good_lines(k,t))];...
['Разница между коорд: ',num2str(delta)]},'FontSize',14 ,'fontName','AGCooperCyr',...
'Color','y','HorizontalAlignment','center','BackgroundColor',[0.3 0.4 0.2],'EdgeColor', 'b');
text(otr(1,1),(otr(1,2)+otr(2,2))/2+40,{'Есть пересечения с дорогой!'},...
'FontSize',17 ,'fontName','Glasten',...
'Color',[1 0.5 0],'HorizontalAlignment','center','EdgeColor',[1 0.5 0], 'LineWidth',3,'LineStyle','-');
else
text(otr(1,1),(otr(1,2)+otr(2,2))/2,{['Траектория движения'];['Разница между углами: ',num2str(good_lines(k,t))];...
['Разница между коорд: ',num2str(delta)]},'FontSize',14 ,'fontName','AGCooperCyr',...
'Color','y','HorizontalAlignment','center','BackgroundColor',[0.3 0.4 0.2],'EdgeColor', 'b');
end;
% ЗАПИСЫВАЕМ РЕЗУЛЬТАТЫ В ФАЙЛ
OUT=[good_lines(k,t);delta];
F=fopen('результат работы.txt','rt+');
if (F~=-1)
F=fopen('результат работы.txt','at+');
fprintf(F,'| %7.3f | % 7.3f | ',OUT);
fprintf(F,[filename '\n']);
fclose(F);
else
F=fopen('результат работы.txt','at+');
fprintf(F, '--------------------------------------------------------------------------------------------------------\n');
fprintf(F, '| Разница между углами | Разница между координатами | Файл \n');
fprintf(F, '--------------------------------------------------------------------------------------------------------\n');
fprintf(F,'| %7.3f | % 7.3f | ',OUT);
fprintf(F,[filename '\n']);
fclose(F);
end;
end;
set(handles.sliderRho, 'Enable', 'off')
set(handles.sliderTheta, 'Enable', 'off')
set(handles.sliderThreshold, 'Enable', 'off')
set(handles.sliderFillgap, 'Enable', 'off')
set(handles.sliderMinlength, 'Enable', 'off')
set(handles.sliderCanny, 'Enable', 'off')
set(handles.sliderNHood, 'Enable', 'off')
set(handles.btnSave, 'Enable', 'on')
set(handles.btnClear, 'Enable', 'on')
guidata(gcbo, handles);
% --- Executes on button press in btnSave.
function btnSave_Callback(hObject, eventdata, handles)
% hObject handle to btnSave (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
q = questdlg('Сохранить конечный результат.', 'Search of squares save', 'Да', 'Нет', 'Нет');
% Проверка выбора пользователя
if strcmp(q, 'Да')
try
[filename_out, pathname_out, filterindex_out] = uiputfile( ...
{'*.jpg', '(*.jpg;*.jpeg;*.jpe)'; ...
'*.tiff', '(*.tiff;*.tif)'},...
'Save as');
fullname_out=strcat(char(pathname_out),char(filename_out));
saveas(handles.F1,strcat(char(pathname_out),['1_hist_' char(filename_out)]))
saveas(handles.F2,strcat(char(pathname_out),['2_filter_' char(filename_out)]))
saveas(handles.F3,strcat(char(pathname_out),['3_canny_' char(filename_out)]))
saveas(handles.F4,strcat(char(pathname_out),['4_final_' char(filename_out)]))
catch
errordlg('Вы закрыли требуемое окно.', 'Ошибка!')
end;
end;
% --- Executes on button press in btnClear.
function btnClear_Callback(hObject, eventdata, handles)
% hObject handle to btnClear (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Чистим
clc
cla(handles.axes1,'reset')
cla(handles.axes2,'reset')
cla(handles.axes3,'reset')
title('');
% Create xlabel
xlabel('');
% Create ylabel
ylabel('');
% Create zlabel
zlabel('');
set(handles.sliderRho, 'Enable', 'on')
set(handles.sliderTheta, 'Enable', 'on')
set(handles.sliderThreshold, 'Enable', 'on')
set(handles.sliderFillgap, 'Enable', 'on')
set(handles.sliderMinlength, 'Enable', 'on')
set(handles.sliderCanny, 'Enable', 'on')
set(handles.sliderNHood, 'Enable', 'on')
set(handles.btnSave, 'Enable', 'off')
set(handles.btnClear, 'Enable', 'off')
try
close Search_of_lines
close filter2
close filter3
close filter4
close filter4E
catch
end;
% --- Executes on slider movement.
function sliderRho_Callback(hObject, eventdata, handles)
% hObject handle to sliderRho (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
Rho= get(hObject, 'Value');
set(handles.textRho, 'String', Rho);
% --- Executes during object creation, after setting all properties.
function sliderRho_CreateFcn(hObject, eventdata, handles)
% hObject handle to sliderRho (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on slider movement.
function sliderTheta_Callback(hObject, eventdata, handles)
% hObject handle to sliderTheta (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
Theta= get(hObject, 'Value');
set(handles.textTheta, 'String', Theta);
% --- Executes during object creation, after setting all properties.
function sliderTheta_CreateFcn(hObject, eventdata, handles)
% hObject handle to sliderTheta (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on slider movement.
function sliderThreshold_Callback(hObject, eventdata, handles)
% hObject handle to sliderThreshold (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
Threshold= get(hObject, 'Value');
set(handles.textThreshold, 'String', Threshold);
% --- Executes during object creation, after setting all properties.
function sliderThreshold_CreateFcn(hObject, eventdata, handles)
% hObject handle to sliderThreshold (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on slider movement.
function sliderFillgap_Callback(hObject, eventdata, handles)
% hObject handle to sliderFillgap (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
Fillgap= get(hObject, 'Value');
set(handles.textFillgap, 'String', Fillgap);
% --- Executes during object creation, after setting all properties.
function sliderFillgap_CreateFcn(hObject, eventdata, handles)
% hObject handle to sliderFillgap (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on slider movement.
function sliderMinlength_Callback(hObject, eventdata, handles)
% hObject handle to sliderMinlength (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
Minlength= get(hObject, 'Value');
set(handles.textMinlength, 'String', Minlength);
% --- Executes during object creation, after setting all properties.
function sliderMinlength_CreateFcn(hObject, eventdata, handles)
% hObject handle to sliderMinlength (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on slider movement.
function sliderNHood_Callback(hObject, eventdata, handles)
% hObject handle to sliderNHood (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
NHood= get(hObject, 'Value');
set(handles.textNHood, 'String', NHood);
% --- Executes during object creation, after setting all properties.
function sliderNHood_CreateFcn(hObject, eventdata, handles)
% hObject handle to sliderNHood (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on slider movement.
function sliderCanny_Callback(hObject, eventdata, handles)
% hObject handle to sliderCanny (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
Canny= get(hObject, 'Value');
set(handles.textCanny, 'String', Canny);
% --- Executes during object creation, after setting all properties.
function sliderCanny_CreateFcn(hObject, eventdata, handles)
% hObject handle to sliderCanny (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end