Лабораторная работа №3, страница 3
Описание файла
PDF-файл из архива "Лабораторная работа №3", который расположен в категории "". Всё это находится в предмете "системы распознавания образов" из 10 семестр (2 семестр магистратуры), которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 3 страницы из PDF
Постарайтесь написать свой код и разобраться вособенностях используемых функций. Код приведен только для справки.РезультатыЧасть 2. Поиск прямых с помощью преобразования ХафаСоздайте новый скрипт и скопируйте в него загрузку изображения пятиугольника и детекторграниц. Это наша отправная точка.Зададим пространство поиска в виде матрицы H размером 1000х1000.KMAX=1000;BMAX=1000;H=zeros(KMAX,BMAX);Зададим также диапазоны изменения параметров прямой на изображении:kmax=5;bmax=1000;Это необходимо, поскольку параметры прямых на изображении могут изменяться в диапазонеплюс-минус бесконечности, а нам надо задать конечный диапазон, содержащий практическизначимые прямые.Для реализации преобразования Хафа нам потребуется преобразовывать параметры прямойk,b в индексы KI,BI матрицы H и обратно.
Для этого можно воспользоваться формулами пересчета:KI=round( (k+kmax)*(KMAX-1)/(2kmax)+1);BI=round( (b+bmax)*(BMAX-1) /(2bmax)+1);k=(KI-1)*(2kmax)/(KMAX-1) – kmax;b=(BI-1)*(2bmax)/(BMAX-1) – bmax.Множители (KMAX-1)/(2kmax) и т.д. лучше просчитать заранее.Теперь все готово для реализации поиска линий.Реализуйте следующий алгоритм:-Для каждой точки A, которая является точкой границы:-Перебираем все возможные индексы KI от 1 до KMAX,-Для KI вычисляем соответствующее k,-Для k вычисляем b=-k*x+y;-Для b вычисляем индекс BI,-Если индекс BI попадает в матрицу H,то увеличиваем элемент H(KI,BI) на единицу.Выведите матрицу H на экран в виде изображения.Если все сделано правильно, на экране увидим четыре отчетливых отклика – «бабочки».(Если не получилось – в первую очередь проверьте правильность индексации точекизображения: должно быть A(y,x) ).Отрисуем найденные линии.Найдите положение (KI*,BI*) наибольшего отклика.Пересчитайте индексы (KI*,BI*) в параметры (k*,b*) прямой на изображении.Далее будем перебирать все возможные x, и для каждого из них рассчитывать y=round(k*x+b).Если пара (x,y) попадает на изображение A, то рисуем ее в виде черной точки: A(x,y)=0.Отобразите найденную прямую и убедитесь, что прямая прошла точно через одну из сторонпятиугольника.Мы получили только одну линию.
Как найти остальные? Самый простой способ – удалитьмаксимум из пространства поиска и повторить поиск (на практике так делать не нужно! Можно,например, разбивать пространство на блоки, искать максимумы в каждом из блоков и сортировать повеличине).Обратите внимание, что максимум занимает несколько клеток. Поэтому удалить одну точкумаксимума недостаточно, нужно удалить целую область.Удалим область максимума и повторим поиск и отрисовку прямой четыре раза.
В результатеполучится пятиугольник с четырьмя найденными линиями.РезультатыЧасть 3. Поиск прямых в нормальной формеВ предыдущей части мы нашли только четыре прямых из пяти. Куда пропала пятая прямая?Дело в том, что стандартная форма прямой y=kx+b не подходит для описания вертикальных прямых:для них k убегает в бесконечность, а b не определено. Более того, если прямая близка к вертикальной,параметры k и b становятся слишком большими и попросту не попадают в наше пространство H.Как выйти из данной ситуации? Можно, конечно, повернуть изображение на 90 градусов иповторить поиск, однако по ряду причин это не самый лучший путь. Мы пойдем другим путем.Запишем уравнение прямой в нормальной форме: =x cos + y sin .Здесь – это длина нормали к прямой, а – ее угол наклона.Тогда в дуальном пространстве будем получать не прямые, а синусоиды, и будем искать ихточки пересечения.Давайте реализуем этот метод.Создайте новый скрипт, скопируйте загрузку изображения и поиск границ.Зададим новое дуальное пространство.
По координате оно будет иметь 360 отсчетов, поодному на градус, а по оси размер равен диагонали изображения. Обратите внимание, что здесь насбудут интересовать только неотрицательные значения .[h,w]=size(A);RMAX=round(sqrt(w^2+h^2))+1;FMAX=360;H=zeros(RMAX,FMAX);Теперь реализуем сам алгоритм:-Для каждой точки A, которая является точкой границы:-Перебираем углы от 1 до 360,-Для вычисляем =x cos + y sin ,-Преобразуем в целочисленный индекс R=round()+1;-Если индекс R попадает в матрицу H,то увеличиваем элемент H(R, ) на единицу.Выведите матрицу H на экран в виде изображения.Если все сделано правильно, на экране увидим пучки синусоид, образующие пять отчетливыхоткликов в форме бабочек.Отрисуем найденные линии.Найдите положение (R*,F*) наибольшего отклика.Пересчитайте индекс R в параметр , вычитая единицу.Далее будем перебирать все возможные x, и для каждого из них рассчитывать y.
В соответствиис нормальной формой, y=(–x cos )/sin .Если пара (x,y) попадает на изображение A, то рисуем ее в виде черной точки: A(x,y)=0.Отобразите найденную прямую и убедитесь, что прямая прошла точно через одну из сторонпятиугольника.Чтобы найти остальные линии, удалим область максимума и повторим поиск и отрисовкупрямой пять раз. В результате получится пятиугольник со всеми линиями.Обратите внимание, что вертикальные линии получились очень тонкими.
Дело в том, что дляних значение мало, и небольшому шагу по x соответствует большой шаг по y. Что же делать?Ничего страшного. Для отрисовки вертикальных нужно перебирать не х, а y. Добавьте отрисовкувертикальных линий.РезультатыЧасть 4. Поиск отрезковВ практических задачах нас будут интересовать не только и не столько прямые, сколькоотрезки.
Для поиска отрезков нам, помимо параметров прямой, потребуется найти также начало иконец отрезка. К счастью, преобразование Хафа позволяет это сделать достаточно просто.Создайте новый скрипт, и скопируйте в него содержимое предыдущего скрипта.Расширим пространство поиска, добавив в него плоскости для накопления максимальной иминимальной координаты:Xmin=zeros(RMAX,FMAX);Ymin=zeros(RMAX,FMAX);Xmax=zeros(RMAX,FMAX);Ymax=zeros(RMAX,FMAX);Теперь будем накапливать не только голоса H, отданные за каждую прямую, но также икрайние точки прямых.Скорректируем теперь цикл преобразования Хафа.
После того, как мы увеличили счетчикH(R,), нужно дополнительно проверить – не является ли текущая точка максимальной илиминимальной по x или по y. Тогда по окончании цикла у нас будет информация не только о количестветочек в каждой прямой, но также начальная и конечная точка на прямой, то есть отрезок.Внесите в код эти изменения.Теперь можно отобразить отрезки.
Сделать это достаточно просто: теперь координата x(или y)в цикле отрисовки должна меняться не от 1 до ширины (высоты), а от минимальной координаты домаксимальной.Сделайте эти исправления, запустите код.Куда исчезли наши линии?!Мы нарисовали черные отрезки поверх черного пятиугольника, и их теперь не видно.Чтобы исправить ситуацию, создадим новое чистое изображение B того же размера, что иисходное, и будем рисовать на нем.Если все сделано правильно, мы увидим пять отрезков, образующих пятиугольник (отрезкимогут не доходить до конца пятиугольника из-за скругленных краев и погрешности метода)(Если не получилось, проверяйте поиск максимума и минимума в цикле, скорее всегоошиблись, копируя четыре одинаковые строчки).Как проверить, правильно ли найдены отрезки?Нарисуем найденные отрезки поверх пятиугольника, например – красным цветом.
Для этого вкрасную плоскость добавим 255 на месте точек границ, а из синей и зеленой эти точки уберем:B=uint8(B);R=bitor(A,imcomplement(B));G=bitand(A,B);B=bitand(A,B);Теперь склеим цветовые плоскости в одну трехмерную матрицу:C=cat(3,R,G,B);Отобразим ее на экране.Видим, что все отрезки найдены верно.РезультатыВопросы и задания для самостоятельной работыОтветы на вопросы даются в письменном виде и включаются в отчет.Задания выполняются в письменном виде. Полученный результат и текст скрипта добавляютсяв отчет.Часть 1Сравните границы, которые находятся функциями:E1=edge(A,’Sobel’);E2=edge(A,’Canny’);В чем отличие этих вызовов? Чем обусловлены отличия результата?Часть 2Почему в дуальном пространстве имеется только 4 максимума-бабочки? Куда делась ещеодна? Как ее найти?Что произойдет, если строить пятую линию, для которой отсутствует максимум в дуальномпространстве?Ускорьте алгоритм, вынеся постоянные множители за пределы цикла.
Используя функции tic иtoc, определите прирост производительности.Часть 3Почему графики синусоид в дуальном пространстве отображены вверх ногами?Модифицируйте алгоритм: перенесите начало координат в центр изображения. Убедитесь, чтолинии детектируются верно. Как изменится в этом случае дуальное пространство?Ускорьте алгоритм: вынесите из цикла расчет синусов и косинусов (задайте таблицу синусов).Используя функции tic и toc, определите прирост производительности.Часть 4Ускорьте алгоритм, используя информацию о направлении градиента яркости. Погрешностьопределения градиента принять равной 10 градусов. Используя функции tic и toc, определите приростпроизводительности.ПриложенияПриложения содержат возможный вид программы (скрипта) для каждой из 4х частейлабораторной работы.Используйте код только в ознакомительных целях. Постарайтесь написать свой код.Это нужно для того, чтобы мы с вами научились разрабатывать и поэтапноотлаживать большие фрагменты кода.Код может содержать преднамеренные ошибки.Приложение 1.
Скрипт детектирования границclear;close all;A=imread('pentagon.bmp'); %Загружаем изображение пятиугольника[h,w,p]=size(A);if p==3, A=rgb2gray(A); end %Преобразуем цветное в полутоновое сероеfigure,imshow(A),title('Загруженное изображение');Sx=[-1 0 1;-2 0 2;-1 0 1]; %Маска фильтра СобелаSy=Sx';A=im2double(A);Dx=imfilter(A,Sx);Dy=imfilter(A,Sy);%Производная по х даст вертикальные границы%Производная по у даст вертикальные границыfigure,imshow(Dx,[]),title('Вертикальные границы');figure,imshow(Dy,[]),title('Горизонтальные границы');G=sqrt(Dx.^2+Dy.^2); %Модуль градиент яркостиgamma=atan2d(Dy,Dx); %Фаза градиента яркостиfigure,imshow(imcomplement(G),[]),title('Градиент яркости');E=edge(A); %Границы единичной толщиныfigure,imshow(imcomplement(E)),title('Границы единичной толщины');Приложение 2.
Скрипт детектирования линий в стандартной форме%%%%----------------------------------------------Пример кода для л/р №3"Обработка границ, детектирование прямых и отрезков"Часть 2 - поиск прямых в стандартной формеclear;close all;A=imread('pentagon.bmp');%Загружаем изображение пятиугольника[h,w,p]=size(A);if p==3, A=rgb2gray(A);end %Преобразуем цветное в полутоновое серое% figure,imshow(A),title('Загруженное изображение'); %только для отладкиE=edge(A); %Границы единичной толщины% figure,imshow(imcomplement(E)),title('Границы единичной толщины'); %только дляотладки%Пространство поискаKMAX=1000;BMAX=1000;H=zeros(KMAX,BMAX);%Ограничения на линииkmax=5;bmax=1000;%Размеры изображения[h,w]=size(A);%Преобразование Хафаfor x=1:wfor y=1:hif E(y,x)==1for KI=1:KMAXk=(KI-1)*(2*kmax)/(KMAX-1)-kmax;b=-x*k+y;BI=round( (b+bmax)*(BMAX-1) /(2*bmax)+1);if (BI>=1)&&(BI<=BMAX)H(KI,BI)=H(KI,BI)+1;endendendendendfigure,imshow(-H,[]),title('Пространство поиска');for Pass=1:4%Ищем максимальный откликHbest=max(H(:));[KIbest,BIbest]=find(H==Hbest);KIbest=KIbest(1);BIbest=BIbest(1);kbest=(KIbest-1)*(2*kmax)/(KMAX-1) - kmax;bbest=(BIbest-1)*(2*bmax)/(BMAX-1) - bmax;%Рисуем прямуюfor x=1:wy=round(kbest*x+bbest);if (y>=1)&&(y<=h)A(y,x)=0;endend%Ставим заплатку поверх найденного максимумаd=5;H(KIbest-d:KIbest+d,BIbest-d:BIbest+d)=0;endfigure,imshow(A),title('Найденные прямые');Приложение 3.