/
Author: Гонсалес Р. Вудс Р. Эддинс С.
Tags: монография информационные технологии цифровая обработка изображений язык программирования matlab
ISBN: 5-94836-092-Х
Year: 2006
Text
МИР
цифровой обработки
Р. ГОНСАЛЕС, Р. ВУДС
С. ЭДДИНС
Цифровая
обработка
изображений
в среде MATLAB
Перевод с английского
В.В. Чепыжова
ТЕХНОСФЕРА
Москва
2006
Гонсалес Р., Вудс Р., Эддинс С.
Цифровая обработка изображений в среде MATLAB
Москва:
Техносфера, 2006. - 616с. ISBN 5-94836-092-Х
Монография предназначена для тех, кто хочет в короткие сроки освоить
методы обработки изображений с использованием пакета MATLAB.
Книга разбита на 12 глав, охватывающих самые важные области обработки
изображений: градационные преобразования, линейную и нелинейную про-
пространственную фильтрацию, вейвлеты, фильтрацию в частотной области, вос-
восстановление, регистрацию, сжатие, морфологическую обработку, сегментацию,
представление и описание областей и границ изображений, а также рас-
распознавание объектов и обработку цветных изображений.
Книга будет полезна всем, кто хочет овладеть практическими навыками
работы с изображениями, особенно специалистам по дистанционному зон-
зондированию, цифровому телевидению, компьютерной микроскопии, системам
безопасности, программистам и дизайнерам.
Digital
Image
Processing
using
MATLAB
Rafael C. Gonsales
Richard E. Woods
Steven L. Eddins
Prentice
Hall
© 2004 Digital image processing using MATLAB, 1-е Edition,
by WOODS, RICHARD E., published by Pearson Education,
Inc, publishing as Prentice Hall.
© 2006, ЗАО «РИЦ «Техносфера» перевод на русский язык,
оригинал-макет, оформление.
ISBN 5-94836092-Х
ISBN 0-13-008519-7 (англ.)
Содержание
Пролог 10
Благодарности 12
Об авторах 13
Глава 1
Введение 16
1.1. Некоторые основания 16
1.2. Что такое цифровая обработка изображений? 17
1.3. Система MATLAB и пакет Image Processing Toolbox 19
1.4. Задачи по обработке изображений 20
1.5. О вебсайте этой книги 22
1.6. Обозначения 22
1.7. Рабочая среда системы MATLAB 23
1.7.1. Рабочий стол MATLAB 23
1.7.2. Создание М-файлов в редакторе MATLAB 24
1.7.3. Вызов справки 25
1.7.4. Сохранение и загрузка рабочего пространства 26
1.8. Как организованы ссылки 27
Выводы 27
Глава 2
Цифровые изображения в MATLAB 28
Введение 28
2.1. Представление цифровых изображений 28
2.1.1. Координатное соглашение 29
2.1.2. Изображение как матрица 30
2.2. Загрузка изображений 31
2.3. Вывод изображения на дисплей 32
2.4. Сохранение изображений 34
2.5. Классы данных 39
2.6. Типы изображений 40
2.6.1. Полутоновые изображения 41
2.6.2. Двоичные изображения 41
2.6.3. Еще раз о терминологии 41
2.7. Конвертирование классов данных и типов изображений 42
2.7.1. Конвертирование классов данных 42
2.7.2. Конвертирование классов и типов изображений 42
2.8. Индексирование массивов 46
2.8.1. Индексирование векторов 46
2.8.2. Индексирование матриц 48
2.8.3. О размерности массивов 52
2.9. Некоторые важные стандартные массивы 52
Содержание
2.10. Введение в программирование М-функций 53
2.10.1. М-файлы 54
2.10.2. Операторы 56
2.10.3. Управление вычислительными потоками 64
2.10.4. Кодовая оптимизация программ 70
2.10.5. Интерактивный ввод/вывод 74
2.10.6. Краткое введение в смешанные массивы и структуры 77
Выводы 78
Глава 3
Преобразования яркости изображений и пространствен-
пространственная фильтрация 79
Введение 79
3.1. Некоторые основы 79
3.2. Преобразования яркости изображений 80
3.2.1. Функция imadjust 80
3.2.2. Логарифмические преобразования и преобразования растяже-
растяжения контрастности 82
3.2.3. Некоторые утилитные М-функции преобразования яркости 84
3.3. Обработка гистограмм и построение графиков функций 90
3.3.1. Нахождение и построение гистограмм 90
3.3.2. Эквализация гистограммы 95
3.3.3. Гистограммная подгонка (спецификация) 98
3.4. Пространственная фильтрация 103
3.4.1. Линейная пространственная фильтрация 103
3.4.2. Нелинейная пространственная фильтрация 111
3.5. Стандартные пространственные фильтры из пакета IPT 114
3.5.1. Линейные пространственные фильтры 114
3.5.2. Нелинейные пространственные фильтры 118
Выводы 121
Глава 4
Обработка в частотной области 122
Введение 122
4.1. Двумерное дискретное преобразование Фурье 122
4.2. Вычисление и визуализация двумерного DFT в MATLAB 126
4.3. Фильтрация в частотной области 129
4.3.1. Базовые концепции 129
4.3.2. Основные шаги фильтрации в частотной области 134
4.3.3. М-функция для фильтрации в частотной области 136
4.4. Построение фильтров в частотной области
по пространственным фильтрам 136
4.5. Прямое построение фильтров в частотной области 141
4.5.1. Построение сеточных массивов для использования в фильтрах в
частотной области 141
Содержание
4.5.2. Низкочастотные фильтры 142
4.5.3. Построение графиков каркасных контуров и поверхностей 145
4.6. Повышение резкости при частотной фильтрации 149
4.6.1. Основы высокочастотной фильтрации 149
4.6.2. Фильтрация с усилением высоких частот 151
Выводы 153
Глава 5
Восстановление изображений 154
Введение 154
5.1. Моделирование процесса искажения/восстановления изображения 154
5.2. Модели шума 156
5.2.1. Добавление шума функцией imnoise 156
5.2.2. Генерация случайного пространственного шума с заданным рас-
распределением 157
5.2.3. Периодический шум 165
5.2.4. Оценивание параметров шума 168
5.3. Восстановление в присутствии одного шума — пространственная
фильтрация 172
5.3.1. Фильтры для пространственного шума 172
5.3.2. Адаптивные пространственные фильтры 177
5.4. Подавление периодического шума с помощью фильтрации в частот-
частотной области 179
5.5. Моделирование искажающих функций 180
5.6. Инверсная фильтрация 183
5.7. Винеровская фильтрация 183
5.8. Сглаживающая фильтрация методом наименьших квадратов со связью 187
5.9. Алгоритм Люси-Ричардсона итерационного нелинейного восстанов-
восстановления 189
5.10. Слепая деконволюция 192
5.11. Геометрические преобразования и регистрация изображений 195
5.11.1. Пространственные преобразования 195
5.11.2. Применение пространственных преобразований к изображениям . 200
5.11.3. Регистрация изображений 203
Выводы 205
Глава 6
Обработка цветных изображений 206
Введение 206
6.1. Представление цветных изображений в MATLAB 206
6.1.1. RGB изображения 206
6.1.2. Индексированные изображения 208
6.1.3. Функции IPT для обращения с RGB и индексированными изоб-
изображениями 211
6.2. Преобразования в другие цветовые пространства 214
Содержание
6.2.1. Цветовое пространство NTSC 214
6.2.2. Цветовое пространство YCbCr 215
6.2.3. Цветовое пространство HSV 216
6.2.4. Цветовые пространства CMY и CMYK 216
6.2.5. Цветовое пространство HSI 217
6.3. Основы обработки цветных изображений 223
6.4. Цветовые преобразования 236
6.5. Пространственная фильтрация цветных изображений 243
6.5.1. Сглаживание цветных изображений 243
6.5.2. Повышение резкости цветных изображений 245
6.6. Обработка в векторном пространстве RGB напрямую 246
6.6.1. Обнаружение контуров на цветных изображениях с помощью
градиента 246
6.6.2. Сегментация в векторном пространстве RGB 250
Выводы 253
Глава 7
Вейвлеты 254
Введение 254
7.1. Некоторые основы 254
7.2. Быстрое вейвлетное преобразование 257
7.2.1. Преобразования FWT в пакете Wavelet Toolbox 258
7.2.2. Преобразования FWT без использования Wavelet Toolbox 264
7.3. Работа со структурами вейвлетной декомпозиции 272
7.3.1. Редактирование вейвлетных коэффициентов вне пакета Wavelet
Tollbox 274
7.3.2. Отображение коэффициентов декомпозиции 279
7.4. Быстрое обратное вейвлетное преобразование 283
7.5. Вейвлеты при обработке изображений 289
Выводы 294
Глава 8
Сжатие изображений 295
Введение 295
8.1. Некоторые основы 296
8.2. Кодовая избыточность 299
8.2.1. Коды Хаффмана 302
8.2.2. Кодирование Хаффмана 309
8.2.3. Декодирование Хаффмана 316
8.3. Межпиксельная избыточность 324
8.4. Визуальная избыточность 330
8.5. Стандарты сжатия JPEG 333
8.5.1. JPEG 334
8.5.2. JPEG 2000 341
Выводы 349
Содержание
Глава 9
Морфологическая обработка изображений 351
Введение 351
9.1. Предварительные сведения 352
9.1.1. Базовые понятия теории множеств 352
9.1.2. Двоичные изображения, множества и логические операции 354
9.2. Дилатация и эрозия 355
9.2.1. Дилатация 355
9.2.2. Разложение структурообразующих элементов 358
9.2.3. Функция strel 359
9.2.4. Эрозия 362
9.3. Комбинирование дилатации и эрозии 364
9.3.1. Размыкание и замыкание 364
9.3.2. Преобразование успех/неудача 367
9.3.3. Использование поисковых таблиц 370
9.3.4. Функция bwmorph 373
9.4. Выделение компонент связности 376
9.5. Морфологическая реконструкция 380
9.5.1. Размыкание реконструкцией 381
9.5.2. Заполнение отверстий 383
9.5.3. Очистка от пограничных объектов 383
9.6. Полутоновая морфология 384
9.6.1. Дилатация и эрозия 384
9.6.2. Размыкание и замыкание 387
9.6.3. Реконструкция 392
Выводы 395
Глава 10
Сегментация изображений 396
Введение 396
10.1. Обнаружение точек, линий и перепадов 397
10.1.1. Обнаружение точек 397
10.1.2. Обнаружение линий 399
10.1.3. Обнаружение перепадов с помощью функции edge 401
10.2. Обнаружение линий с помощью преобразования Хафа 410
10.2.1. Нахождение максимумов преобразования Хафа 416
10.2.2. Преобразование Хафа при обнаружении линий и связывании 418
10.3. Пороговая обработка 421
10.3.1. Обработка с глобальным порогом 422
10.3.2. Обработка с адаптивным порогом 424
10.4. Сегментация на отдельные области 425
10.4.1. Постановка задачи 425
10.4.2. Выращивание областей 425
10.4.3. Разделение и слияние областей 430
10.5. Сегментация преобразованием водораздела 436
Содержание
10.5.1. Сегментация по водоразделам с помощью преобразования рас-
расстояния 436
10.5.2. Сегментация по водоразделам с помощью градиентов 438
10.5.3. Использование маркеров при сегментации по водоразделам 440
Выводы 443
Глава 11
Представление и описание 444
Введение 444
11.1. Предварительные сведения 444
11.1.1. Смешанные массивы и структуры 445
11.1.2. Некоторые дополнительные функции МATLАВ и IPT 450
11.1.3. Некоторые основные утилитные М-функции 451
11.2. Представление 454
11.2.1. Цепные коды 454
11.2.2. Приближение ломаной линией минимальной длины 458
11.2.3. Сигнатуры 466
11.2.4. Сегменты границы 470
11.2.5. Остовы областей 470
11.3. Дескрипторы границ 473
11.3.1. Некоторые простые дескрипторы 473
11.3.2. Нумерация фигур 474
11.3.3. Фурье-дескрипторы 475
11.3.4. Статистические характеристики 480
11.4. Дескрипторы областей 481
11.4.1. Функция regionprops 481
11.4.2. Текстура 483
11.4.3. Инварианты моментов 488
11.5. Использование главных компонент при описании изображений 491
Выводы 500
Глава 12
Распознавание объектов 501
Введение 501
12.1. Некоторые основы 501
12.2. Вычисление расстояний в MATLAB 502
12.3. Распознавание с помощью теории решений 505
12.3.1. Формирование векторов признаков 506
12.3.2. Сопоставление образов с помощью классификаторов по миниму-
минимуму расстояния 506
12.3.3. Корреляционное сопоставление 508
12.3.4. Статистически оптимальные классификаторы 510
12.3.5. Адаптивные обучающиеся системы 515
12.4. Структурное распознавание 516
12.4.1. Работа со строками в MATLAB 516
Содержание
12.4.2. Сопоставление строк 526
Выводы 530
Приложение А 531
Введение 531
АЛ. Функции IPT и DIPUM 531
А.2. Функции MATLAB 539
Приложение Б 544
Введение 544
Б. 1. Построение графического интерфейса ICE 544
Б.2. Программируемый интерфейс ICE 547
Б.2.1. Программный код инициализации 550
Б.2.2. Открытие окна и вывод функций 552
Б.2.3. Функции вызовов окна 563
Б.2.4. Функции вызовов объектов 567
Приложение В 570
Введение 570
Литература 614
Пролог
Решение задач, возникающих в области цифровой обработки изображений, тре-
требует большой экспериментальной работы, в которой приходится использовать
специализированные алгоритмы и многократное тестирование с привлечением
обширной базы различных изображений. Разработка алгоритмов обычно опира-
опирается на основательный теоретический фундамент; тем не менее, реальное при-
приложение этих алгоритмов почти всегда требует определения конкретных пара-
параметров, редактирования отдельных частей алгоритмов и сравнения различных
конкурирующих версий искомого решения. Таким образом, выбор гибкой, все-
всеохватывающей и хорошо документированной среды для разработки конкретных
приложений является ключевым фактором, который влияет на цену и время
разработки программного обеспечения, а также на компактность конечного про-
программного продукта.
Несмотря на очевидную актуальность предмета, было написано сравнительно
мало учебников и книг, в которых одновременно рассматривались бы теоретиче-
теоретические основы и практические программные аспекты решения основных задач в
области цифровой обработки изображения. Настоящая книга была написана как
раз с этой целью. Мы видели свою задачу в том, чтобы изложить фундаменталь-
фундаментальные алгоритмы обработки изображений с использованием самых современных
компьютерных программных инструментов. Одновременно с этим мы стреми-
стремились к написанию самодостаточного учебника, который будет легко освоить всем,
кто имеет лишь общие представления о предмете цифровой обработки изображе-
изображений, знаком с основами математического анализа и владеет минимальными на-
навыками компьютерного программирования. Все эти необходимые знания обычно
приобретаются на первых курсах технических вузов и университетов. Желатель-
Желательно (но не обязательно) также иметь элементарные сведения о системе MATLAB.
Для достижения поставленной цели нам потребовалось решить две ключевые
задачи. Первая задача — отобрать материалы по обработке изображений, кото-
которые в значительной степени покрывают стандартную программу учебных курсов
по данной теме. Вторая задача — выбрать подходящие программные инстру-
инструменты, хорошо документированные, с реальной поддержкой разработчиками, и
которые имеют широкий охват приложений в «реальном» компьютерном мире.
Для решения первой задачи мы воспользовались соответствующими главами
из монографии «Digital Image Processing», R.Gonzalez, R.Woods1, обновляющие-
обновляющиеся издания которой считаются во всем мире основными базовыми учебниками по
этому предмету на протяжении более двадцати лет. А необходимые программные
инструменты были взяты из пакета MATLAB Image Processing Toolbox (IPT),
который одновременно занимает ведущие позиции и в образовательной, и в ин-
индустриальной сфере. Мы придерживались следующей стратегии при написании
данной книги: интегрировать хорошо разработанные теоретические конструкции
и их практические реализации на основе самого современного программного обес-
обеспечения.
1 Имеется перевод этой монографии на русский язык: Р.Гонсалес, Р.Вудс «Цифровая обработка
изображений», М: Техносфера, 2005. — 1070 с. — Прим. перев.
Пролог
Книга организована подобно монографии «Цифровая обработка изображе-
изображений». При таком построении читателю будет весьма просто найти более деталь-
детальное рассмотрение всех основных концепций, используемых в цифровой обработке
изображений. Там же можно обнаружить обширные ссылки на дополнительную
литературу по интересующему предмету. Кроме того, при таком подходе мож-
можно весьма сжато представить теоретический материал и сфокусировать основ-
основное внимание на программном аспекте решения задач обработки изображений.
Отметим, что работа в среде системы MATLAB с пакетом IPT дает значитель-
значительные преимущества, причем не только из-за широты и разнообразия предлага-
предлагаемых инструментов, но и в силу поддержки системы MATLAB подавляющим
большинством современных компьютерных платформ. Характерная особенность
этой книги состоит в последовательном акценте на том, как следует создавать
новый программный код, модифицируя и улучшая уже существующий функци-
функциональный инструментарий MATLAB и IPT, который был разработан и оптими-
оптимизирован настоящими профессионалами. Это очень важная черта при решении
задач обработки изображений, которые, как было отмечено выше, характеризу-
характеризуются насущной необходимостью постоянного экспериментирования и внесения
изменений в отлаживаемый алгоритм.
После изложения основ системы MATLAB и описания основных его функ-
функций главным предметом книги будет исключительно цифровая обработка изоб-
изображений. Основные темы книги охватывают различные преобразования яркости
изображений, линейную и нелинейную пространственную фильтрацию, фильтра-
фильтрацию в частотной области, восстановление и регистрацию изображений, обработ-
обработку цветных изображений, применение вейвлетов, сжатие изображений, морфо-
морфологическую обработку изображений, сегментацию изображений, представление
и описание областей и границ, распознавание объектов. Эти материалы сопро-
сопровождаются многочисленными иллюстрациями и примерами решения конкретных
задач обработки изображений с использованием функций MATLAB и IPT. В тех
случаях, когда необходимые функции отсутствуют в стандартном пакете, напи-
написаны и документированы новые функции с учетом учебных целей данной книги.
В следующих главах имеется более 60 новых функций. Эти функции расширя-
расширяют пакет IPT, состоящий из 175 функций, примерно на 35 процентов, и, что
более важно, они показывают, как можно самостоятельно разрабатывать новые
эффективные приложения для обработки разнообразных изображений.
Все материалы книги представлены в формате учебника, а не в форме руко-
руководства по написанию компьютерных программ. Несмотря на то, что эта книга
является вполне замкнутым и самодостаточным произведением, мы разместили
во всемирной паутине сопровождающий сайт (см. § 1.5), разработанный для осве-
освещения некоторых дополнительных тем, который будет постоянно обновляться.
Для студентов, которые слушают общий курс по цифровой обработке изобра-
изображений, а также для тех, кто изучает предмет самостоятельно, на нашем сайте
размещены учебные материалы и обзоры по основам предмета, включая базы
проектов и тестовых изображений, включая все изображения, использованные
в книге. Для преподавателей на сайте имеются материалы для презентаций в
учебных классах, включая слайды в системе PowerPoint всех изображений и гра-
графиков, представленных на страницах нашей книги. Читатели, уже знакомые с
Благодарности
обработкой изображений и с пакетом IPT, смогут найти на нашем сайте обнов-
обновляющийся список литературы, новые технические решения, а также ссылки на
другие сайты в интернете, содержащие полезные материалы, которые не так про-
просто разыскать самостоятельно в этом море технической информации. Все поку-
покупатели данной книги имеют право загружать любые исполняемые программные
файлы всех новых функций, разработанных в тексте.
По природе любых писательских опытов подобного рода, прогресс продолжа-
продолжается и после написания манускрипта. По этой причине мы потратили много сил
на отбор фундаментального (по нашему мнению) материала, который, вероятно,
сохранит свое значение и применение в этой быстро развивающейся области зна-
знаний. Мы верим, что читатели оценят эти наши старания и обнаружат в нашей
книге материалы, нужные и полезные в их работе.
Благодарности
Мы глубоко признательны многим людям как из академических, так и из про-
промышленных и правительственных кругов, которые внесли значительный вклад
при приготовлении этой книги. Эта помощь была столь неоценимой и значитель-
значительной, что нам трудно и невозможно кого-то выделить, поэтому мы всех их просто
перечисляем в алфавитном порядке. Мы выражаем нашу глубочайшую призна-
признательность Монги А.Абиди, Питеру Дж. Экламу, Сержу Бехеру, Эрнесто Брибес-
ка, Майклу У.Дэвидсону, Куртни Эспозито, Наоми Фернандес, Томасу Р. Гесту,
Роджеру Хиди, Бриану Джонсону, Лизе Кемплер, Рою Лурие, Эшли Мохаме-
ду, Джозефу Е. Пассенте, Дэвиду Р.Пикенсу, Эдгаро Фелипе Риверону, Майклу
Робинсону, Лорану Шуре, Джеку Склански, Салли Стоу, Крейгу Уотсону, Гре-
гу Володкину. Мы также благодарны организациям, упоминающимся во многих
подписях к фотографиям, за разрешение использовать эти материалы.
Особое спасибо Тому Роббинсону, Роуз Кернан, Алисе Дворкин, Хаоханг Жу,
Брюс Кенселаар и Джейн Конте из издательства Prentice Hall за их исключи-
исключительные старания и постоянное стремление к совершенству во всем, связанном с
выпуском этой книги. Их творчество, поддержка и терпение были для нас просто
неоценимы.
Рафаэль С.Гонсалес
Ричард Е. Вудс
Стивен Л. Эддинс
Об авторах
Рафаэль С. Гонсалес
Р. С. Гонсалес получил степень бакалавра в университете штата Майами в 1965 г.,
а затем степени магистра и доктора философии по электротехнике в универси-
университете штата Флорида (г. Гейнсвилл) соответственно в 1967 и 1970 гг. В 1970 г. он
стал сотрудником факультета электронной и компьютерной техники университе-
университета штата Теннеси (UTK) в г. Ноксвилл, где получил звание адъюнкт-профессора
в 1973 г., звание профессора в 1978 и звание заслуженного профессора в 1984 г.
С 1994 г. по 1997 г. профессор Гонсалес работал деканом факультета, а в насто-
настоящее время он является почетным профессором UTK в отставке.
Профессор Гонсалес был основателем лаборатории анализа изображений и
образов, а также лаборатории роботехники и машинного зрения в университете
UTK. Он также основал в 1982 г. компанию Perceptics Corporation, и до 1992
года являлся ее президентом. Последние три года этого периода он также рабо-
работал в компании Westinghouse Corporation, которая купила Perceptics Corporation
в 1989 г. Под руководством Р. Гонсалеса компания Perceptics добилась больших
успехов в области обработки изображений, в машинном зрении и в технологии
хранения данных на лазерных дисках. В течение первых десяти лет своей ра-
работы компания Perceptics разработала и внедрила целый ряд инновационных
продуктов, в том числе: первую в мире коммерческую систему машинного зре-
зрения для автоматического распознавания номерных знаков транспортных средств;
ряд крупномасштабных систем обработки и архивирования изображений, кото-
которые применяются на шести заводах ВМФ США при контроле реактивных двига-
двигателей баллистических ракет «Трайдент-2», размещенных на подводных лодках;
семейство видеоплат обработки изображений для модернизированных компьюте-
компьютеров «Макинтош», занимающее лидирующие позиции на рынке; а также линейка
устройств хранения данных терабайтной емкости на основе лазерных дисков.
Профессор Гонсалес постоянно привлекается различными промышленными и
правительственными организациями в качестве консультанта по вопросам рас-
распознавания образов, обработки изображений и обучающихся машин. Его ака-
академические заслуги в этих областях отмечены премией технического факульте-
факультета UTK за высокие достижения в 1977 г., премией ректора UTK для ученых-
исследователей в 1978 г., бруксовской премией выдающимся профессорам и по-
почетным званием профессора Magnavox Engineering в 1980 г. В 1981 г. он стал
профессором IBM в университете Теннеси, а в 1984 г. Р. С. Гонсалес там же по-
получил звание заслуженного профессора. Ему присуждено звание выдающегося
выпускника университета штата Майами A985 г.), премия научного общества
«Фи-Каппа-Фи» A986 г.) и премия им. Натана У.Догерти университета штата
Теннеси за выдающиеся инженерные достижения A992 г.). Среди наград в обла-
области техники — премия выдающемуся инженеру IEEE в 1987 г. за коммерческие
Об авторах
разработки в Теннеси; национальная премия 1988 г. им. Альберта Роуза за успе-
успехи в создании промышленных систем обработки изображений; премия Б. Отто
У или за достижения в переносе технологий и звание «предприниматель года»
агентства Купере и Либранд A989 г.); премия выдающемуся инженеру IEEE за
1992 г. (по округу 3); национальная премия 1993 г. за развитие технологий от
ассоциации по автоматизированной обработке изображений.
Д-р Гонсалес является автором и соавтором более 100 научных и техниче-
технических статей, двух монографий и пяти учебников по распознаванию образов, об-
обработке изображений и роботехнике. По его книгам учатся студенты более 500
университетов, работают исследователи во всем мире. Он включен в престиж-
престижные справочники «Кто есть кто в Америке», «Кто есть кто в технике», «Кто
есть кто в мире». Его имя можно найти в десяти национальных и международ-
международных биографических перечнях. Он является совладельцем двух патентов США.
Профессор Гонсалес входит в редколлегию научных журналов «Труды по тео-
теории систем» (IEEE Transactions on Systems), «Человек и кибернетика» (Man and
Cybernetics), международного журнала по вычислительной технике и информа-
информатике (International Journal of Computer and Information Sciences). Он является
членом IEEE и состоит во многих профессиональных и почетных обществах,
включая «Тау-Бета-Пи», «Фи-Каппа-Фи», «Эта-Каппа-Ню», «Сигма-Кси».
Ричард Э. Вудс
Ричард Э. Вудс получил степени бакалавра, магистра и доктора философии по
электротехнике в университете штата Теннеси (г. Ноксвилл). Сфера его профес-
профессиональных интересов простирается от предпринимательской деятельности до
работы в традиционном академическом направлении исследователя и консуль-
консультанта в промышленных и правительственных организациях. Совсем недавно он
основал компанию MedData Interactive, работающую в сфере высоких техноло-
технологий, которая специализируется в разработке портативных компьютерных систем
для нужд медицины. Он был также соучредителем и вице-президентом компа-
компании Perceptics Corporation, в которой он был ответственен за разработку многих
устройств для количественного анализа изображений и автономного принятия
решений роботизированными системами.
До работы в компаниях Perceptics и MedData Interactive д-р Вудс занимал
пост доцента по электронике и вычислительной технике в университете штата
Теннеси, а еще раньше он работал инженером по компьютеризации в компании
Union Carbide Corporation. В качестве консультанта он участвовал в разработке
различных процессоров специального назначения для решения задач распозна-
распознавания образов для ряда космических и военных организаций, включая агентство
NASA, Центра управления баллистическими ракетами и Национальную лабора-
лабораторию Оук Ридж (Oak Ridge).
Д-р Вудс является автором множества публикаций по проблемам цифровой
обработки сигналов, а также соавтором монографии «Цифровая обработка изоб-
изображений», которая является одной из ведущих книг в это области. Он состоит во
многих профессиональных обществах, включая «Тау-Бета-Пи», «Фи-Каппа-Фи»
и IEEE. В 1986 г. он был признан выдающимся выпускником университета штата
Теннеси.
Об авторах
Стивен Л. Эддинс
Стивен Л. Эддинс является менеджером по разработкам группы обработки изоб-
изображений компании MathWorks, Inc. Он руководил разработкой нескольких вер-
версий программного пакета Image Processing Toolbox этой компании. Его профес-
профессиональная деятельность связана с созданием программных продуктов, основан-
основанных на новейших алгоритмах обработки изображений, которые служат для ре-
решения широкого круга задач в научных и промышленных сферах.
До начала работы в MathWorks, Inc., в 1993 г., д-р Эддинс был сотрудником
факультета электроники и вычислительной техники университета Иллинойс в
Чикаго. Он является специалистом высочайшего класса в областях цифровой
обработки изображений, машинного зрения, распознавания образов, разработки
фильтров. Ему также приходилось выполнять исследования в области сжатия
изображений.
Д-р Эддинс имеет степень бакалавра A986) и доктора философии A990) по
электротехнике, которые он получил в технологическом институте штата Джор-
Джорджия. Он является членом IEEE.
ГЛАВА I
ВВЕДЕНИЕ
Цифровая обработка изображений отличается необходимостью интенсивного экс-
экспериментирования для выяснения состоятельности предлагаемых решений дан-
данной задачи. В этой главе показывается, как теоретические основы и современ-
современное программное обеспечение можно интегрировать в некоторое единое макет-
макетное окружение с целью разработки набора инструментов для решения широкого
круга проблем цифровой обработки изображений.
1.1. Некоторые основания
Разработка систем обработки изображений всегда тесно связана с большим объе-
объемом тестирования и экспериментальной работы, который необходимо выполнить
для достижения приемлемого решения поставленной задачи. Эта особенность
означает, что умение строить прототипные модели возможных решений играет
важную роль для уменьшения денежных и временных затрат и для получения
конкурентоспособной реализации требуемой системы.
Отметим, что к настоящему времени опубликовано весьма мало книг и руко-
руководств, которые помогают перекинуть мост через пропасть, разделяющую тео-
теорию и конкретные компьютерные приложения на основе развитого программного
окружения. Главной целью этой книги является желание объединить под одной
обложкой широкий базис теоретических концепций и знаний, необходимых для
внедрения этих концепций в реальные программные продукты, написанные в сре-
среде современного пакета обработки изображений. Материалы теоретических основ
следующих глав взяты из книги «Цифровая обработка изображений», написан-
написанной Р. Гонсалесом и Р. Вудсом и опубликованной издательством Prentice Hall.
Тексты компьютерных программ и базовых функциональных инструментов на-
написаны на основе популярного пакета Image Processing Toolbox, который работает
в среде MATLAB1, разработанной компанией MathWorks Inc. (см. § 1.3). Все ма-
материалы данной книги представлены в том же виде и с теми же обозначениями,
что и в книге Гонсалеса-Вудса. Это позволяет легко делать перекрестные ссылки
на родственные материалы.
Книга является совершенно самодостаточной. Для овладения ее содержанием
читателям достаточно иметь начальные сведения по цифровой обработке изоб-
изображений, полученные или на первых курсах университетов и вузов, или с по-
помощью самостоятельного изучения предмета. Предполагается также, что чита-
читатели знакомы с системой MATLAB и имеют начальные навыки компьютерного
1В дальнейшем изложении мы для краткости будем ссылаться на книгу Р. Гонсалеса и Р. Вудса
«Цифровая обработка изобраэюений», как на книгу Гонсалеса-Вудса, a Image Processing Toolbox
будем сокращенно обозначать IPT.
1.2. Что такое цифровая обработка изображений?
программирования, которые обычно приобретаются на первых стадиях обучения
на курсах по языкам программирования с технической ориентацией. Поскольку
MATLAB является матрично ориентированной системой, читателям будут по-
полезны некоторые базовые знания из матричного анализа.
Книга основана на правилах. Она организована в виде учебника, а не в виде
руководства по программированию. Таким образом, основные идеи по теории и
программированию объясняются до разработки новых концепций программиро-
программирования. Материал книги иллюстрируется и объясняется с помощью множества
примеров, взятых из разных областей, от медицины и промышленности до уда-
удаленного автоматического восприятия и астрономии. Такой подход позволяет ме-
методично продвигаться от простых концепций до изощренных реализаций слож-
сложных алгоритмов обработки изображений. Вместе с этим, читатели, уже знакомые
с MATLAB, IPT и с основами обработки изображений, могут прямо начать чте-
чтение с интересующих их специфических приложений, в этом случае эту книгу
можно рассматривать как расширение пакета IPT. Все новые функции, приве-
приведенные в этой книге, полностью документированы. Программные коды новых
функций приведены или в соответствующей главе, или в приложении В.
В книге представлено более 60 новых функций. Эти функции расширяют при-
примерно на 35% набор из 175 функций исходного пакета IPT. Помимо конкретной
специализации, новые функции являются хорошим примером комбинирования
кода существующих функций MATLAB и IPT с новым программным кодом для
разработки прототипов решений для широкого спектра проблем цифровой обра-
обработки изображений. Функции пакета IPT, равно как и функции, разработанные в
этой книге, работают под управлением почти любой операционной системы. Чи-
Читатели могут найти полный список поддерживаемых компьютерных платформ
на сайте нашей книги (см. § 1.5).
1.2. Что такое цифровая обработка изображений?
Изображение представляет собой двумерную функцию /(ж, у), где х и у — это
пространственные координаты, а амплитуда / в любой точке с парой коорди-
координат (х, у) называется интенсивностью или уровнем серого цвета1 изображе-
изображения в этой точке. Если переменные ж, у и / принимают значения их конечного
(дискретного) множества, то говорят о цифровом изображении. Под цифровой
обработкой изображений подразумевается обработка цифровых изображений с
помощью цифровых вычислительных машин (компьютеров). Отметим, что циф-
цифровое изображение состоит из конечного числа элементов, каждый из которых
расположен в конкретном месте и имеет определенное значение. Эти элементы
принято называть элементами изображения или пикселами2. Чаще всего эле-
элементы цифрового изображения называют пикселами. Более строгое определение
этого термина будет дано в гл. 2.
ХВ отечественной литературе этот термин принято называть яркостью, который мы будем
часто использовать, если это не приводит к разночтению. — Прим. перев.
2Слово pixel образовано из английского словосочетания picture element (элемент изображения).
В англоязычной литературе также принято сокращение pel для этого термина — Прим. перев.
Глава 1. Введение
Зрение является самым совершенным из наших органов чувств, поэтому зри-
зрительные образы играют такую важную роль в человеческом восприятии. Однако
в отличие от людей, которые способны воспринимать лишь электромагнитное
световое излучение видимого диапазона, машинная обработка изображений по-
покрывает практически весь спектр электромагнитных волн от гамма-излучения
до радиоволн. Причем обрабатываемые изображения могут происходить от таких
источников, которые людям даже трудно ассоциировать с привычными наблюда-
наблюдаемыми изображениями. Например, это ультразвуковые изображения, изображе-
изображения, полученные в электронной микроскопии или искусственно сгенерированные
компьютером. Таким образом, цифровая обработка изображений имеет весьма
широкие сферы применения.
Не существует общепризнанной границы, которая разделяла бы область об-
обработки изображений и другие смежные дисциплины, такие как анализ изобра-
изображений или машинное зрение. Иногда такое разграничение делается по принци-
принципу, что обработка изображений характеризуется присутствием изображений на
входе и выходе данной системы. Однако такое определение представляется нам
неоправданно ограничительным и искусственным. В самом деле, при таком под-
подходе даже такая простая задача, как определение средней интенсивности по всему
полю изображения (требуется найти одно единственное число), не будет считать-
считаться операцией по обработке изображения. С другой стороны, имеются такие об-
области, как машинное зрение, в которых конечной целью является компьютерная
имитация зрения человека, включающая способность к обучению, логическим
выводам и совершению определенных действий на основе обозреваемой инфор-
информации. Такие задачи относятся уже к области искусственного интеллекта, целью
которого является копирование и имитация интеллектуальной деятельности че-
человека. Отметим, что эта отрасль искусственного интеллекта находится лишь
на начальной стадии развития, и приходится признать, что прогресс в этом на-
направлении идет значительно медленнее, чем это предполагалось ранее. Анализ
изображения (который иногда называют «интерпретацией» или «пониманием»
изображений) занимает некоторое промежуточное положение между обработкой
изображений и машинным зрением.
Во всем многообразии задач от обработки изображений до машинного зрения
нет четких границ, однако здесь можно выделить компьютеризованные процессы
низкого, среднего и высокого уровня. Процессы низкого уровня включают лишь
примитивные операции над изображениями типа уменьшение шума, повышение
контрастности или улучшение резкости. Низкоуровневые процессы характери-
характеризуются тем, что на вход и выход поступают изображения. Процессы среднего
уровня связаны с такими задачами, как сегментация (разделение изображений
на области и выделение в них объектов), описание объектов и их сжатие для
придания им удобной формы для дальнейшей компьютерной обработки, а также
классификация (распознавание) выделенных объектов. В среднеуровневых про-
процессах на входе имеются изображения, а на выход поступают атрибуты и при-
признаки, извлеченные из этих изображений (например, границы, контуры и другие
отличительные признаки объектов). Наконец, процессы высокого уровня зани-
занимаются «осмыслением» множества распознанных объектов, как это делается в
анализе изображений, а еще далее стоят действия, связанные с когнитивными
функциями, обычно ассоциируемые с человеческим зрением.
1.3. Система MATLAB и пакет Image Processing Toolbox
Имея в виду перечисленные выше замечания, видно, что естественным полем
пересечения и перехода от обработки изображений к их анализу является область
распознавания отдельных фигур или объектов на изображениях. Таким образом,
в этой книге то, что называется цифровой обработкой изображений, связано с
процессами, имеющими изображения на входе и на выходе, а также с процесса-
процессами извлечения определенных признаков изображений вплоть до распознавания
отдельных объектов. В качестве простой иллюстрации, проясняющей эти концеп-
концепции, можно рассмотреть задачу автоматического анализа печатного или рукопис-
рукописного текста. Действиями по цифровой обработке изображений, которые рассмат-
рассматриваются в данной книге, являются считывание области изображения с текстом,
предварительная обработка этого изображения, выделение (сегментация) отдель-
отдельных букв и знаков текста, описание этих символов в удобной компьютерной фор-
форме и, наконец, распознавание каждого индивидуального символа текста. Если же
говорить об осмыслении содержимого страницы, то эту задачу можно уже от-
отнести к области анализа изображений или машинного зрения в зависимости от
уровня сложности информации, ожидаемой от прочитанного текста. Цифровая
обработка информации в том виде, как она была определена выше, успешно при-
применяется в широком круге областей, имеющих важное социально-экономическое
значение.
1.3. Система MATLAB и пакет Image Processing Toolbox
MATLAB является языком высокого уровня для выполнения технических и на-
научных вычислений. В нем интегрированы вычисления, визуализация и програм-
программирование в удобной пользовательской среде, в которой задачи и их решения вы-
выражаются с помощью привычных математических обозначений. Типичный набор
действий включает:
- математические вычисления;
- разработку алгоритмов;
- моделирование и создание прототипных систем;
- анализ данных, их исследование и визуализацию;
- построение различных графиков;
- разработку приложений и пользовательский интерфейс.
MATLAB представляет собой интерактивную систему, в которой базовым эле-
элементом выступает массив элементов, который не требует задания фиксированной
размерности. Это позволяет легко формулировать условия и решения многих вы-
вычислительных задач, которым требуется матричное представление объектов. При
этом необходимая работа займет лишь малую долю времени, которое потребова-
потребовалось бы для написания аналогичных программ на скалярном и неинтерактивном
языке типа С или Fortran.
Название MATLAB происходит от английского словосочетания MATrix LABo-
ratory. Система MATLAB была написана для облегчения доступа к матричным
программным продуктам, разработанным в рамках проектов LINPACK (Linear
System Package) и EISPACK (Eigen System Package). В настоящее время яд-
ядро MATLAB встроено в библиотеки LAPACK (Linear Algebra Package) и BLAS
Глава 1. Введение
(Basic Linear Algebra Subprograms), которые включают самое современное про-
программное обеспечение для матричных вычислений.
В университетской среде MATLAB является стандартом вычислительных ин-
инструментов для начальных и углубленных курсов по математике, технике и дру-
другим научным дисциплинам. В промышленности MATLAB широко используется
многими исследователями и разработчиками. Система MATLAB имеет расши-
расширения в виде наборов специализированных программ, которые по-английски на-
называются toolbox (набор инструментов). Пакет Image Processing Toolbox (IPT)
состоит из функций MATLAB (они называются М-функции или М-файлы), ко-
которые расширяют возможности стандартной среды MATLAB для решения задач
цифровой обработки изображений. Другие наборы toolbox, которые иногда ис-
используются в IPT, — это Signal Processing Toolbox (пакет обработки сигналов),
Neural Network Toolbox (пакет для нейронной сети), Fuzzy Logic Toolbox (пакет
с нечеткой логикой) и Wavelet Toolbox (пакет для работы с вейвлетами).
Система MATLAB Student Version, предназначенная для студентов, вклю-
включает полную версию MATLAB. Ее можно купить со значительной скидкой в
университетских магазинах (в США), а также на вебсайте компании MathWorks
(www.mathworks.com). Вместе со студенческой версией системы можно приобре-
приобрести дополнительные продукты, включая пакет IPT.
1.4. Задачи по обработке изображений
В каждой главе этой книге даны подходящие функции из MATLAB и IPT, кото-
которые позволяют применять соответствующие теоретические построения. Если же
в системе MATLAB или в пакете IPT отсутствовали инструменты, необходимые
для реализации каких-то специфических функций, то были разработаны и до-
документированы новые функции для решения этих задач. Как уже отмечалось,
полный текст всех таких функций приводится в книге. Ниже дано содержание
каждой последующей главы.
Глава 2: Цифровые изображения в MATLAB. В этой главе приводятся
основные сведения по системе MATLAB, включая обозначения, индексирование
массивов и основы программирования на языке MATLAB. Этот материал служит
фундаментом всей книги, поэтому читателю необходимо свободно овладеть всеми
этими понятиями.
Глава 3: Преобразование яркости изображений и пространственная
фильтрация. В этой главе рассказывается, как с помощью MATLAB и IPT со-
совершать преобразования яркости цифровых изображений. В ней также рассмат-
рассматриваются методы линейной и нелинейной фильтрации с большим количеством
примеров и иллюстраций.
Глава 4: Частотные методы обработки изображений. В этой главе из-
излагаются основные подходы при реализации прямого и обратного быстрого пре-
преобразования Фурье (FFTs, Fast Fourier Transforms) и при визуализации спектра
Фурье с помощью функций IPT. Здесь также объясняется фильтрация в про-
пространственной области. Рассматривается метод построения фильтров частотной
области из конкретных пространственных фильтров.
1.4- Задачи по обработке изображений
Глава 5: Восстановление изображений. В данной главе приводятся клас-
классические методы восстановления изображений, такие как винеровская фильтра-
фильтрация. Обсуждаются и иллюстрируются также итеративные и нелинейные методы,
например, метод Ричардсона-Люси и метод оценивания по максимуму правдопо-
правдоподобия для слепых деконволюций. Разбираются методы регистрации изображений
и геометрической коррекции.
Глава 6: Обработка цветных изображений. Здесь рассматриваются под-
подходы при обработке псев до цветных и полноцветных изображений. Обсуждаются
цветовые модели, применяемые при обработке цветных изображений. Функции
из IPT по обработке цветных изображений расширяются новыми инструментами
для обработки дополнительных цветовых моделей. В этой главе также рассмат-
рассматривается применение цвета при решении задач обнаружения границ и сегмента-
сегментации областей.
Глава 7: Вейвлеты. В текущей реализации пакета IPT отсутствуют вейвлет-
ные преобразования. В этой главе разработаны функции для вейвлетного анали-
анализа, совместимые с пакетом Wavelet Toolbox, которые дают возможность приме-
применять все концепции вейв летных преобразований, изложенные в книге Гонсалеса-
Вудса.
Глава 8: Сжатие изображений. В пакете IPT нет функций сжатия изобра-
изображений. В этой главе разработаны некоторые функции, которые можно применять
при решении задач компрессии изображений.
Глава 9: Морфологическая обработка изображений. Рассматривается
широкий спектр функций IPT, позволяющих делать морфологическую обработ-
обработку изображений. Разбираются как двоичные изображения, так и полутоновые
изображения с градацией серого цвета.
Глава 10: Сегментация изображений. В этой главе описываются и иллю-
иллюстрируются функции из пакета IPT, служащие для сегментации изображений.
Разработаны новые функции для применения преобразования Хуга и для метода
выращивания областей.
Глава 11: Представление и описание. Здесь разработаны некоторые но-
новые функции для представления объектов, включая цепные коды и представле-
представление ломаной линией. Даны также новые функции для описания объектов, на-
например, Фурье-дескрипторы, текстурные дескрипторы и инварианты двумерных
моментов. Эти функции расширяют инструментарий пакета IPT для исследова-
исследования свойств областей.
Глава 12: Распознавание объектов. Основным предметом данной главы
является эффективная реализация функции вычисления евклидова расстояния
и расстояния Махаланобиса. Эти функции играют ключевую роль в методах, ос-
основанных на сопоставлении образцов. В этой главе также делается обстоятельное
обсуждение методов манипуляции со строками символов в MATLAB. Манипуля-
Манипуляция и сравнение строк очень важны при распознавании структурных образцов.
Кроме этого материала, в книге имеется три приложения.
Приложение А. Здесь собраны все существующие в IPT и описанные в книге
новые функции для обработки изображений. Включены также соответствующие
базовые функции из MATLAB. Этот список представляет собой удобный обзор
всех полезных функции для выполнения работ по обработке изображений.
Глава 1. Введение
Приложение Б. Здесь обсуждаются методы разработки графических ин-
интерфейсов пользователя (GUIs, Grafical User Interfaces) в среде MATLAB. Этот
материал весьма полезен, так как упрощает контроль и взаимодействие функций,
делает их более интуитивными.
Приложение В. В каждой главе приводятся тексты (листинги) всех новых
функций, разработанных в этой главе при объяснении соответствующих концеп-
концепций. Для удобства читателя, все полные листинги помещены в это приложение.
Это относится, прежде всего, к листингам длинных функций, которые в тексте
были сокращены, чтобы не перегружать материал излишней детализацией.
1.5. О вебсайте этой книги
Важной особенностью настоящей книги является размещение соответствующих
и дополнительных материалов во всемирной паутине по адресу:
www.prenhall.com/gonzalezwoodseddins.
На этом сайте имеются следующие материалы:
- загружаемые М-файлы, включая М-файлы из книги;
- учебные пособия;
- проекты;
- материалы для преподавателей;
- линки на другие базы данных, включая ссылки на все иллюстрации данной
книги;
- обновления книги;
- список литературы.
Этот сайт интегрирован с вебсайтом книги Гонсалеса-Вудса
www.prenhall.com/gonzalezwoods,
на котором размещены дополнительные учебно-справочные и исследовательские
материалы.
1.6. Обозначения
В этой книге все формулы набраны наклонным латинским шрифтом italic и греческим
шрифтом, например, f(x,y) = Asm(ux + vy) или ф(х,у) = tan [I(u,v)/R(u,v)].
Все символы и имена функций системы MATLAB набраны шрифтом печатной
машинки, в котором все символы имеют одинаковую ширину, например, f f t2(f),
logical(А) или roipoly(f,c,r).
Если необходимо обозначить нажатие специальных клавиш на клавиатуре
компьютера, то будет использоваться жирный шрифт, например, Return или Tab.
Кроме того, жирный шрифт используется при обозначении пунктов экранного
меню, вроде File или Edit.
1.7. Рабочая среда системы MATLAB
1.7. Рабочая среда системы MATLAB
В этом параграфе делается краткий обзор некоторых важных действий и базовых
приложений в среде MATLAB.
1.7.1. Рабочий стол MATLAB
Рабочий стол MATLAB — это основное окно приложения MATLAB. Как пока-
показано на рис. 1.1, рабочий стол состоит из пяти подокон: окна команд (Command
Window), окна рабочего пространства (Workspace Browser), окна текущей папки
(Current Directory Window), окна совершенных команд (Current History Window)
и одного или нескольких окон графиков.
у Рабочий стол MATLAB
Рис. 1.1. Рабочий стол MATLAB и его основные компоненты
Окно команд (Command Window) — это область, где пользователь набирает
команды и выражения MATLAB после приглашения системы (>>) (ввод) и где
система помещает свои отклики на команды пользователя (вывод). При каждом
сеансе работы MATLAB формирует рабочее пространство, т. е. множество пере-
переменных, создаваемых пользователем. Окно рабочего пространства (Workspace
Browser) показывает эти переменные, а также сообщает некоторую информацию
о них. Двойное нажатие левой клавиши мыши на любую переменную в этом окне
Глава 1. Введение
вызывает окно Редактор массивов, в котором можно увидеть дополнительную
информацию о данном массиве, а также (во многих случаях) отредактировать
его содержимое.
Над заголовком окна рабочего пространства расположена метка Current Directory
(текущая папка), за которым расположено окно текущей папки (Current Directory
Window), отражающее ее полный системный путь, например, C:\MATLAB\Work.
Это означает, что папка «Work» является подпапкой главной папки «MATLAB»
приложения MATLAB, которое установлено на диск С. Если нажать левой кла-
клавишей мыши на треугольник справа от окна текущей папки, то раскроется спи-
список путей недавно использованных папок, что позволяет пользователю быстро
менять текущую рабочую папку.
Система MATLAB использует переменную окружения путь поиска (Search
Path) для обнаружения М-файлов и файлов других типов, используемых в этой
системе, которые организованы в виде компьютерных папок. Любой исполняе-
исполняемый файл должен располагаться или в рабочей папке, или в папке, на которую
указывает путь поиска. По умолчанию, файлы, поставляемые вместе с MATLAB
и MathWorks, помещаются в Search Path. Самый простой путь узнать, какие
папки помещены в Search Path, а также добавить, удалить или модифицировать
имеющиеся там записи, — это выбрать пункт Set Path в меню File рабочего сто-
стола и совершить необходимые действия в появившемся диалоговом окне Set Path.
В начале работы бывает удобно поместить ссылки на часто используемые папки
в путь поиска. В этом случае не придется часто менять текущую папку системы.
Окно совершенных команд (Current History Window) содержит записи всех
команд, которые пользователь вводил в окне команд, включая текущую и все
предыдущие сеансы работы с MATLAB. Ранее исполненные команды можно вы-
выбирать и повторно исполнять из окна совершенных команд. Для этого достаточ-
достаточно щелкнуть правой кнопкой мыши по команде или последовательности команд.
Такое действие активирует меню, из которого необходимо выбрать некоторые
дополнительные опции для выполнения этих команд. Такая организация хоро-
хорошо помогает при экспериментировании с разными командами в сеансе работы с
MATLAB.
1.7.2. Создание М-файлов в редакторе MATLAB
Редактор MATLAB является одновременно специализированным текстовым ре-
редактором для создания М-файлов и графическим отладчиком программ MATLAB.
Редактор может работать в своем собственном окне или может быть подокном
рабочего стола. М-файлы имеют расширение .ш, например, pixeldup.m. Окно ре-
редактора MATLAB имеет несколько выпадающих меню для выполнения действий
типа сохранить, посмотреть или отладить файл. Этот текстовый редактор вы-
выполняет простейшие синтаксические проверки, а также использует разные цвета
для выделения различных элементов кода, поэтому его всегда обоснованно реко-
рекомендуют в качестве инструмента для написания и редактирования М-функций.
Для вызова редактора достаточно набрать edit после приглашения в окне ко-
команд. Аналогично командой edit filename открывается файл filename.m для
работы в редакторе. Как уже говорилось, этот файл должен располагаться в
текущей папке или на пути поиска Search Path.
1.7. Рабочая среда системы MATLAB
1.7.3. Вызов справки
Вызов окна онлайновой1 справки (Help Browser) в MATLAB производится или
нажатием мышью на знак вопроса (?) в строке инструментов рабочего стола, или
набором команды helpbrowser после приглашения в командном окне. Справоч-
Справочная система организована в виде веб-обозревателя, интегрированного в рабочий
стол MATLAB, который способен отображать документы, написанные на языке
HTML. Окно справки состоит из двух панелей: навигационной панели справки,
которая используется для поиска информации, и дисплейной панели, в которой
найденная информация отображается. На навигационной панели располагают-
располагаются кнопки, делающие процесс поиска вполне ясным. Например, чтобы получить
справку по некоторой функции, необходимо нажать кнопку Search (поиск), за-
затем выбрать Search Type (тип поиска), Function Name (имя функции) и, на-
наконец, набрать имя искомой функции в поле Search for (предмет поиска). Имеет
смысл вызывать окно справки в самом начале сеанса работы MATLAB, чтобы
иметь под рукой всю необходимую информацию о системе при написании новых
программ или выполнении иных действий в MATLAB.
Имеется другой путь получения справки по конкретной функции. Для этого
достаточно задать в командной строке команду doc, за которой поместить имя
нужной функции. Например, выполнив команду doc format, можно получить в
панели справки всю документацию, связанную с функцией format. Одновремен-
Одновременно эта команда открывает окно справки, если оно еще не было открыто.
М-функции имеют информацию двух типов, которая доступна пользовате-
пользователю. Первый тип информации называется Ш-строка, в которой содержится имя
функции и ее однострочное описание. А второй тип состоит из целого инфор-
информационного блока, который называется текстовым блоком справки. (Обе эти
справки будут подробно обсуждаться в § 2.10.1). Если набрать команду help,
а затем имя функции, то система отобразит в командном окне оба типа справ-
справки по данной функции. Отметим, что эта информация может оказаться более
свежей, чем предоставляемая справочной системой MATLAB, поскольку она из-
извлекается непосредственно из заголовка данной М-функции. Если набрать коман-
команду lookf or, а далее некоторое ключевое слово, то это приведет к отображению
всех HI-строк, в которых имеется данное ключевое слово. Поскольку каждая
Н1-строка содержит имя функции, это дает еще один альтернативный способ
получения справки про функции MATLAB. Например, если набрать команду
lookf or adge -all, то это даст список всех Н1-строк, в которых имеется слово
adge, которое находится и в Н1-строках, и в текстовых блоках. Будут обнаруже-
обнаружены также все слова, в состав которых входит последовательность символов adge.
Например, если Н1-строка функции содержит слово polyedge где-то в Н1-строке
или в текстовом блоке, то все такие строки будут выведены на экран.
В MATLAB принято говорить о справочной странице, имея в виду инфор-
информацию об М-функциях, которую можно получить любым описанным способом,
исключая команду lookf or. Однако читателю рекомендуется использовать все
доступные способы получения справок, поскольку в следующих главах дается
*В данной книге под онлайновой информацией подразумеваются файлы помощи, имеющиеся
в данном локальном компьютере, а не в сети интернет.
Глава 1. Введение
только основные синтаксические формы функций MATLAB и IPT. Это связано
с ограниченностью объема книги и с нежеланием авторов часто отвлекаться от
обсуждения основных понятий. В этих случаях будет дан лишь основной син-
синтаксис функций в форме, которая необходима авторам в данный момент. Что-
Чтобы оценить удобство, представляемое справочной системой MATLAB, читатель
может самостоятельно поупражняться в получении расширенной информации,
затратив минимальные усилия.
В заключение отметим, что вебсайт компании Math Works, упомянутый в § 1.3,
содержит обширную справочную информацию по различным функциям, а так-
также по другим ресурсам, если встроенная система онлайновой справки не дает
исчерпывающий ответ по интересуемому вопросу.
1.7.4. Сохранение и загрузка рабочего пространства
Существует несколько способов сохранения и повторной загрузки всего сеанса
работы (т. е. содержимого окна рабочего пространства) или выбранных рабочих
переменных MATLAB. Самые простые из них состоят в следующем.
Чтобы сохранить все рабочее пространство целиком, достаточно щелкнуть
мышью в любом месте окна рабочего пространства, а затем выбрать в появив-
появившемся меню строку Save Workspace As (сохранить рабочее пространство под
именем), в которой можно набрать имя и указать папку, в которой сохранить
этот файл. Для завершения команды следует нажать кнопку Save. Если тре-
требуется сохранить одну переменную рабочего пространства, то ее надо сначала
выделить левой кнопкой мыши, а затем щелкнуть правой кнопкой по выделен-
выделенной переменной. В появившемся меню выбрать Save Selection As (сохранить
выделенное под именем) и сохранить данные под некоторым именем в подхо-
подходящей папке. Если необходимо сохранить несколько переменных, то их следует
выделить левой кнопкой мыши, держа одновременно клавишу Shift или Ctrl,
а затем выполнить описанную выше процедуру для одной переменной. Все чис-
числовые данные сохраняются с двойной точностью в бинарном формате в файлах
с расширением .mat. Такие файлы принято называть МАТ-файлами. Например,
сеанс работы, названный именем mywork_2003_02_10, будет сохранен в виде фай-
файла mywork_2003_02_10.mat в соответствующей папке. Аналогично, сохраненное
изображение под именем final_image (которое является одной переменной ра-
рабочего пространства) появится в файле под именем final_image.mat.
Для загрузки всего сохраненного рабочего пространства или части перемен-
переменных необходимо щелкнуть мышью на значке папки на панели инструментов окна
рабочего пространства. Это вызовет окна с открытой папкой с МАТ-файлами,
из которых можно выбрать интересующий файл. Если щелкнуть по выбранному
файлу или нажать кнопку Open, то это действие откроет содержимое файла,
которое можно загрузить в окно рабочего пространства.
Все указанные действия можно также совершить из командной строки, если
набрать команды save и load, после которых поместить имена соответствующих
файлов с их путями. Этот способ не очень удобен, но им приходится пользо-
пользоваться, если нельзя вызвать соответствующее интерактивное меню (например,
в теле автоматически исполняемой программы MATLAB). Мы предлагаем чи-
1.8. Как организованы ссылки 27
тателю самостоятельно поупражняться в получении дополнительной справочной
информации по этим двум функциям.
1.8. Как организованы ссылки
Все ссылки на литературные источники в данной книге перечислены в библио-
библиографии в алфавитном и хронологическом порядке, например, [Soille, 2003]. Все
базовые теоретические ссылки взяты из книги [Gonzalez, Woods, 2002]. Неко-
Некоторые новые ссылки делаются по мере необходимости при обсуждении соответ-
соответствующего материала1. Ссылки на учебники и руководства по системе MATLAB,
используемые во всех главах, приведены в конце книги в библиографии.
Выводы
Материал данной главы вместе с кратким введением в основные понятия MATLAB
содержит аргументы в пользу важности создания прототипов решений задач по
обработке цифровых изображений. В следующей главе излагаются базовые зна-
знания, необходимые для понимания работы функций IPT, а также делается введе-
введение в основные приемы программирования. Материалы глав с 3 по 12 охватывают
широкий спектр тем и приложений, которые лежат в основе всех современных
методов обработки изображений. Тем не менее, при большом разнообразии вопро-
вопросов и задач основная нить обсуждения опирается на комбинирование функций
MATLAB и IPT с новыми программами, что дает возможность успешно решать
множество задач по обработке любых изображений.
*В переводе книги Гонсалеса-Вудса на русский язык имеется дополнительный список русско-
русскоязычной литературы по данной тематике. - Прим. перев.
ГЛАВА 2
ЦИФРОВЫЕ
ИЗОБРАЖЕНИЯ
В MATLAB
Введение
Как уже говорилось во введении, главное преимущество системы MATLAB при
ее использовании в качестве среды для работы с изображениями состоит в разно-
разнообразном наборе функций обработки многомерных числовых массивов, а изоб-
изображения (двумерные числовые массивы) являются важным частным случаем
таких объектов. В пакете IPT (Image Processing Toolbox) собраны функции, рас-
расширяющие возможности вычислительной среды MATLAB. Эти функции, а так-
также широкие возможности языка MATLAB делают многие сложные операции по
обработке изображений вполне доступными; их можно записать в весьма ясной и
краткой форме, что делает систему MATLAB почти идеальной средой для напи-
написания модельных прототипов реальных приложений для решения задач обработ-
обработки изображений. В этой главе вводятся базовые понятия MATLAB, обсуждаются
свойства и функции пакета IPT, даются основные концепции программирования,
которые существенно повышают мощь IPT. Материалы этой главы лежат в ос-
основе всех остальных разделов этой книги.
2.1. Представление цифровых изображений
Изображение можно определить как двухмерную функцию /(ж, у), где х и у —
это пространственные (плоскостные) координаты, а амплитуда / для каждой
пары координат (ж, у) называется интенсивностью или яркостью изображения
в точке с этими координатами. Словосочетание уровень серого часто использует-
используется для обозначения яркости монохромного изображения. Цветные изображения
формируются комбинацией нескольких монохромных изображений. Например, в
цветовой системе RGB цветное изображение строится из трех отдельных моно-
монохромных компонент (красной, зеленой и синей). По этой причине многие методы
и приемы, разработанные для монохромных изображений, могут быть распро-
распространены на цветные изображения путем последовательной обработки трех мо-
монохромных компонент. Обработка цветных изображений рассматривается в гл. 6.
Изображение может иметь непрерывные х- и ^/-координаты, а также непре-
непрерывную амплитуду /. Преобразование такого изображения в цифровую форму
требует представления координат и значений амплитуды некоторыми дискрет-
дискретными отсчетами. Представление координат конечным множеством отсчетов на-
называется дискретизацией, а представление амплитуды значениями из конечного
2.1. Представление цифровых изображений
набора называется квантованием. Таким образом, если координаты хиу,а так-
также величины амплитуды / выбираются из фиксированных конечных наборов
элементов (дискретных величин), то изображение называется цифровым изобра-
изображением.
2.1.1. Координатное соглашение
Результатом дискретизации и квантования является матрица чисел. В этой кни-
книге используются два основных метода для представления цифровых изображе-
изображений. Предположим, что изображение /(#,?/) после дискретизации представлено
в виде матрицы, у которой имеется М строк и N столбцов. Тогда говорят, что
изображение имеет размер М х N. Значения координат (х,у) являются дискрет-
дискретными величинами. Для удобства и ясности значения этих дискретных координат
принимаются целочисленными. Во многих книгах по обработке изображений за
начало координат принимается верхний левый угол изображения, координатами
которого служит пара (х,у) = @,0). Следующая точка в первой строке изобра-
изображения имеет координаты (х,у) = @,1). Важно помнить, что пара @,1) относится
ко второму пикселу (элементу изображения) вдоль первой строки изображения.
Это, однако, не обозначает настоящие физические координаты при регистрации
соответствующего изображения. На рис. 2.1, а) показано это координатное согла-
соглашение. Заметим, что координата х меняется от 0 до М — 1 с шагом 1, а координата
у меняется от 0 до Т — 1 с шагом 1.
Координатное соглашение, используемое в пакете IPT для обозначения мас-
массивов, отличается от описанного выше в некоторых деталях. Во-первых, вместо
(х, у) используется пара (г, с) для обозначения номеров строк и столбцов. Отме-
Отметим, что порядок координат имеет тот же смысл, что и в предыдущем абзаце,
т. е. первая координата соответствует строке, вторая — столбцу. Другое отличие
состоит в том, что начало координат расположено в точке {г,с) — A,1), т.е.
переменная г меняется от 1 до М, а с — от 1 до N с шагом 1. На рис. 2.1, б)
проиллюстрировано это координатное соглашение.
Рис. 2.1. (а) Координатное
соглашение во многих кни-
книгах по обработке изображе-
изображений; (б) координатное согла-
соглашение в MATLAB и IPT
а)
0
1
2
0 1 2
М-\
Один —'
пиксель
•!•
б)
1
2
3
1 2 3
М
N ¦
Один —'
пиксель
В документации пакета IPT соглашение из рис. 2.1, б) называется координа-
координатами пикселов. Реже в этом пакете используется другое координатное соглашение,
которое называется пространственными координатами, при котором х называ-
называется столбцом, а у — строкой. Это противоречит нашим обозначениям для хну.
Глава 2. Цифровые изображения в MATLAB
За малым исключением, мы не будем в этой книге использовать терминологию
пространственных координат из пакета IPT, однако читателю наверняка придет-
придется встретиться с этим при изучении документации по IPT.
2.1.2. Изображение как матрица
Система координат из рис. 2.1, а) и предшествующее обсуждение приводит к
следующему представлению функции цифрового изображения:
f(x,y) =
/@,
/A.
0)
0)
/@,
/A,
1) • •••
1) ...
/@,
/A,
N-
N -
1)
1)
_ /(М- 1,0) /(М-1,1)
Здесь справа от знака равенства, по определению, стоит цифровое изображение.
Каждый элемент этого массива называется элементом изображения или пик-
пикселом. Термины изобрасисение и пиксел будут применяться до конца этой книги
исключительно к цифровым изображениям и их элементам.
Цифровое изображение имеет естественное представление в виде матрицы
MATLAB1:
f =
()
fB,2)
f(M,2)
()
fB,N)
f(M,N)
где f A,1) = /@,0) (напомним, что шрифт печатной машинки используется для
обозначения величин MATLAB). Ясно, что оба эти представления изображений
являются эквивалентными с точностью до сдвига начала координат. Формула
f (p, q) обозначает элемент, расположенный в строке р и в столбце q. Например,
fF,2) — это элемент шестой строки и второго столбца матрицы f. Обычно бу-
будут использоваться буквы М и N для обозначения, соответственно, числа строк
и столбцов матрицы f. Матрица размера lxN называется вектором-столбцом, а
матрица размера Mxl — вектором-строкой. Матрица 1x1 называется скаляром.
Матрицы в MATLAB хранятся в виде переменных с именами вроде A, a, RGB,
real_array и т. п. Имена переменных должны начинаться с буквы и могут состо-
состоять из букв, цифр и знаков подчеркивания. Как уже говорилось в предыдущем
абзаце, в этой книге любые величины MATLAB набираются шрифтом печат-
печатной машинки, в котором все символы имеют одинаковую ширину. Для матема-
математических формул и выражений будет использоваться стандартный наклонный
латинский шрифт italic.
1Ъ документации по MATLAB и IPT оба термина, матрица и массив, часто являются сино-
синонимами, однако стоит помнить, что матрица является двумерным массивом, а общий массив
может иметь произвольную размерность.
2.2. Загрузка изображений
2.2. Загрузка изображений
Для загрузки (чтения) изображений в рабочее пространство MATLAB исполь-
используется функция imread со следующим синтаксисом:
imread(cfilenamec) .
Здесь filename — это строка символов, образующих полное имя загружаемого
файла изображения (включая любое расширение). Например, командная строка
>> f=imread(cchestxray. jpgc);
присваивает изображение формата JPEG (см. табл. 2.1) с именем chestxray мат-
матричной переменной f. Заметим, что символ (с) используется в качестве ограни-
ограничителя символьной строки filename. Точка с запятой в конце командной строки
означает инструкцию системе MATLAB не отображать вывод для данной коман-
команды. Если точка с запятой отсутствует, то MATLAB отображает результат (вывод)
выполнения операций в командной строке. Символ приглашения (>>) обозна-
обозначает начало командной строки, который появляется в окне команд MATLAB
(см. рис. 1.1).
Таблица 2.1. Некоторые графические форматы, распознаваемые командами imread и
imwrite, начиная с MATLAB 6.5. Более ранние версии поддерживали не
все форматы (см. подробную информацию в онлайновой справке)
Формат
изображения
Расшифровка сокращения
Допустимые
изображения
TIFF Tagged Image File Format .tif, .tiff
JPEG Joint Photographic Experts Group -jpg> • JPeg
GIF Graphics Interchange Format .gif
BMP Windows Bitmap .bmp
PNG Portable Network Graphics .png
XWD X Window Dump .xwd
Если в имя файла изображения не включена информация о пути к данному
файлу, как это имело место в последнем примере, то файл filename ищется в
текущей папке (см. § 1.7.1). А если его там нет, то делается поиск данного файла
во всех папках, пути к которым указаны в пути поиска MATLAB (см. § 1.7.1I.
Самый простой способ прочесть изображение из некоторой конкретной папки —
это включить полный или относительный путь к этой папке в строке filename.
Например, команда
>> f = imread(cD:\myimage\chestxray.jpgc);
считывает изображение из папки my image на диске D:, а команда
>> f = imread(' . \myimage\chestxray. jpg');
1В некоторых операционных системах вместо термина папка, применяемого в системе Windows,
используется термин директория.
Глава 2. Цифровые изображения в MAT LAB
загружает изображение из подпапки my image текущей рабочей папки. Текущая
рабочая папка MATLAB отображается в строке инструментов рабочего стола,
где ее легко поменять вручную. В табл. 2.1 перечислены некоторые популярные
форматы графических файлов, поддерживаемые командами imread и imwrite
(функция imwrite будет обсуждаться ниже в § 2.4).
Функция size(f ) возвращает размер изображения, т. е. число строк и столбцов:
>> size(f)
ans =
1024 1024
Эта функция будет особенно полезной при автоматическом определении размера
изображения, которое делается операцией2
>> [M,N] = size(f);
При такой записи переменной М будет присвоено число строк изображения, а
переменной N — число столбцов.
Функция whos сообщает дополнительную информацию о массиве. Например,
строка
>> whos f
дает следующий результат:
Name Size Bytes Class
f 1024x1024 1048576 uint8 array
Grand total is 1048576 elements using 1048576 bytes
Запись uint8 означает один из классов данных MATLAB, которые будут об-
обсуждаться в § 2.5. Если в конце строки с командой whos поставить точку с запя-
запятой, то это не вызовет никакого эффекта, поэтому точку с запятой там можно не
ставить.
2.3. Вывод изображения на дисплей
Изображения можно вывести на дисплей компьютера с помощью функции imshow,
которая имеет следующий синтаксис:
imshow(f, G),
где f — это матрица изображения, a G — это число уровней яркости, используемое
при отображении этого изображения. Если аргумент G опущен, то по умолчанию
принимается 256 уровней яркости. Команда
imshow(f, [low high])
2Обратите внимание на то, что, подобно функции size, многие функции MATLAB и IPT в ка-
качестве своего вывода возвращают более одного значения. Поэтому при использовании операции
присвоения этот вывода следует заключать в квадратные скобки.
2.3. Вывод изображения на дисплей
означает, что все пикселы со значением не больше числа low надо показывать
черными, а все пикселы со значениями не меньше числа high — белыми. Все
промежуточные значения показываются с промежуточной яркостью с использо-
использованием числа уровней, принятому по умолчанию. Наконец, запись в командной
строке
imshow(f, [ ] )
задает для переменной low минимальное значение массива f, а переменной high
присваивается его максимальное значение. Такая форма функции imshow бывает
полезной при показе изображений, имеющих узкий динамический диапазон зна-
значений пикселов, или когда среди них имеются положительные и отрицательные
значения.
Функция pixval часто используется для интерактивного определения зна-
значений яркости отдельных пикселов. Эта функция отображает курсор, располо-
расположенный поверх изображения. Курсор перемещается по изображению вместе с
мышью, а под окном изображения отображаются текущие координаты курсора
и значение интенсивности в этой точке. При работе с цветным изображением
вместе с координатами отображается интенсивность (яркость) красной, зеленой
и синей компоненты цветного пиксела. При нажатии и удержании левой кла-
клавиши мыши функция pixval показывает евклидово расстояние от исходного до
текущего положения курсора.
Синтаксическая форма этой команды имеет вид
pixval,
которая помещает курсор на последнее выведенное на дисплей изображение. На-
Нажатие кнопки X в окне курсора отключает курсор на изображении.
Пример 2.1. Чтение и вывод изображения.
(а) Следующая команда читает изображение rose_512.tif, выдает основную
информацию об этом изображении и отображает его с помощью функции imshow:
>> f=imread('rose_512.tif') ;
>> whos f
Name Size Bytes Class
f 512x512 262144 uint8 array
Grand total is 262144 elements using 262144 bytes
>> imshow(f , [ ])
Знак точка с запятой в конце команды imshow не имеет никакого действия,
поэтому его можно опускать. На рис. 2.2 показано, как результат этой команды
выглядит на дисплее. Номер графика появляется в верхнем левом углу этого
окна. Обратите внимание на ниспадающие меню и кнопки инструментов. С их
помощью выполняются такие действия, как смена масштаба, сохранение и пре-
преобразование графического содержимого этого окна. Так, например, меню Edit
содержит функции редактирования и форматирования перед печатью или со-
сохранением на диске результатов работы.
Глава 2. Цифровые изображения в MATLAB
Если теперь показать другое изображе-
изображение, скажем, g, с помощью функции imshow,
то MATLAB поместит его на место старого.
Чтобы сохранить на рабочем столе предыду-
предыдущее изображение, можно использовать коман-
команду figure. Если набрать строку
>> imshow(f), figure, imshow(g)
то будут показаны оба изображения. Отметим,
что в MATLAB можно записывать несколько
команд, разделяя их запятыми или точками
с запятой. Как уже говорилось выше, точка с
запятой подавляет вывод на экран результа-
результатов в командной строке.
(б) Предположим, что было загружено
изображение h, которое отображено на экране
командой imshow (h), результат которой пока-
показан на рис. 2.3, а). Видно, что это изображе-
изображение имеет узкий динамический диапазон, ко-
который можно расширить для улучшения его
визуализации командой
>> imshow (h, [ ])
На рис. 2.3, б) показан результат этого действия, который, очевидно, выгля-
выглядит лучше для зрительного восприятия. ?
Рис. 2.2. Снимок экрана с окном изоб-
изображения на рабочем столе MATLAB.
Во всех следующих примерах в этой
книге будет отображаться только само
изображение без окна. Номер рисунка
указан в левом верхнем углу
а)
б)
Рис. 2.3. а) Изображение
h с узким динамическим
диапазоном, б) Результат
преобразования функцией
imshow(h, [ ]). (Изображе-
(Изображение предоставил д-р Дэвид
Р. Пикенс, Департамент ра-
радиологии и радиологических
наук медицинского центра-
университета Вандербилта)
2.4. Сохранение изображений
Изображения записываются на диск функцией imwrite, которая имеет следую-
следующий синтаксис:
imwrite(f, 'filename')
При такой записи строка filename должна содержать расширение, поддержива-
поддерживаемое системой MATLAB (см. табл. 2.1). Иначе желаемый формат можно задать
2.4- Сохранение изображений
явно с помощью третьего аргумента функции. Например, следующая команда за-
записывает матрицу f в изображение с форматом TIFF с именем patientlO_runl:
>> imwrite(f, 'patientlO_runlc, 'tif')
или, что эквивалентно,
>> imwrite(f, cpatientl0_runl.tif')
Если строка filename не содержит информацию о пути, то функция imwrite
записывает файл в текущую рабочую папку.
Функция imwrite может иметь другие параметры, зависящие от выбранного
формата. В следующих главах мы будем иметь дело в основном с двумя графи-
графическими форматами: JPEG или TIFF. Рассмотрим их более подробно.
Более общий синтаксис функции imwrite, применяемый только к файлам в
формате JPEG, имеет следующий вид:
imwrite(f, (filename.jpgс, 'quality', q),
где q — это целое число в интервале от 0 до 100 (чем меньше это число, тем выше
степень искажения при сжатии файла в формате JPEG).
Пример 2.2. Сохранение изображения и применение функции imf inf о.
На рис. 2.4, а) приведено изображение f, которое весьма типично для некоторого
химического процесса. Предполагается передавать эти изображения по сети свя-
связи на центральный компьютер для визуального и/или автоматического контроля.
Чтобы сократить передаваемый объем данных, который влияет на время пере-
передачи и требуемую память для хранения этих данных, имеет смысл максимально
сжимать графические файлы, так, чтобы возникающие искажения при деком-
декомпрессии (разжатии) не превосходили некоторого разумного порога или уровня.
В этом контексте «разумность» уровня означает отсутствие ложно воспринима-
воспринимаемых контуров. На рис. 2.4 (б) — (е) даны результаты, полученные при записи
на диск изображения f (в формате JPEG) при q = 50, 25, 15, 10, 5 и 0 соот-
соответственно. Например, при q = 25 выполнялась команда
>> imwrite(f, cbubbles25.jpgc; quality, 25)
Изображение при q = 15 [см. рис. 2.4, г)] имеет ложные контуры, которые ед-
едва различимы, однако этот эффект становится вполне ясным при q = 5 и q = 0.
Поэтому допустимым решением с некоторым крайним порогом ошибки будет
сжатие изображений при q = 25. Чтобы понять идею достигнутой компрессии
(сжатия) и получить другую информацию о файле изображения, молено исполь-
использовать функцию imf inf о, которая имеет вид
imfinfо filename,
где filename — это полное имя файла изображения, хранящегося на диске. На-
Например,
>> imf inf о bubbles25.jpg
выдает на выход следующую информацию (отметим, что для этого случая неко-
некоторые информационные поля остались пустыми):
Глава 2. Цифровые изобраэюения в MATLAB
Filename:'bubbles25.jpg'
FileModeData:'04-Jan-2003 12:31:26 <
FileSize:13849
Format:'jpeg'
FormatVersion:<
Widht:714
Height:682
BitDepth:8
ColorType:'grayscale'
FormatSignature:«
Commnet:{}
Рис. 2.4. а) Исходное изоб-
изображение. б)-е) Сжатие jpeg
со значениями параметра ка-
качества q = 50, 25, 15, 5 и 0
соответственно. Ложные конту-
контуры становятся различимыми
при q = 15 (изображение г)) и
совершенно явными при q =
= 5 и q= О1
где значение FileSize дано в байтах. Для нахождения числа байтов в исход-
исходном (несжатом) изображении надо просто перемножить величины Widht, Height
хСм. пример 2.11, в котором приводится функция, которая в одном цикле for генерирует все
изображения рис. 2.4.
2.4- Сохранение изображений
и BitDepth, а затем разделить полученное произведение на 8. Получится чис-
число 486 948. Если его разделить на FileSize, то получится степень сжатия ^^
= 35.16. Эта степень сжатия была достигнута при качестве изображения, хоро-
хорошо согласующемся с требованиями конкретного приложения. Помимо очевидно-
очевидного освобождения объема памяти компьютера, это сокращение дает выигрыш по
времени передачи сжатых изображений примерно в 35 раз.
Информационные поля, которые выводятся на экран функцией imf inf о, мож-
можно ввести в т.н. структурные переменные2, которые затем можно использовать
в последующих вычислениях. Беря в качестве примера предыдущее изображение
и присваивая имя К структурной переменной, можно дать команду
>> К = imfinfo('bubbles25.jpg');
для сохранения в переменной К всей информации, генерируемой командой imf inf о.
Информация, полученная из функции imf inf о сохраняется в полях структурной
переменной К, которые отделяются от нее точкой. Например, высота и ширина
изображения теперь хранятся в структурных полях К.Height и К.Width.
Для иллюстрации рассмотрим следующее применение структурной перемен-
переменной К для вычисления степени сжатия в изображении bubbles25.jpg:
>> К = imf info(cbubbles25. jpg');
>> image.bytes = К.Width*K.Height*K.BitDepth/8;
>> compressed.bytes = K.FileSize;
>> compressed.ratio = image_bytes/compressed_bytes
compressed_ratio =
35.1612
Заметим, что в наших примерах функция imf inf о применялась двумя разными
способами. В первом случае была просто набрана команда imf inf о bubbles25. jpg
после приглашения, что отобразило информацию на дисплее. Во втором слу-
случае была исполнена команда К = imf inf o('bubbles25. jpg'), в результате че-
чего соответствующая информация была сохранена в структурной переменной К.
В этих двух различных способах применения функции imf inf о обнаруживает-
обнаруживается командно-функциональная двойственность3, которая является характерной
чертой системы MATLAB. Подробнее с этим можно ознакомиться в онлайновой
документации. ?
Еще один синтаксис функции imwrite доступен при работе с форматом изоб-
изображений tif. Он имеет следующий вид:4
imwrite(g, 'filename.tif, 'compression', ...
'parameter', 'resolution', [colres rowres]),
2Структуры будут обсуждаться подробно в §§ 2.10.6 и 11.1.1.
3Чтобы узнать подробнее о командно-функциональной двойственности, посмотрите страницу
справки по этому вопросу. О том, как обратиться к справке, было рассказано в § 1.7.3.
4Если последовательность команд не помещается в одной строке, можно использовать многото-
многоточие (...)? после которого нажать Return или Enter. Это даст знак системе, что команды будут
продолжены на следующей строке. Между точками не нужно ставить пробелы.
Глава 2. Цифровые изображения в MATLAB
где 'parameter' может иметь только следующие значения: 'попе' (отсутствие
компрессии), 'packbits' (компрессия packbits, используемая по умолчанию для
небинарных файлов) и 'ccitt' (компрессия ccitt, используемая по умолчанию
для бинарных файлов). Массив [colres rowres] размера 1x2 содержит две це-
целые переменные, которые сообщают разрешение, соответственно, по столбцам и
по строкам в точках на условную единицу (значение по умолчанию — [72,72]).
Например, если размер изображения указан в дюймах, то colres — это число
точек (пикселов) на дюйм (dpi, dot per inch) no вертикали, и, соответственно,
rowres — разрешение по горизонтали. Для того, чтобы задать одинаковое раз-
разрешение, например, res, и по вертикали, и по горизонтали, достаточно записать
[res res].
Пример 2.3. Использование параметров imwrite.
На рис. 2.5, а) показан 8-битовый тестовый рентгеновский снимок монтажной
платы. Изображение записано в формате jpg с разрешением 200 dpi. Изобра-
Изображение имеет размер 450x450 пикселов или 2,25x2,25 дюймов. Мы хотим его
сохранить в формате tif без сжатия и присвоить файлу имя sf. Кроме того, же-
желательно сократить размер изображения до 1,5x1,5 дюймов, сохранив при этом
пиксельный размер 450x450. Следующая строка дает решение этой задаче:
>> imwrite(f, 'sf.tif, 'compression', 'none', 'resolution', ...
[300 300])
Значение вектора [colres rowres] определено при умножении 200 dpi на
дробь 2,25/1,5, что дает число 300 dpi. Чтобы не делать ручных вычислений,
можно выполнить команду
>> res = roundB00*2.25/1.15);
>> imwrite(f, 'sf.tif, 'compression', 'none', 'resolution', res)
а) б) Рис. 2.5. Эффекты изме-
изменения разрешения dpi при
сохранении общего числа
пикселов, а) Изображение
450 х 450 пикселов с разреше-
разрешением 200 dpi (размер 2,25х
х2,25 дюймов), б) То же
изображение 450x450 пик-
пикселов с разрешением 300 dpi
(размер 1,5x1,5 дюймов).
(Исходное изображение пре-
предоставлено кампанией Lixi,
Inc.)
Здесь функция round округляет значение аргумента до ближайшего целого
числа. Важно обратить внимание на то, что число пикселов изображения не из-
изменилось при выполнении этих команд. Изменился лишь масштаб изображения.
2.5. Классы данных
Исходное изображение 450x450 при разрешении 200 dpi имело размер 2,25x2,25
дюймов, а в новом изображении с разрешением 300 dpi 450x450 пикселов рас-
распределены по площади 1,5x1,5 квадратных дюймов. Этой процедурой удобно
пользоваться для контроля размеров изображения при печати, когда оно имеет
неудовлетворительное разрешение. ?
Часто бывает необходимо сохранить изображение на диске точно в том ви-
виде, в каком оно отображено на экране. Особенно важно уметь это делать для
графиков и диаграмм, приведенных в следующей главе. Содержимое окна изоб-
изображений можно экспортировать на диск двумя способами. Первый способ — это
воспользоваться командой Export в ниспадающем меню File в окне изображе-
изображений (см. рис. 2.2). Затем пользователь получает возможность выбрать папку на
диске, имя и формат файла. Еще большие возможности для выбора параметров
экспорта дает команда print:
print — f no —dfileformat —rresno —filename,
где no — это номер окна интересующего изображения, file format — это один из
допустимых форматов изображения (см. табл. 2.1), resno — это разрешение в dpi,
a filename — это имя, под которым пользователь хочет сохранить изображение.
Например, чтобы экспортировать содержимое окна на рис. 2.2 в виде t if -файла
с разрешением 300 dpi под именем hi_res_rose, необходимо выполнить команду
>> print -fI -dtiff -гЗОО hi_res_rose
Эта команда поместит построенный файл hi_res_rose.tif в текущую папку.
Если просто набрать print после приглашения, то MATLAB напечатает
(на принтере, принятом по умолчанию) содержимое последнего выведенного на
экран окна изображений. Можно также указать другие опции команды print,
например, задать специфическое печатное устройство.
2.5. Классы данных
Несмотря на то, что приходится работать с целочисленными координатами, зна-
значения самих пикселов не обязательно должны быть целыми числами. В табл.
2.2 перечислены разные классы данных1, поддерживаемые системой MATLAB и
пакетом IPT. Первые восемь записей, приведенных в таблице, относятся к число-
числовым классам данных. Девятая запись — это класс символов, а последняя запись
относится к логическому классу данных.
Все численные операции в MATLAB выполняются с двойной точностью в
классе данных double, который часто используется в приложениях по обработки
изображений. Класс uint8 тоже встречается весьма часто, особенно при считыва-
считывании данных с запоминающих устройств, например, самых распространенных на
практике 8-битных изображений. Эти два класса данных, класс logical, а так-
также в меньшей степени класс uintl6, образуют первостепенные классы данных,
1В документации по MATLAB используются словосочетания классы данных и типы данных в
одном и том же смысле. В данной книге термин тип изображения зарезервирован для других
целей, которые будут обсуждаться в § 2.6.
Глава 2. Цифровые изображения в MATLAB
на которых будет сфокусировано внимание в нашей книге. Многие функции из
IPT поддерживают, однако, все классы данных, приведенные в табл. 2.2. Класс
данных double требует 8 байт для представления одного числа, класс uint8 ис-
использует один байт на каждый элемент, типам uintl6 и intl6 необходимо по 2
байта, а типы uint32, int32 и single отнимают в памяти по 4 байта на каждый
элемент. Символьный класс данных char хранит буквы и символы в кодиров-
кодировке Unicode, в которой используется два байта на элемент. Символьная строка
представляет собой массив lxn символов класса char. Массив logical состоит
из элементов, принимающих только два значения, 0 и 1, которые хранятся в
памяти, занимая по одному байту каждый. Логические массивы создаются с ис-
использованием функции logical (см. § 2.6.2) или с помощью операций сравнения
(см. § 2.10.2).
Таблица 2.2. Классы данных. Первые восемь классов называются числовыми, девятый
символьный класс, последний класс — логический
Имя
Описание
double Вещественные числа с плавающей запятой двойной точности
в диапазоне, примерно, от —10308 до 10308 (8 байт на число).
uint8 Целые без знака в интервале [0,255] A байт на число).
uintl6 Целые без знака в интервале [0,65535] B байта на число).
uint32 Целые без знака в интервале [0,4294967295] D байта на число).
int8 Целые со знаком в интервале [—128,127] A байт на число).
intl6 Целые со знаком в интервале [—32768,32767] B байта на число).
int32 Целые со знаком в интервале [-2147483648, 2147483647] D байта).
single Вещественные числа с плавающей запятой обычной точности
в диапазоне, примерно, от —1038 до 1038 D байта на число).
char Символы (буквы и знаки) B байта на символ).
logical Значения 0 или 1 A байт на элемент).
2.6. Типы изображений
Пакет IPT поддерживает следующие типы изображений:
- полутоновые изображения (изображения с градацией серого цвета);
- двоичные изображения;
- индексированные изображения;
- цветные изображения RGB.
Большинство монохромных изображений обрабатывается операциями, которые
работают с двоичными и полутоновыми изображениями, поэтому вначале наше
внимание будет обращено именно на эти два типа изображений. Индексирован-
Индексированный тип и тип изображений RGB будут обсуждаться в гл. 6.
2.6. Типы изображений
2.6.1. Полутоновые изображения
Полутоновое изображение — это матрица, элементы яркости которой представ-
представлены в виде числовых значений. Если элементы полутонового изображения при-
принадлежат классу uint8 или uintl6, то они представлены целыми числами, со-
соответственно, в интервалах [0,255] и [0,65535]. Если изображение принадлежит
классу double, то его пикселы являются вещественными числами с плавающей
запятой. По общему соглашению, пикселы изображений double должны лежать
в интервале [0,1].
2.6.2. Двоичные изображения
Двоичные изображения имеют в MATLAB весьма специфический смысл. Они яв-
являются логическими массивами, состоящими из 0 и 1. Поэтому массив элементов
0 и 1 других классов, например, uint8, двоичным изображением не считается.
Для преобразования числовых массивов в логические служит функция logical.
Если А — числовой массив, состоящий из 0 и 1, то для построения логического
массива В с теми же элементами следует выполнить команду
В = logical(А) .
Если массив А имеет также другие элементы, отличные от 0 и 1, то функция
logical преобразует все его ненулевые единицы в логический элемент 1, а все
нулевые — в логический элемент 0. Операции сравнения (см. § 2.10.2) и логиче-
логические операторы тоже порождают логические массивы.
Чтобы проверить, является ли данный массив логическим, применяется функ-
функция islogical:
islogical(C) .
Если С — логический массив, то эта функция возвращает 1, в противном случае — 0.
Для преобразования логических массивов в числовые применяются функции пре-
преобразования классов данных, которые будут обсуждаться в § 2.7.11.
2.6.3. Еще раз о терминологии
В предыдущих параграфах большое внимание было уделено разъяснению поня-
понятий класс данных и тип изображения. Теперь мы будем использовать выражения
вида «изображение типа image.type класса data_class», где слова data_class
даны в табл. 2.2, a image.type — это один из типов изображений, перечисленных
в начале § 2.6. Таким образом, изображение характеризуется своим классом и
типом. Например, если обсуждается «полутоновое изображение класса uint8»,
то это означает, что речь идет об изображении, пикселы которого принадлежат
классу uint8. Многие функции пакета IPT поддерживают все классы данных, но
там имеются и специализированные инструменты, сконструированные для рабо-
работы с конкретными классами. Например, как говорилось выше, пикселы двоичных
изображений могут быть только из класса logical.
хСм. табл. 2.9, в которой приведен список других функций, имеющих синтаксис вида is*.
Глава 2. Цифровые изображения в MATLAB
2.7. Конвертирование классов данных и типов
изображений
Преобразование (конвертирование) изображений из одних классов и типов в дру-
другие классы и типы является самым распространенным действием в IPT. Совер-
Совершая конвертацию типов данных, следует помнить о диапазонах значений величин
каждого класса, приведенных в табл. 2.2.
2.7.1. Конвертирование классов данных
Классы конвертируются следующим образом:
В = data_class_name(A) ,
где data_class_name — это одно из имен классов данных из первого столбца
табл. 2.2. Например, пусть А — массив класса uint8. Массив двойной точности В
генерируется командой В = double (А). Это преобразование будет весьма часто
применяться в книге, поскольку MATLAB предполагает, что операнды числовых
операций являются вещественными числами с двойной точностью. Если С — это
массив класса double, элементы которого лежат в интервале [0, 255], но среди них
могут встречаться дробные числа, то его можно преобразовать в массив uint8
командой D = uint8(C).
Если массив класса double имел элементы со значениями вне интервала [0,255]
и он был конвертирован в класс uint8 описанным выше способом, то MATLAB
преобразует все отрицательные величины (меньшие 0) в 0, все величины, боль-
большие 255 — в 255, а у всех остальных элементов отбрасываются дробные части.
Это означает, что перед преобразованием массивов double в uint8 необходимо
совершить подходящую перенормировку (перемасштабирование) его элементов.
Как уже говорилось в § 2.6.2, преобразование любых числовых данных в логи-
логические приводит к логическому массиву, в котором стоят логические 1 везде на
месте ненулевых элементов входного массива и 0 на месте тех элементов, которые
равны нулю.
2.7.2. Конвертирование классов и типов изображений
В пакете имеются специальные функции (см. табл. 2.31), которые совершают пе-
перенормировку (перемасштабирование) при конвертации одних классов и типов
изображений в другие. Функция im2uint8 сначала распознает класс данных на
входе и совершает все необходимые преобразования, чтобы выходное изображе-
изображение имело правильный тип данных. Рассмотрим, к примеру, следующее изобра-
изображение f размера 2x2 класса double, которое может являться результатом неко-
некоторых промежуточных вычислений:
>> f =
-0.5 0.5
0.75 1.5
1 Функцию changeclass, которая рассматривается в § 3.2.3, можно использовать для изменения
класса входного изображения.
2.7. Конвертирование классов данных и типов изображений
Выполняя преобразование
>> g = im2uint8(f)
получаем результат
g =
О 128
191 255
Таблица 2.3. Функции IPT для конвертации классов и типов изображений. См. функции
из табл. 6.3 для конвертации цветных изображений
Имя
im2uint8
im2uintl6
mat2gray
im2double
im2bw
Преобразует в
uint8
uintl6
double (в область [0,1])
double
logical
Допустимый класс
logical,uint8,uint16
logical,uint8,uint16
double
logical,uint8,uint16
uint8,uint16,double
,double
,double
,double
В последнем примере видно, что функция im2uint8 обнуляет все отрицатель-
отрицательные значения входного изображения, ставит число 255 на место величин, боль-
больших 1, и умножает остальные значения на 255, после чего округляет результат до
ближайшего целого числа. Отметим, что функция im2uint8 делает округление
не так, как это совершает описанная в § 2.7.1 функция преобразования классов
данных uint8, которая просто отбрасывает дробную часть числа.
Преобразование произвольных массивов double в перенормированные масси-
массивы (изображения) double со значениями в интервале [0,1] выполняется с помо-
помощью функции mat2gray, имеющий следующий синтаксис:
g = mat2gray(A, [Amin, Amax]) ,
где изображение g имеет значения пикселов в интервале от 0 (белый) до 1 (чер-
(черный). Указанные параметры Amin и Amax имеют следующее действие: все элемен-
элементы, меньшие Amin, обнуляются, а все элементы, большие Amax, заменяются на 1.
При выполнении команды
>> g = mat2gray(A);
значения Amin и Amax — это настоящие максимум и минимум массива А. Предпо-
Предполагается, что входной массив из класса double. Выходной массив также принад-
принадлежит классу double.
Функция im2double преобразует входной массив в класс double. Если входной
массив был из класса logical,uint8 или uintl6, то функция im2double преоб-
преобразует его в класс double с диапазоном [0,1]. Если входной массив был класса
double, то функция im2double оставляет его без изменений. Как уже объясня-
объяснялось выше, для преобразования массивов double в массивы double со значениями
в интервале [0,1] применяется функция mat2gray.
В качестве иллюстрации рассмотрим изображение класса uint82
2В § 2.8.2 поясняется использование квадратных скобок и знака точка с запятой при задании
матриц.
Глава 2. Цифровые изображения в MATLAB
» h = uint8([25 50; 128 200]);
Совершая преобразование
>> g = im2double(h) ;
получаем результат
g =
0.0980
0.4706
0
0
.1961
.7843
из которого видно, что входной массив класса uint8 преобразуется делением
каждого его элемента на 255, а массив класса uintl6 будет делиться на 65535.
В заключение рассмотрим конвертацию двоичных и полутоновых изображе-
изображений. Функция im2bw, имеющая синтаксис
g = im2bw(f, T) ,
порождает двоичное изображение g из полутонового изображения f, используя
порог Т. Значения всех элементов f, меньших Т, становятся логическим 0, а все
остальные — логическими 1. Значение порога Т должно находиться в интерва-
интервале [0,1] независимо от класса входного изображения. Выходной массив авто-
автоматически делается логическим. Если написать g = im2bw(f), то в IPT будет
использоваться по умолчанию порог Т = 0.5. Если входное изображение было
класса uint8, то im2bw сначала делит его элементы на 255, а потом применяет
заданный порог или порог, принятый по умолчанию. Если входной массив был
класса uintl6, то деление производится на 65535. Если входное изображение
принадлежало классу double, то im2bw сразу применяет соответствующий порог.
Если входной массив был логическим, то выходной массив будет ему идентичен.
Логический (двоичный) массив можно преобразовать в числовой с помощью лю-
любой из первых четырех функций в табл. 2.3.
Пример 2.4. Конвертирование классов и типов изображений.
(а) Мы хотим преобразовать следующее изображение класса double
>> f = [1 2; 3 4]
f =
1 2
3 4
в двоичное изображение так, чтобы величины 1 и 2 стали 0, а все остальные
обратились в 1. Прежде всего, сделаем преобразование в область [0,1] :
g = mat2gray(f)
g =
0 0.3333
0.6667 1.0000
Затем конвертируем эту матрипу в двоичную с помощью порога, например, Т = 0.26:
>> gb = im2bw(g, 0.6)
2.7. Конвертирование классов данных и типов изобраснсений
gb =
0 О
1 1
Как уже отмечалось в § 2.5, имеется возможность прямого построения двоич-
двоичных массивов с помощью операций сравнения (см. § 2.10.2). Мы получим тот же
результат, выполнив команду
>> gb = f > 2
gb =
0 О
1 1
Можно сохранить в некоторой переменной (например, в gvb) информацию о том,
что массив gb является логическим, используя функцию islogical, в следую-
следующей команде:
>> gbv = islogical (gb)
gbv =
1
(б) Теперь мы хотим конвертировать массив gb в цифровой массив double, со-
состоящий из нулей и единиц. Это можно сделать командой
>> gbd = im2double(gb)
gbd =
0 О
1 1
Если бы массив gb принадлежал классу uint8, то применение к нему im2double
привело бы к следующей матрице:
О О
0.0039 0.0039
так как функция im2double должна разделить все элементы на 255. Это не про-
произошло в предыдущей команде, так как im2double обнаружила, что входная мат-
матрица была из класса logical, т. е. имеется всего два возможных значения: 0 или 1.
На самом деле, если бы исходная матрица была бы класса uint8 и требовалось
конвертировать ее в double, сохраняя значения 0 и 1, то такое действие молено
выполнить командной:
>> gbd = double (gb)
gbd =
0 0
1 1
В заключение отметим, что MATLAB допускает вложенные команды, т. е. все
действия над входным изображением f можно выполнить в одну строчку
>> gbd = im2double(im2bw(mat2gray(f), 0.6));
Разумеется, весь этот процесс можно осуществить более простой командой
Глава 2. Цифровые изображения в МАТЬ А В
» gbd = double(f > 2);
которая еще раз демонстрирует компактность языка MATLAB. ?
2.8. Индексирование массивов
В системе MATLAB предусмотрено несколько мощных схем индексирования, ко-
которые сильно упрощают обращение с массивами и оптимизируют работу про-
программ. В этом параграфе обсуждается и иллюстрируется базовое индексирова-
индексирование одномерных и двумерных массивов (т. е. индексирование векторов и матриц).
Более изощренные методы будут обсуждаться по мере необходимости.
2.8.1. Индексирование векторов
Как уже сообщалось в § 2.1.2, массив размера 1 xN называется вектором-строкой.
Элементы таких векторов можно получить с помощью одномерного индексиро-
индексирования. Так, например, v(l) — это первый элемент вектора v, vB) — это второй
элемент и т.д. При инициализации элементы векторов следует помещать в квад-
квадратные скобки, разделяя их пробелами или запятыми. Например,
>> v = [1 3 5 7 9]
v =
13 5 7 9
>> vB)
ans =
3
Вектор-строку можно преобразовать в вектор-столбец с помощью оператора
транспонирования (. 'I:
>> w = v. '
W =
1
3
5
7
9
Для доступа к блоку элементов в MATLAB принято использовать оператор
двоеточие. Например, чтобы получить вектор, состоящий из трех первых ком-
компонент вектора v, пишем
ans =
13 5
1 Использование символа одинарный апостроф без точки означает операцию сопряженного
транспонирования комплексных данных. Если данные являются вещественными, то эта опе-
операция совпадает с обычным транспонированием матриц (см. табл. 2.4).
2.8. Индексирование массивов 47
Аналогичным образом можно получить элементы со второго по четвертый
>> vB:4)
ans =
3 5 7
или, например, с третьего до последнего:
>> vC:end)
ans =
5 7 9
где слово end означает последний элемент вектора. Запись
» v(:)
генерирует вектор-столбец, а команда
>> v(l:end)
дает вектор-строку.
Индексировать можно не только последовательные элементы. Например, мож-
можно задать команду
>> v(l:2:end)
ans =
15 9
Запись 1:2: end означает следующее: начать с 1, считать с шагом 2 и остановить-
остановиться, когда счетчик достигнет последнего элемента. Шаг может быть отрицатель-
отрицательным:
>> v(end:-2:l)
ans =
9 5 1
Здесь счетчик индексов начинается от последнего элемента, уменьшается на каж-
каждом шаге на 2 и останавливается, достигнув первого элемента.
Функция linspace, имеющая синтаксис
х = linspace(a, b, п) ,
порождает вектор-строку х из п элементов, расположенных на равных расстоя-
расстояниях на отрезке от числа а до числа Ъ, включая их самих. Эта функция будет
иногда использоваться в следующих главах.
Векторы можно использовать в качестве индексов других векторов. Напри-
Например, можно выбрать первый, четвертый и пятый элементы v с помощью команды
>> v([l 4 5])
ans =
17 9
В следующем параграфе мы увидим, что использование векторов при индек-
индексировании играет ключевую роль при работе с матрицами.
Глава 2. Цифровые изображения в MATLAB
2.8.2. Индексирование матриц
Матрицы в MATLAB можно представить в виде последовательности векторов-
строк, заключенных в квадратные скобки и разделенных точкой с запятой. На-
Например, набрав строку
>> А = [1 2 3; 4 5 6; 7 8 9]
получаем матрицу 3x3
А =
12 3
4 5 6
7 8 9
Заметим, что в этой команде использование знака точка с запятой отличается
от его применения с целью подавления вывода или для записи нескольких команд
в одну строку.
Для выбора конкретного элемента матрицы следует действовать как и с эле-
элементами векторов, но здесь уже понадобятся два индекса: один для обозначе-
обозначения номера строки, а другой — для номера столбца, где располагается искомый
элемент. Например, чтобы извлечь элемент, находящийся во второй строке и в
третьем столбце, нужно написать
» АB, 3)
ans =
6
Оператор двоеточие может использоваться при индексировании матриц для
выбора двумерных блоков их элементов. Например,
>> СЗ = А(:, 3)
СЗ =
3
6
9
Здесь можно также использовать эквивалентную запись А A:3, 3), которая про-
просто выберет третий столбец матрицы. Аналогично, вторая строка извлекается
следующим образом:
>> R2 = АB, :)
R2 =
4 5 6
Следующая команда извлекает верхние две строки:
>> Т2 = АA:2, 1:3)
Т2 =
12 3
4 5 6
2.8. Индексирование массивов
Чтобы получить матрицу В, совпадающую с А всюду, кроме последнего столб-
столбца, куда следует поместить нули, можно записать
>> В = А;
>> В(:, 3) = О
В =
12 0
4 5 0
7 8 0
Слово end можно использовать аналогично векторному индексированию. Сле-
Следующие примеры являются простейшими иллюстрациями этого приема.
>> • A (end, end)
ans =
9
>> A(end, end - 2)
ans =
7
>> AB:end, end:-2:1)
ans =
6 4
9 7
С помощью векторов при индексировании матриц можно существенно расши-
расширить конструкции отбора элементов. Например,
» Е = А([1 3], [2 3])
Е =
2 3
8 9
Обозначение А([а Ъ] , [с d]) отбирает элементы матрицы А в следующем по-
порядке координат: (строка а, столбец с), (строка а, столбец d),(строка Ъ, столбец
с),(строка Ь, столбец d). Значит, при присвоении Е = А([1 3] , [2 3]) выбира-
выбираются элементы матрицы А в следующем порядке: элемент в строке 1 и столбце 2,
элемент в строке 1 и столбце 3, элемент в строке 3 и столбце 2, элемент в строке
3 и столбце 3.
Более сложные схемы получаются при матричной адресации. Особенно полез-
полезным является метод индексирования матриц вида A(D), где D — это логический
массив. Например, если
>> D = logical([l 0 0; 0 0 1; 0 0 0])
D =
10 0
0 0 1
0 0 0
то
Глава 2. Цифровые изобраэюепия в MATLAB
» A(D)
ans =
1
6
Наконец, заметим, что подставление одного двоеточия в индекс матрицы при-
приводит к формированию вектор-столбца, в котором следуют один за другим столб-
столбцы исходной матрицы. Например, обращаясь к матрице Т2, получаем вектор
>> v = Т2(:)
v =
1
4
2
5
3
6
Такое применение символа двоеточие бывает полезным, например, если необхо-
необходимо найти сумму всех элементов числовой матрицы:
s = sum(A(:))
s =
45
В общем случае команда sum(v) суммирует все элементы заданного векто-
вектора v. Если аргументом функции sum является матрица (в виде sum (А)), то вы-
выходом служит вектор-строка, элементами которого являются суммы по строкам
заданной матрицы (такое поведение свойственно многим функциям MATLAB,
которые встретятся в дальнейшем). При использовании символа двоеточие реа-
реализуется команда
>> sum(sum(A));
поскольку операция (:) преобразует матрицу в вектор.
Применение двоеточия, на самом деле, является не чем иным, как формой
линейного индексирования в матрицах или в многомерных массивах. MATLAB
хранит в памяти любой массив в виде столбца значений, которые могут иметь
произвольную размерность. Этот столбец состоит из столбцов массивов, состав-
составленных один за другим. Например, матрица А хранится в виде
1
4
7
2
5
8
3
6
9
2.8. Индексирование массивов
Обращение к А с помощью одномерного индексирования делается прямо к
этому столбцу. Например, АC) обозначает третий элемент столбца, т. е. число 7;
А (8) — это восьмое число, т. е. 6 и т.д. При использовании операции (:) мы просто
обращаемся ко всем элементам, A(l:end). Такой тип индексирования является
основой векторизации циклов при оптимизации программ, что будет обсуждать-
обсуждаться в § 2.10.4.
Пример 2.5. Некоторые простые операции над изобрасисениями на основе ин-
индексирования массивов.
На рис. 2.6, а) представлено полутоновое изображение f размера 1024x1024 клас-
класса uint8. Изображение на рис. 2.6, б) было получено из f зеркальным отраже-
отражением по горизонтали с помощью команды
>> fp = f (end:-1:1, :);
Рис. 2.6. Результаты приме-
применения операций над индекса-
индексами массивов, а) Исходное изоб-
изображение, б) Зеркальное отра-
отражение по горизонтали, в) Усе-
Усеченное изображение, г) Проре-
Прореженное изображение, д) Гра-
График средней линии изображения
а)
б)
г)
д)
250
200
150
100
50
Л
M/L L
-
-
-
-
-
-
0 200 400 600 800 1000
Изображение, показанное на рис. 2.6, в), является частью f, после выполне-
выполнения команды
>> fc = f B57:768, 257:768);
Аналогично, рис. 2.6, г) получается «прореживанием» из f, после применения
>> fs = fA:2:end, l:2:end);
Глава 2. Цифровые изображения в MATLAB
Наконец, на рис. 2.6, д) приведен график средней линии изображения f, постро-
построенный командой
>> plot(fE12, :))
Функция plot подробно рассматривается в § 3.3.1. ?
2.8.3. О размерности массивов
Операции вида
operation(A, dim)
часто используются в книге. Здесь operation обозначает некоторую функцию
MATLAB, А — какой-то массив, a dim — некоторый скаляр. Например, пусть А —
матрица размера MxN. Команда
>> k = size(A, 1) ;
сообщает размер матрицы А по первому измерению, которое называется в MATLAB
вертикальной размерностью. Т. е. эта команда выдает число строк матрицы А.
Аналогично, второе измерение массива называется горизонтальной размерно-
размерностью, т.е. команда size (А, 2) сообщает число столбцов матрицы. Размерность
dim, для которой size (A, dim) = 1, называется точечной размерностью. Ис-
Используя эти понятия, можно записать последнюю команду из примера 2.5 в сле-
следующем виде:
» plot(f(size(f, l)/2, :))
MATLAB не устанавливает ограничений на число размерностей массивов, что
является полезным свойством системы. В книге мы имеем дело, в основном, с
двумерными массивами, однако бывают случаи (например, при работе с цветны-
цветными изображениями или с изображениями в нескольких спектрах), когда бывает
необходимо «укладывать» изображения вдоль третьего или еще большего изме-
измерения. Такие случаи будут рассматриваться в гл. 6, 11 и 12. Функция ndim с
синтаксисом
d = ndims(A)
возвращает число размерностей массива А. Эта функция всегда имеет значения
не меньше, чем 2, так как считается, что даже скаляры имеют размерность 2,
в том смысле, что их размер — это 1x1.
2.9. Некоторые важные стандартные массивы
Часто при исследовании конкретных алгоритмов полезно уметь строить про-
простые массивы для проверки идей и для тестирования разрабатываемых функций.
В этом параграфе рассматриваются семь стандартных функций, генерирующих
некоторые специальные массивы, которые будут использоваться в следующих
главах. Если аргументом рассматриваемых далее функций является одно число,
то результатом является квадратный массив.
2.10. Введение в программирование М-функций
- Функция zeros(M,N) генерирует матрицу MxN из одних нулей класса
double.
- Функция ones(M,N) генерирует матрицу MxN из одних единиц класса
double.
- Функция true(M,N) строит логическую матрицу MxN из единиц (истина).
- Функция false(M,N) строит логическую матрицу MxN из нулей (ложь).
- Функция magic(M) порождает «магический квадрат» МхМ. В этой квад-
квадратной матрице суммы чисел по любой строке, по любому столбцу и по
главным диагоналям равны между собой. Магические квадраты бывают
полезными при тестировании, т.к. их легко строить и их элементами слу-
служат целые числа.
- Функция rand(M,N) генерирует матрицу MxN, элементами которой явля-
являются нормально распределенные (гауссовы) случайные величины со сред-
средним 0 и с дисперсией 1.
Например,
>> А = 5*onesC,3)
А =
5 5 5
5 5 5
5 5 5
>> magic C)
ans =
8 16
3 5 7
4 9 2
>> В = randB, 4)
В =
0.2311 0.4860 0.7621 0.0185
0.6068 0.8913 0.4565 0.8214
2.10. Введение в программирование М-функций
Важнейшая отличительная черта пакета обработки изображений IPT состоит в том,
что в нем реализован прозрачный доступ к среде программирования MATLAB.
Как скоро будет видно, программирование функций MATLAB является доста-
достаточно гибким и его легко освоить для практических применений.
Глава 2. Цифровые изображения в MATLAB
2.10.1. М-файлы
Так называемые М-файлы являются или просто скриптами, т. е. состоят из после-
последовательностей исполняемых команд MATLAB, или они являются функциями,
которые допускают использование аргументов и могут иметь выходные данные.
В этом параграфе мы займемся именно функциями. Эти функции расширяют
возможности MATLAB и IPT для выполнения специфических приложений, нуж-
нужных конкретным пользователям.
М-файлы создаются в текстовом редакторе и сохраняются под именем f ilename. m,
например, average.m или filter.m. Функции, задаваемые в М-файлах, состоят
из следующих компонент:
- заголовок функции;
- hl-строка;
- текст справки;
- тело функции;
- комментарии.
Заголовок функции имеет вид
function [outputs] = name(inputs).
Например, функция, которая вычисляет сумму и произведение (т. е. она имеет
два разных выходных параметра) двух изображений, может иметь следующий вид:
function [s, p] = sumprod(f, g),
где f и g — это два входных изображения, s — это их сумма, ар — произведе-
произведение. Имя функции sumprod может быть произвольным, но слева от него обяза-
обязательно должно стоять слово function. Обратите внимание на то, что выходные
аргументы заключены в квадратные скобки. Если функция имеет единствен-
единственный выходной параметр, то его можно не заключать в квадратные скобки. Если
определяемая функция не имеет выходных аргументов, то ставится одно слово
function без квадратных скобок и знака равенства. Имя функции должно начи-
начинаться с буквы, а остальные символы могут быть буквами, цифрами или знаками
подчеркивания. Пробелы в имени функции не допускаются. MATLAB различает
в начале имени функции 63 символа. Остальные символы игнорируются.
Функцию можно вызвать в командной строке после системного приглашения,
например,
>> [s,p] = sumprod(f, g);
а кроме того, функции могут являться элементами других функций, в этом слу-
случае они становятся подфункциями. Как уже отмечалось, если функция возвра-
возвращает только один аргумент, то квадратные скобки можно опускать, например,
>> у = sum(x);
HI-строка — это первая текстовая строка функции. Она является первой
строкой комментария, который следует за заголовком функции. Между этой
2.10. Введение в программирование М-функций
строкой и заголовком не должно быть пустых строк. Примером Н1-строки может
служить следующая строка:
°/о SUMPROD вычисляет сумму и произведение двух изображений.
В § 1.7.3 указывалось, что Н1-строка отображается первой на экране, если поль-
пользователь дает команду
>> help function.name
В том же параграфе говорилось, что команда lookf or keyword выводит на экран
все Н1-строки, в которых содержится последовательность символов keyword. Та-
Таким образом, Н1-строка несет важные сведения о данном М-файле, поэтому она
должна быть максимально информативной.
Текст справки является текстовым блоком, который размещается сразу после
HI-строки без разделения пустой строкой. Текст справки используется для отоб-
отображения комментариев и онлайновой справки по данной функции. Если пользо-
пользователь набирает в командной строке после приглашения help f unction_name, то
MATLAB выдает на экран все комментарии, расположенные между заголовком
функции и первой строкой, не являющейся комментарием (это или пустая строка,
или первая исполняемая строка данной функции). Справочная система игнори-
игнорирует любые комментарии, которые могут стоять после блока справки функции.
Тело функции состоит из выполняемого кода MATLAB, который соверша-
совершает некоторые действия или вычисления и присваивает определенные результаты
выходным аргументам. Далее в этой главе приводятся некоторые примеры ис-
исполняемого кода MATLAB.
Все строки, перед которыми стоит символ «р/0» и которые не являются Н1-
строками или не входят в блок справки, рассматриваются в качестве строк ком-
комментария функции. Они не считаются частью справочной системы. Разрешается
также ставить комментарии в конце исполняемых команд.
М-файлы можно создавать и править в любом текстовом редакторе, сохранив
их с расширением .т в соответствующей папке, для которой обычно указывают
путь поиска. Удобно также работать с М-файлами с помощью команды edit,
которая позволяет их создавать и редактировать. Например,
>> edit sumprod
открывает для редактирования файл sunprod, если он существует в рабочей пап-
папке или в папке, описанной в пути поиска MATLAB. Если файл с таким именем там
не обнаруживается, то MATLAB дает возможность пользователю создать новый
файл. Как подчеркивалось в § 1.7.2, окно редактора MATLAB имеет несколь-
несколько ниспадающих меню для выполнения действий типа: сохранить, посмотреть и
отладить файлы. Этот редактор делает некоторые простейшие синтаксические
проверки и выделяет разными цветами различные элементы программного кода,
поэтому он весьма удобен для работы с М-файлами и его всегда рекомендуют в
качестве полезного системного инструмента.
Глава 2. Цифровые изображения в МАТЬ А В
2.10.2. Операторы
Операторы MATLAB разделены на три основные категории:
- арифметические операторы, совершающие стандартные арифметические дей-
действия;
- операторы сравнения, которые сравнивают операнды количественно;
- логические операторы, которые выполняют действия И, ИЛИ и НЕ.
Рассмотрим каждую из этих категорий отдельно.
Арифметические операторы
В MATLAB имеется два различных типа арифметических операторов. Матрич-
Матричные арифметические операторы определяются по правилам линейной алгебры.
Арифметические операторы с массивами выполняются поэлементно, и их можно
применять к многомерным числовым массивам. Для различения этих двух типов
операторов используется символ точка (.). Например, А * В обозначает обычное
произведение матриц, а действие А. * В обозначает операцию над массивами в том
смысле, что его результатом служит массив того же размера, что и у массивов А
и В, причем его элементами являются поэлементные произведения соответствую-
соответствующих элементов А и В. Другими словами, если С = А. * В, то C(l, J) = A(l, J) * B(I, J).
Отметим, что операции сложения и вычитания выполняются по одним и тем же
правилам для обоих типов арифметических операторов, поэтому команды (.+) и
(.—) не употребляются.
При выполнении действия вида В = А система MATLAB делает «заметку»,
что с этого момента массив В совпадает с А, однако при этом не происходит
немедленное «физическое» копирование всех элементов А в В. Это будет сделано
только при дальнейшем изменении содержимого массива А. Это обстоятельство
следует учитывать, поскольку «хранение» одной и той же информации в разных
переменных может иногда повысить доходчивость и читаемость программного
кода. Таким образом, MATLAB не дублирует информацию, пока в этом нет аб-
абсолютной необходимости. Это стоит помнить при написании программ на языке
MATLAB. В табл. 2.4 перечислены все арифметические операторы MATLAB.
В этой таблице заглавные А и В обозначают матрицы или массивы, а строчные
а и b — скалярные величины. Все операнды могут быть вещественными или
комплексными. Если операнды являются скалярными переменными, то знак (.)
можно не ставить. Следует помнить, что изображения являются двумерными
массивами, т. е. матрицами, поэтому все перечисленные операторы применимы к
изображениям.
В пакете IPT имеется несколько арифметических функций для работы с изоб-
изображениями (см. табл. 2.5). Разумеется, все эти действия можно выполнить, при-
применяя базовые арифметические операторы MATLAB напрямую. Однако преиму-
преимущество использования функций IPT заключается в том, что они учитывают класс
входного изображения, например, int8, а соответствующие математические опе-
операторы MATLAB требуют использование класса double.
2.10. Введение в программирование М-функций
Таблица 2.4. Операции с матрицами и массивами. Все действия можно выполнять или
непосредственно с помощью этих операторов, например, А + В, или с по-
помощью соответствующих функций, т.е. plus (А, В). Для простоты все дей-
действия проиллюстрированы с использованием матриц, но все они очевидным
образом распространяются на массивы произвольных размерностей
Оператор Название
+ Сложение матриц
и массивов
Вычитание матриц
и массивов
.* Умножение массивов
* Умножение матриц
. / Деление на массив
справа
.\ Деление на массив
слева
/ Матричное деление
справа
\ Матричное деление
слева
Возведение в степень
массивов
Матричное возведение
в степень
. ' Векторное или матрич-
матричное транспонирование
' Векторное или матрич-
матричное комплексное сопря-
сопряжение и транспониро-
транспонирование
+ Унарный плюс
Унарный минус
Двоеточие
Функция
MATLAB
plus(А,В)
minus(А,В)
times(A,B)
mtimes(A,B)
rdivide(A,B)
ldivide(A,B)
mrdivide(A,B)
lrdivide(A,B)
power(A,B)
mpower(A,B)
transpose(A)
ctranspose(A)
uplus(A)
uminus(A)
Комментарии и примеры
a+b,A+B, или а+А.
a-b,A-B, a-A или A-a.
C=A.*B, C(I,J)=A(I,J)*B(I,J).
A*B, стандартное произведение мат-
матриц, или а*А, умножение элемен-
элементов матрицы А на скаляр.
C=A./B,C(I,J)=A(I,J)/B(I,J).
C=A.\B,C(I,J)=B(I,J)/A(I,J).
А/В, почти то же действие, что
A*inv(B) в зависимости от точно-
точности вычислений.
А\В, почти то же действие, что
inv(A)*B в зависимости от точ-
точности вычислений.
Если С=А.~В, то
C(I,J)=A(I,J)~B(I,J).
См. онлайновую справку по это-
этому оператору.
А.'. Стандартное транспониро-
транспонирование векторов или матриц
А'. Стандартное комплексное со-
сопряжение векторов или матриц.
+А. Эквивалентно 0+А.
-А. Эквивалентно 0-А. или -1*А.
Обсуждалось в § 2.8.
В примере 2.6 используются функции max и min. Эти функции имеют следу-
следующие синтаксические формы:
С = max(А)
С = max(А, В)
С = max(А, [ ], dim)
[С, I] = max(...) .
В первом случае, если А — вектор, то max (А) возвращает его наибольший элемент;
если А — матрица, то max (А) рассматривает А как строку векторов-столбцов и воз-
возвращает вектор-строку из максимальных элементов по всем столбцам. Во втором
случае функция max (А, В) возвращает массив размера, как было у А и В, элемен-
элементами которого являются максимумы из пар соответствующих элементов из А и В.
Глава 2. Цифровые изображения в MATLAB
В третьем случае max(A, [],dim) возвращает максимальные элементы вдоль из-
измерения dim массива А. Например, тах(А, [ ], 1) находит максимальные элементы
по первому измерению (т.е. по строкам) массива А. Наконец, команда [С, I] =
= max (...) находит индексы (координаты) максимальных элементов А и поме-
помещает их в выходной вектор I. Если имеется несколько одинаковых максимальных
элементов, то выбирается индекс первого из них. Многоточие в круглых скобках
обозначает использование любого из предыдущих аргументов. В этом контексте
также может использоваться функция min с очевидными изменениями смысла.
Таблица 2.5. Арифметические функции для обработки изображений из пакета IPT
Функция Описание
imadd Сложение двух изображений или прибавление константы.
imsubtract Вычитание двух изображений или вычитание константы.
immultiply Умножение двух изображений, которое выполняется поэлементно между со-
соответствующими парами элементов изображений, или умножение всего изоб-
изображения на константу.
imdivide Деление двух изображений, которое выполняется поэлементно между соот-
соответствующими парами элементов изображений, или деление всего изображе-
изображения на константу.
imabsdif f Вычисление модуля разности двух изображений.
imcomplement Дополнительное изображение (см. § 3.2.1).
imlincomb Нахождение линейной комбинации двух или более изображений. (См. по-
подробнее в § 5.3.1.)
Пример 2.6. Иллюстрации для арифметических операторов и функций min и max.
Пусть требуется написать М-функцию, скажем, improd, которая перемножает два
входных изображения и возвращает изображение-произведение, максимальный
и минимальный элементы этого произведения, а также соответствующее норми-
нормированное изображение со значениями в интервале [0,1]. С помощью текстового
редактора напишем следующую интересующую нас функцию.
function [p, pmax, pmin, pn] = improd(f, g)
°/eIMPR0D Computes the product of two images1.
У. [P, PMAX, PMIN, PN] = IMPROD(F, GJ outputs the element-by-
% element product of two input images, F and G, the product
°/0 maximum and minimum values, and a normalized product array with
°/o values in the range [0, 1] . The input images must be of the same
°/o size. They can be of classes uint8, uintl6, or double. The outputs
°/o are of class double.
fd = double(f);
gd = double(g);
1При переводе данной книги Н1-строки и тексты справок всех функций приводятся как в ори-
оригинале на английском языке. Это сделано для соблюдения авторских прав на функции и про-
программы. Многие из этих функций можно найти на сайте авторов этой книги. (См. § 1.5.)
2 В документации по MATLAB принято использовать заглавные буквы в именах функциях и
аргументах, которые отображаются в Н1-строках и в текстах справок. Это позволяет отличать
настоящие имена функций и аргументов от их смысловых разъяснений.
2.10. Введение в программирование М-функций
р = fd.*gd;
ртах = тах(р( : ) ) ;
pmin = min(p(:));
pn = mat2gray(p);
Заметим, что конвертирование входных изображений в класс double сделано
с помощью функции double, а не im2double, так как в том случае, когда входное
изображение принадлежит классу uint8, функция im2double конвертирует его
значения в интервал [0,1]. Предположительно требовалось, чтобы изображение р
содержало произведение исходных изображений. Для нахождения нормирован-
нормированного массива рп с областью значений [0,1] была использована функция mat2gray.
Напомним, что особенности применения оператора (:) в индексах массивов объ-
объяснялись в § 2.8.
Пусть теперь f = [12; 3 4] ng = [12; 2 1]. Наберем следующую коман-
команду с использованием введенной выше функции:
>> [р, ртах, pmin, pn] = improd(f, g)
P =
1 4
6 4
ртах
6
pmin
1
pn =
1
—
0
.0000
0
0
.6000
.6000
Если набрать после приглашения MATLAB команду help improd, то получим
следующий справочный текст:
>> help improd
IMPROD Computes the product of two images.
[P, PMAX, PMIN, PN] = IMPROD(F, G) outputs the element-by-element
product of two input images, F and G, the product maximum and
minimum values, and a normalized product array with values in the
range [0, 1]. The input images must be of the same size. They can
be of classes uint8, uintl6, or double. The outputs are of class
double. ?
Операторы сравнения
Операторы сравнения MATLAB перечислены в табл. 2.6. Эти операторы срав-
сравнивают величины соответствующих элементов массивов, которые должны иметь
одинаковые размерности. Все операции делаются на поэлементной основе.
Глава 2. Цифровые изображения в МАТЬ А В
Пример 2.7. Операторы сравнения.
Несмотря на то, что операторы сравнения в основном используются в программах
при управлении вычислительными потоками (например, в условных операторах
типа if), что будет обсуждаться в § 2.10.3, здесь мы кратко проиллюстриру-
проиллюстрируем прямое использование этих операторах при работе с массивами. Рассмотрим
следующие команды ввода-вывода:
>> А = [1 2 3; 4 5 6; 7 8 9]
А =
12 3
4 5 6
7 8 9
>> В = [0 2 4; 3 5 6; 3 4 9]
В =
0 2 4
3 5 6
3 4 9
>> А == В
ans =
0 10
0 11
0 0 1
Таблица 2.6. Операторы сравнения
Оператор
<
<=
>
>=
==
~=
Название
Меньше
Меньше или равно
Больше
Больше или равно
Равно
Не равно
Значит, оператор == порождает логический массив с теми же размерами, что А
и В, причем единицы стоят там, где элементы А и В совпадают, и нули — там, где
они не совпадают. Вот еще одна иллюстрация. Команда
>> А >= В
ans =
110
111
111
задает логический массив с единицами там, где элементы массива А больше или
равны соответствующих элементов массива В, и с нулями во всех остальных ячей-
ячейках массива. ?
Для векторов и квадратных массивов оба операнда в логическом операто-
операторе должны иметь одинаковые размеры, за одним исключением, когда один из
2.10. Введение в программирование М-функций
операндов — скаляр. В этом случае MATLAB сравнивает этот скаляр со всеми
элементами другого операнда и строит логический массив того же размера, в
котором единицы стоят там, где условие оператора выполнено, и нули — там,
где это условие нарушено. Если оба операнда являются скалярами, то резуль-
результат этого логического оператора равен 1, если сравнение истинно, и нуль — если
ложно.
Логические операторы и логические функции
В табл. 2.7 приведены логические операторы MATLAB, а в следующем приме-
примере проиллюстрированы некоторые свойства этих операторов. В отличие от об-
общепринятой интерпретации логических операций, операторы из табл. 2.7 могут
обрабатывать как логические, так и числовые данные. MATLAB трактует логи-
логическую 1 и любое ненулевое число как истина, а логический или числовой 0 —
как ложь. Например, логический оператор И, примененный к двум операндам, да-
дает 1, если оба операнда являются или логическими единицами, или ненулевыми
числами. Оператор И дает нуль, если один из операндов является или логическим
или числовым 0, а также когда оба операнда — нули.
Таблица 2.7. Логические операторы
Пример 2.8. Логические операторы.
Рассмотрим действие оператора И на следующем числовом массиве:
>> А = [1 2 0; 0 5 6] ;
>> В = [1 -2 3; 0 1 1] ;
>> А & В
ans =
110
0 11
Видно, что оператор И порождает логический массив, имеющий размеры вход-
входных массивов, в котором единицы стоят на тех местах, где оба элемента массивов
А и В являются ненулевыми, и нули — там, где имеется хоть один нулевой эле-
элемент в массивах А и В. Напомним, что все операции совершаются поэлементно.
Оператор ИЛИ действует аналогичным образом. Выражение с ИЛИ есть истина,
если один из операндов является логической единицей или ненулевым числом, в
противном случае выражение есть ложь. Логический оператор НЕ имеет один опе-
операнд. Если этот операнд — логическая величина, то она обращается, т. е. истина
переходит в ложь, и наоборот. Результат этого оператора, примененного к число-
числовой ненулевой величине, есть 0, а к числовому нулю — 1. ?
MATLAB также поддерживает некоторые логические функции, приведенные
в табл. 2.8. Функции all и any бывают особенно полезными при написании про-
программ.
Глава 2. Цифровые изображения в MATLAB
Таблица 2.8. Логические функции
Функция Комментарий
хог Возвращает логическую 1, только если оба операнда являются логически
различными, иначе хог возвращает 0.
all Возвращает 1, если все элементы вектора являются ненулевыми, иначе
возвращает 0. На матрицах действует по столбцам,
any Возвращает 1, если какой-то элемент вектора является ненулевым, иначе
возвращает 0. На матрицах действует по столбцам.
Пример 2.9. Логические функции.
Рассмотрим простые массивы А = [1 23; 4 5 6] и В = [1 -1 1; 00 2]. Под-
Подстановка этих массивов в функции из табл. 2.8 приводит к следующим результатам:
>> хог(А, В)
ans =
10 0
110
>> all (A)
ans =
111
>> any(A)
ans =
111
>> all(B)
ans =
0 0 1
>> any(B)
ans =
0 11
Обратите внимание на то, что функции all и any действуют по столбцам
матриц А и В. Например, первые два элемента вектора, произведенного командой
all (В), равны 0, так как каждый из первых двух столбцов В имеет хоть один 0;
последний элемент равен 1, поскольку все элементы последнего столбца матрицы
В являются ненулевыми числами. ?
В дополнение к перечисленным в табл. 2.8 функциям MATLAB имеет несколь-
несколько других функций, которые проверяют некоторые специфические условия и
свойства, а также возвращают логические значения. Такие функции приведе-
приведены в табл. 2.9. Некоторые из них связаны с понятиями и свойствами, которые
обсуждались ранее в этой главе (например, функция islogical рассматривалась
в § 2.6.2), другие функции встретятся в следующих главах. Обратите внимание на
то, что все эти функции возвращают логическую 1, когда проверяемое свойство
выполнено, в противном случае на выход поступает логический 0. Если аргумен-
аргументом этих функций служит массив, то некоторые из них возвращают логический
массив тех же размеров, в котором единицы стоят на тех местах, где выполне-
выполнено соответствующие условие у входного массива, в противном случае там стоят
нули. Например, если А = [12; 3 1/0], то функция isfinite(A) возвращает
2.10. Введение в программирование М-функций
матрицу [1 1; 1 0], где элемент 0 (ложь) указывает на то, что соответствующий
элемент А равен бесконечности (т.е. не является конечным).
Таблица 2.9. Некоторые функции, которые возвращают логические 1 или 0 в зависимости
от истинности или ложности аргументов. См. полный список функций в
онлайновой справке
Функция
iscell(C)
iscellstr(s)
ischar(s)
isempty(A)
isequaKA, В)
isfield(S, 'name')
isfinite(A)
isinf(A)
isletter(A)
islogical(A)
ismember(A, B)
isnan(A)
isnumeric(A)
isprime(A)
isreal(A)
isspace(A)
issparse(A)
isstruct(S)
Истина,
Истина,
Истина,
Истина,
Истина,
Истина,
Истина
Истина
Истина
Истина,
Истина
Истина
Истина
Истина
Истина
Истина
Истина
Истина
Описание
если С — матричный массив.
если С — матричный массив из строк.
если s — символьная строка.
если А — пустой массив, [ ] .
если А и В — тождественные массивы.
если 'name' является полем структуры S.
там, где элементы массива А конечны.
там, где элементы массива А бесконечны.
там, где элементы массива А являются буквами.
если А — логический массив.
там, где элементы А есть также в В.
там, где элементы А есть NaN (см. табл. 2.10).
если А — числовой массив.
там, где элементы А — простые числа.
если все элементы А не имеют мнимой части.
там, где элементы А являются пробелами.
если А — разреженная матрица.
если S — структура.
Некоторые васнсные переменные и константы
Элементы из табл. 2.10 весьма часто используются при программировании на
MATLAB. Например, число eps добавляется к числителям дробей, чтобы избе-
избежать переполнения при вычислениях, даже если числитель равен нулю.
Таблица 2.10. Некоторые важные переменные и константы
Функция
Возвращаемая величина
ans Самый последний ответ (переменная). Если выход команды не присвоен
некоторой переменной, то MATLAB автоматически сохраняет результат
в переменной ans.
eps Относительная точность вычислений с плавающей запятой. Равна рас-
расстоянию от числа 1.0 до следующего ближайшего числа, которое молено
представить с плавающей запятой с двойной точностью.
i или j Мнимая единица, например, в выражении l+2i.
Nan или nan Сокращение от Not-a-number (не число) (например, 0/0).
pi 3.14159265358979
realmax Наибольшее вещественное число, которое компьютер может предста-
представить с плавающей запятой.
realmin Наименьшее вещественное число, которое компьютер может предста-
представить с плавающей запятой.
computer Тип вашего компьютера.
version Версия MATLAB (строка).
Глава 2. Цифровые изображения в MATLAB
Представление чисел
MATLAB использует стандартное десятичное представление чисел с обычной де-
десятичной точкой. Перед числом ставится его знак, плюс или минус. Используется
также символ е для обозначения десятичного основания степени. В комплексных
числах используется суффикс i или j для обозначения мнимой единицы. Вот
некоторые примеры записи чисел
3
9.6397238
li
-99
1.60210е-
-3.14159J
20
0.0001
6.02252е23
3e5i
Любые числа представляются в памяти компьютера в стандартном длинном фор-
формате IEEE (Institute of Electrical and Electronics Engeneers), предусмотренном для
хранения чисел с плавающей точкой. Числа с плавающей точкой имеют точность око-
около 16 значащих десятичных цифр и область значений, примерно от 10~308 до 10308.
2.10.3. Управление вычислительными потоками
Возможность управления последовательностью операций с помощью предопре-
предопределенных условий лежит в основе любых языков компьютерного программиро-
программирования. На самом деле, условное ветвление является одним из двух фундамен-
фундаментальных принципов, которые были заложены в основание схемы универсальных
вычислительных машин в сороковых годах прошлого века (другой принцип за-
заключался в использовании памяти компьютера для одновременного хранения
выполняемых программ и используемых данных). В MATLAB предусмотрено
восемь операторов условных переходов, которые приведены в табл. 2.11. Следует
помнить, что MATLAB трактует логическую единицу и любое ненулевое число
как истина, а логический или числовой нуль — как ложь.
Таблица 2.11. Операторы условных переходов
Оператор Описание
if if вместе с else и else if совершает группу операций при выполнении
предопределенных логических условий.
for Выполняет группу операций заданное число раз.
while Выполняет группу операций, число которых устанавливается на ос-
основе предопределенных логических условий.
break Прерывает выполнение циклов операторов for или while.
continue Передает управление следующей итерации цикла for или while, про-
пропустив все оставшиеся операции в теле цикла.
switch switch вместе с case и otherwise выполняет разные группы операций
в зависимости от предписанных значений или строк.
return Передает управление в вызвавшую функцию.
try...catch Изменяет управление вычислениями при обнаружении ошибок вы-
вычислений.
Операторы If, else и elseif
Условный оператор if имеет следующий синтаксис:
if expression
statements
end .
2.10. Введение в программирование М-функций
Выражение expression вычисляется, и если оно истинно, то выполняются опера-
операции, перечисленные в statements, расположенные между строками if и end. Если
выражение expression ложно, то MATLAB пропускает все операции между стро-
строками if и end. Если имеются вложенные операторы if, то каждый из них обязан
иметь парное слово end.
Условные операторы else и elseif служат для дальнейшего условного раз-
разветвления оператора if. Общая форма этих операторов имеет следующий вид:
if expression 1
statementsl
elseif expression2
statements2
else
statements3 end .
Если expressionl есть истина, то выполняется statementsi, после чего контроль
передается на конец условного оператора (end). Если expressionl есть ложь, то
выполняется expression3. Если оно есть истина, то выполняется statements2, и
контроль передается на end. В противном случае (else) выполняется команда
(или группа команд) statements3. Обратите внимание на то, что оператор else
не имеет условия. Операторы elseif и else могут появляться независимо друг от
друга после if. Они не обязаны быть в паре, как показано в общем виде условного
оператора if. Также допускается многократное присутствие операторов elseif.
Пример 2.10. Условные разветвления и появление функций error, length и
numel.
Пусть требуется написать функцию, которая вычисляет среднюю яркость изоб-
изображения. Как уже обсуждалось, двумерный массив f можно преобразовать в
вектор-столбец v, написав оператор v =f (:). Поэтому желательно, чтобы функ-
функция могла работать и с векторами, и с матрицами-изображениями. Программа
должна выдавать сообщение об ошибке, если входной массив не является одно-
одномерным или двумерным.
function av = average(A)
"/AVERAGE Computes the average value of an array.
°/o AV = AVERAGE (A) computes the average value of input
7o array, A, which must be a 1-D or 2-D array.
°/0 Check the validity of the input. (Keep in mind that
°/o a 1-D array is a special case of a 2-D array.)
if ndim(A) > 2
error(cThe dimension of the input cannot exceed 2/')
end
°/o Compute the average
av = sum(A(:))/length(A(:));
Заметим, что входной массив преобразуется в одномерный с помощью опера-
оператора А(:). В общем случае функция length (А) возвращает длину самого боль-
большого измерения массива А. В рассмотренном примере массив А(:) является век-
вектором, поэтому length (А (:)) дает число элементов А. Это позволяет исключить
Глава 2. Цифровые изображения в МАТЬ А В
проверку того, является ли входной массив вектором или матрицей. Другой спо-
способ прямого определения числа элементов массива заключается в использовании
функции numel, которая имеет следующий синтаксис:
n = numel(А) .
Если А является изображением, то numel (А) дает число пикселов. Применяя эту
функцию, последнюю строку программы молено переписать в виде
av = sum(A(:))/numel(A(:));
Наконец, отметим, что функция error прерывает выполнение программы и
выдает на консоль сообщение, помещенное в круглые скобки (сообщение следует
помещать в апострофы, как это сделано в нашем примере). ?
Оператор for
Как указано в табл. 2.11, цикл for выполняет группу операторов предписанное
число раз. Его синтаксис имеет вид
for index = start:increment:end
statements
end .
Циклы можно вкладывать один в другой следующим образом:
for indexl = start 1:incrementl:endl
statements 1
for index2 = start2:increment2:end2
statements2
end
statements3
end .
Например, следующий цикл исполняется 11 раз:
count = 1;
for k = 0:0.1:1
count = count + 1;
end .
Если шаг цикла опущен, то он принимается за 1. Шаг цикла может быть отри-
отрицательным, например, for k = 0:-1:-10. Заметим, что в конце строки for не
нужно ставить точку с запятой. MATLAB автоматически подавляет выдачу на
печать значений индекса цикла. Как уже отмечалось в § 2.10.4, можно достиг-
достигнуть существенного повышения скорости выполнения программы, если заменить
цикл for везде, где это возможно, на так называемый векторизованный код.
2.10. Введение в программирование М-функций
Пример 2.11. Использование цикла for для записи нескольких изображений в
файлы.
В примере 2.2 сравнивалось несколько изображений с разными значениями каче-
качества сжатия JPEG. Покажем, как можно записать все эти изображения на диск
с помощью цикла for. Пусть имеется изображение f и требуется записать его в
ряд файлов формата JPEG со значениями коэффициента качества от 0 до 100 и с
шагом 5. Желательно также дать этим файлам имена вида series_xxx.jpg, где
ххх — это коэффициент качества изображения. Это можно сделать в следующем
цикле for:
for q = 0:5:100
filename = sprintf ('series_°/03d. jpg', q);
imwrite(f, filename, cquality', q);
end .
В данном случае функция sprintf3, имеющая синтаксис
s = sprintf (c charactersl°/ondcharacters2', q) ,
записывает отформатированные данные в строку s. В этой синтаксической фор-
форме characters 1 и characters2 — это строки символов, a °/ond — обозначает деся-
десятичное число (для переменной q) с п цифрами. В нашем примере characters 1 —
это series. , величина п равна 3, строка characters2 — это . jpg, a q — это число,
определяемое в цикле. ?
Оператор while
Цикл while выполняет группу операторов до тех пор, пока контролирующее цикл
условное выражение есть истина. Синтаксис имеет вид
while expression
statements
end .
Как и в случае с циклом for, циклы while можно вкладывать друг в друга:
while expressionl
statementsl
while expression2
statements2
end
statements3
end .
Например, следующие вложенные циклы while прерываются, когда обе вели-
величины а и b становятся равными нулю:
а = 10;
Ъ = 5;
3См. другие синтаксические формы sprintf на справочной странице этой функции.
Глава 2. Цифровые изображения в MAT LAB
while a
а = а - 1;
while b
b = b - 1;
end
end .
Здесь мы использовали соглашение MATLAB трактовать числовые величины в
логическом контексте как истина, когда они не равны нулю, и как ложь, когда
они равны нулю. Иными словами, while а и while b истинны, пока а и b оба не
равны нулю.
Как и в случае цикла for, существенного выигрыша производительности про-
программ можно достигнуть, если заменить циклы while на векторизованный код
(см. § 2.10.4) везде, где это возможно.
Оператор break
Из названия этого оператора следует, что он осуществляет прерывание циклов
for и while. При обнаружении команды break выполнение программы продол-
продолжается со следующего оператора, находящегося вне цикла. Во вложенных циклах
оператор break вызывает прерывание лишь внутреннего цикла, в котором он на-
находится.
Оператор continue
Оператор continue передает управление следующей итерации в циклах for или
while, в которых он обнаруживается, пропуская стоящие после него операции в
теле цикла и относящиеся к текущей итерации. Во вложенных циклах оператор
continue передает управление следующей итерации только внутреннего цикла,
в котором он стоит.
Оператор switch
С помощью этого оператора можно сделать выбор среди нескольких возможных
продолжений вычислительного процесса в М-функциях на основе различных ти-
типов входных данных. Синтаксис имеет вид
switch switch_expression
case case_ expression
statementsl
case {case_expressionl, case_expression2, ...}
statements2
otherwise
statements3
end .
Оператор switch строит группу выполняемых операторов, основываясь на вели-
величинах переменных и выражений. Ключевые слова case и otherwise очерчивают
эти группы. Выполняется лишь первый подходящий оператор case4. В конце
4В отличие от конструкции switsh языка С, в языке MATLAB этот оператор не «совершается
до конца». Т. е. switch выполняет только первое подходящее действие case. Все последующие
case игнорируются, так что не нужно прибегать к оператору break.
2.10. Введение в программирование М-функций
оператора switch должен обязательно находиться оператор end. Фигурные скоб-
скобки используются, если несколько выражений включены в одну группу операций
case. В качестве простого примера предположим, что имеется М-функция, ко-
которая принимает изображение f и конвертирует его в некоторый класс, назовем
его newclass. Допускаются только три класса для конвертации: uint8, uintl6 и
double. Следующий программный фрагмент осуществляет такую конвертацию
и выдает сообщение об ошибке, если класс входного изображения не является
допустимым:
switch newclass
case cuint8c
g = im2uint8(f);
case cuintl6'
g = im2uintl6(f);
case 'double'
g = im2double(f);
otherwise
error(cUnknown or improper image class.c)
end .
Конструкция switch будет интенсивно использоваться на протяжение всей
книги.
Пример 2.12. Извлечение подизображения из заданного изображения.
В этом примере мы напишем М-функцию (на основе цикла for) для извлече-
извлечения прямоугольного подизображения из исходного изображения. Несмотря на
то, что это действие можно осуществить с помощью одного оператора, который
будет рассмотрен в следующем параграфе, мы используем этот пример для срав-
сравнения скорости выполнения цикла и векторизованного кода. На вход этой функ-
функции подается изображение, размер (число строк и столбцов) извлекаемого поди-
подизображения и координаты верхнего левого конца подизображения. Следует на-
напомнить, что начало изображения в MATLAB имеет координаты A,1) (см. § 2.1.1).
function s = subim(f, m, n, rx, су)
°/oSUBIM Extracts a subimage, s, fron a given image, f.
°/o The subimage is of size m-by-n, and the coordinates
°/o of its top, left corner are (rx, cy) .
s = zeros(m, n);
rowhigh = rx + m - 1;
colhigh = cy + n - 1;
xcount = 0;
for r = rx:rowhigh
xcount = xcount + 1;
ycount = 0;
for с = су:colhigh
ycount = ycount +1;
s(xcount, ycount) = f(r,c);
end
end .
Глава 2. Цифровые изображения в МАТЬ А В
В следующем параграфе будет приведена более эффективная реализация этой
программы. В качестве упражнения предлагаем читателю самостоятельно напи-
написать программу, которая использует цикл while вместо цикла for. ?
2.10.4. Кодовая оптимизация программ
Как уже говорилось в § 1.3, MATLAB представляет собой язык программирова-
программирования, специально разработанный для выполнения операций над массивами. При-
Принимая во внимание этот факт, молено существенно повысить скорость вычисле-
вычислений. В этом параграфе будут обсуждаться два важных подхода к оптимизации
кодов программ MATLAB: векторизация циклов и предварительное заполнение
массивов.
Векторизация циклов
Под векторизацией программ подразумевается преобразование циклов for и
while в эквивалентные векторные и матричные операции. Как скоро станет ясно,
векторизация может привести не только к существенному выигрышу по скорости
вычислений, но и повысить «читаемость» программного кода. Надо потратить
много времени, чтобы дать полное определение многомерной векторизации. Од-
Однако молено достаточно легко описать векторизацию, которая используется при
обработке изображений.
Начнем с простого примера. Предположим, что нам требуется вычислить од-
одномерную функцию вида
f(x) =
при х = 0,1, 2,..., М — 1. С помощью цикла for это можно сделать следующим
образом:
for х = 1:М УоАггау indices in MATLAB cannot be 0.
f(x) = A*sin((x-l)/B*pi));
end .
Однако эти действия можно выполнить значительно быстрее с помощью векто-
векторизации цикла, используя метод индексации в MATLAB:
х = 0:М-1;
f = A*sin(x/B*pi));
В этом простейшем примере проиллюстрирован процесс общего одномерно-
одномерного индексирования. Если функция, которую необходимо вычислить, имеет две
переменные, то оптимизация индексирования делается немного более хитроум-
хитроумно. В MATLAB имеется прямой путь для реализации двумерных вычислений с
помощью функции meshgrid, которая имеет синтаксис
[С, R] = meshgrid(с, г) .
Эта функция преобразовывает область, обозначенную вектор-строками с и г, в
массивы С и R, которые молено затем использовать при вычислении функций двух
переменных и при построении трехмерных графиков поверхностей (заметим, что
2.10. Введение в программирование М-функций
в функции meshgrid столбцы перечисляются, в первую очередь, как на входе, так
и на выходе функции).
Строки выходного массива С являются копиями вектора с, а столбцы выход-
выходного массива R являются копиями вектора г. Пусть, к примеру, требуется сфор-
сформировать двумерную функцию, элементами которой служат суммы квадратов
значений координат х и у при х = 0, 1, 2иу = 0, 1. Вектор г формируется
из компонент координат по строке: г = [0 12]. Аналогично, вектор с форми-
формируется из компонент координат по столбцу: с = [0 1] (обратите внимание на то,
что здесь г и с оба являются векторами-строками). Подставляя эти два вектора
в meshgrid, получаем следующий результат:
>> [С, R] = meshgrid(c, r)
С =
0 1
0 1
0 1
R =
0 0
1 1
0 1
Нужная нам функции получается командой
>> h = R.~2 + С.~2
которая приводит к результату
h =
0 0
1 2
4 5 .
Размер матрицы h равен length (r) x length (с). Кроме того, заметим, напри-
например, что h(l, 1) = R(l,l)~2 + СA,1)~2. Итак, MATLAB автоматически индек-
индексирует h. В этом кроется потенциальный источник ошибок, когда 0 является
координатой, поскольку, как многократно отмечалось, в MATLAB индексы не
могут равняться нулю. Из этой простой иллюстрации видно, что при построении
массива h MATLAB использует в вычислениях содержимое массивов R и С. А ин-
индексы массивов h, R и С, как им положено, начинаются с 1. Достоинства такой
схемы индексирования видны из следующего примера.
Пример 2.13. Иллюстрация вычислительных преимуществ векторизации и
введение функций хронометрирования tic и toe.
В этом примере строится М-функция для сравнения двух реализаций вычисления
следующего двумерного изображения с помощью цикла for и на основе приема
векторизации:
/(ж, у) = A sin(uox + voy)
при ж = 0,1,2, ...,М — 1и2/ = 0,1,2, ...,iV — 1.B этом нам помогут две функции
хронометрирования tic и toe.
Глава 2. Цифровые изображения в MATLAB
Входными переменными функции являются величины A,uq,v$,M и N. Вы-
Выходными переменными служат изображения, построенные двумя этими методами
(они должны быть идентичными), а также отношение времени, необходимое для
выполнения этих действий в цикле for, ко времени, затрачиваемом по методу
векторизации. Решение состоит в следующей М-функции:
function [rt, f, g] = twodsin(A, uO, vO, M, N)
°/eTWODSIN Compares for loops vs. vectorization.
°/0 The comparison is based on implementing the functions
% f(x, y) = Asin(uOx + vOy) for x = 0, 1, 2,... M - 1 and
%y=0, 1, 2,...N-1. The inputs to the function are
% M and N and the constants in the function.
% First implement using for loops.
tic % Start timing,
for r = 1:M
uOx = uO*(r - 1);
for с = 1:N
vOy = vO*(c - 1)
ycount = ycount +1;
f(r, c) = Asin(u0x + vOy);
end
end
tl = toe % End timing.
°/0 Now implement using vectorization. Call the imange g.
tic °/o Start timing.
r = 0:M - 1;
с = 0:N - 1;
[C, R] = meshgrid(c, r);
g = Asin(uO*R + vO*C);
t2 = toe % End timing.
°/e Compute the ratio of the two times.
rt = tl/(t2 + eps) ; °/0 Use eps in case t2 is close to 0.
Вызывая эту функцию после приглашения MATLAB,
>> [rt, f, g] = twodsind, l/D*pi), l/D*pi), 512, 512);
получаем следующее значение rt:
>> rt
rt =
34.2520
Теперь мы преобразуем полученное изображение (матрицы f и g идентичны)
к виду, удобному для отображения на экране монитора, с помощью функции
mat2gray:
>> g = mat2gray(g) ;
2.10. Введение в программирование М-функций
и выведем его на экран командой imshow
>> imshow(g)
На рис. 2.7 приведен результат этих действий. ?
Итак, векторизованный код из примера 2.13
выполняется примерно в 30 раз быстрее, чем
программа, написанная на основе цикла for.
Это значительное вычислительное превосход-
превосходство становится еще более существенным фак-
фактором при увеличении относительного времени
вычислений. Например, если числа М и N будут
большими, а время исполнения векторизован-
векторизованной программы равно 2 минутам, то с помо-
помощью цикла for компьютеру на это потребует-
потребуется потратить более часа. Все это убедительно
свидетельствует в пользу применения вектори-
векторизации циклов везде, где это только возможно,
особенно когда предполагается частое примене-
применение данной процедуры. Рис. 2.7. Синусоидальное изображе-
Обсуждение метода векторизации было сфо- ние' постР°енное в примере 2.13
кусировано на вычислениях, использующих ко-
координаты изображений. Часто бывает необходимо выделить часть изображения
для дальнейшей обработки этой области. Векторизация такой программы делает-
делается особенно просто, если эта область является прямоугольной и соответствующая
процедура применяется ко всем пикселам этой области, что происходит весьма
часто при выполнении операций подобного типа. Фрагмент векторизованного ко-
кода для выделения области, скажем, s, размера mxn, у которой верхний левый угол
имеет координаты (гх, су), имеет следующий вид:
rowhigh = rx + m -1;
colhigh = су + n -1;
s = f(rx:rowhigh; cy:colhigh);
где f — это изображение, из которого извлекается нужная область. Цикл for для
выполнения этой же процедуры был приведен в примере 2.12. Если сравнить два
этих метода наподобие примера 2.13, то обнаружится, что векторизованный код
работает примерно в 1000 раз быстрее программы с циклом for.
Предварительное заполнение массивов
Другой простой прием ускорения выполнения программ состоит в предваритель-
предварительном заполнении массивов, используемых в программах. При работе с числовыми
или логическими массивами эта процедура просто означает создание в памя-
памяти компьютера массива из одних нулей подходящего размера. Например, если
работаем с двумя изображениями, скажем, f и g размером 1024x204 пикселов,
предварительное заполнение производится командами
>> f = zerosA024); g = zerosA024);
Глава 2. Цифровые изображения в МАТЬ А В
Такое заполнение массивов позволяет также уменьшить фрагментацию памя-
памяти при работе с большими массивами. Память компьютера становится сильно
фрагментированной при использовании процедур динамического распределения
и освобождения памяти. В этом случае может иметься достаточно доступной
физической памяти при выполнении вычислений, но может не хватить соседней
памяти для сохранения только что вычисленной большой переменной. Предвари-
Предварительное заполнение помогает исключить такие неприятности, позволяя системе
MATLAB зарезервировать достаточный объем памяти для больших массивов
данных в самом начале вычислений.
2.10.5. Интерактивный ввод/вывод
Часто бывает желательно написать М-функции в интерактивном виде5, т. е. так,
чтобы требуемая информация отображалась на дисплее и пользователь мог вво-
вводить нужные данные непосредственно с клавиатуры компьютера. В этом пара-
параграфе мы разберем некоторые основные приемы при написании таких функций.
Функция disp применяется для отображения информации на экране дисплея.
Она имеет следующий синтаксис:
disp(argumnet) .
Если argumnet является массивом, то disp показывает его содержимое. Если disp
является текстовой строкой, то disp отображает на экране последовательность
символов этой строки. Например,
>> А = [1 2; 3 4];
disp(A);
1 2
3 4
>> sc = 'Digital Image Processing.';
>> disp(sc);
Digital Image Processing.
>> dispOThis is another way to display text.');
This is another way to display text.
Заметим, что на экране отображается только содержимое переменной argiimnet
без вывода слов типа ans =, которые мы привыкли видеть на экране, когда зна-
значение переменной появляется на экране при отсутствии в конце команды символа
точка с запятой.
Функция input применяется при вводе данных в М-функцию. Ее синтаксис
имеет вид
t = input('message') .
Эта функция выводит на экран слова, содержащиеся в message, а затем ожидает
ввода данных пользователем, в конце которых следует нажать клавишу Enter,
после чего она сохраняет введенные данные в переменной t. Входные данные мо-
могут быть одним числом, строкой символов (заключенных в апострофы), вектором
5См. Приложение Б, посвященное созданию графических интерфейсов пользователя (GUI).
2.10. Введение в программирование М-функций
(элементы которого разделяются пробелами, и все они окружены квадратными
скобками), матрицей (строки которой разделяются символами точка с запятой,
и все они окружены квадратными скобками) или любой другой структурой дан-
данных, разрешенной в MATLAB. При выполнении команды
t = input('message', 's')
выдается содержимое message, а вход рассматривается как символьная строка,
элементы которой могут быть разделены запятыми или пробелами. Эта форма
ввода данных является достаточно гибкой, так как позволяет вводить отдельные
символы. Если предполагается, что вводимая строка (которая состоит из цифро-
цифровых символов) будет числом, то ее можно конвертировать в число класса double
с помощью функции str2num6, которая имеет синтаксис
n = str2num(t) .
Например,
t = input('Enter your data: ', 's')
Enter your data: 1, 2, 4
t =
1 2 4
>> class(t)
ans =
char
>> size(t)
ans =
1 5
>> n = str2num(t)
n =
12 4
>> size(n)
ans =
1 3
>> class(n)
double
Итак, мы видим, что t — это символьный массив размера 1x5 (три цифры и
два пробела между ними), an — это числовой вектор размера 1x3 класса double.
Если входные данные являются смешанными, т. е. состоят из символьных и
числовых данных, то можно использовать одну из функций MATLAB для об-
обработки строк символов. Особый интерес в этом плане представляет функция
strread7, которая имеет следующий синтаксис:
[а, Ь, с, ...] = strread(cstr, 'format', 'param', 'value') .
6См. в § 12.4 детальное обсуждение операций над строками.
7См. справочную страницу функции strread, где приводятся разные синтаксические формы,
применяемые в этой функции.
Глава 2. Цифровые изображения в МАТЬ А В
Эта функция читает данные из символьной строки cstr, используя специфиче-
специфические комбинации параметров format, par am/value. В этой главе нам понадобятся
форматы У01 и °/oq, которые обозначают соответственно числа с плавающей запя-
запятой и символьные строки. Параметр par am совпадает со словом delimiter, если
необходимо обозначить, что элементы, описанные в format, будут разделяться
символами, заданными параметром value (обычно это пробел или запятая). На-
Например, пусть имеется строка
>> t = J12.6, x2y, z';
Чтобы считать элементы этого входа в три переменные a, b и с, следует дать
команду
>> [а, Ъ, с] = strread(t, >0/,f70q70qJ , 'delemiter', ',')
а = 12.6000
b = 'х2у'
с = 'z'
Выход а принадлежит классу double; апострофы вокруг выходов х2у и z обо-
обозначают, что b и с являются неоднородными массивами, которые будут обсуж-
обсуждаться в следующем параграфе. Можно преобразовать их в символьные массивы,
просто положив,
>> d = char(b)
d =
х2у
и аналогичная команда выполняется для массива с. Число (и порядок) элементов
в строке format должно соответствовать числу и типу выходных переменных,
стоящих в правой части равенства. В приведенном выше примере использования
функции strread имеется три выходных переменных: одно число с плавающей
запятой и две символьные строки.
Функция strcmp применяется при сравнении строк8. Например, пусть задана
М-функция g = imnorm(f, par am), которая принимает изображение f, а пара-
параметр param может иметь два значения: 'norml5 и Jnorm255'. В первом случае
изображение f следует перенормировать в интервале [0,1], а во втором — в ин-
интервале [0,255]. В обоих случаях выходное изображение должно быть класса
double. Следующий программный фрагмент выполняет эти действия:
f = double(f);
f = f - min(f(:));
f = f./max(f(:));
if strcmp(param, 'norml')
g = f;
elseif strcmp(param, 'norm255')
g = 255*f;
8Функция strcmp(sl,s2) сравнивает строки si, s2 и возвращает логическую 1 (истина), если
строки совпадают; в противном случае возвращается логический 0 (ложь).
2.10. Введение в программирование М-функций
else
error('Unknown value of param.')
end .
Сообщение об ошибке будет выдаваться в том случае, если величина, указанная в
переменной param, не совпадает с 'norml' или 'norm255'. Отметим, что это сооб-
сообщение будет появляться, если символы этих строк набраны заглавными буквами.
Эту функцию можно модифицировать, чтобы она принимала как строчные, так
и заглавные буквы. Для этого достаточно применить функцию lower, которая
преобразует заглавные буквы в строчные. Она имеет синтаксис
param = lower(param) .
Аналогично, для преобразования букв в заглавные можно воспользоваться функ-
функцией upper:
param = upper(param) .
2.10.6. Краткое введение в смешанные массивы
и структуры
При обращении с переменными разных типов (например, с числами и символьны-
символьными строками), можно использовать т. н. смешанные массивы. В системе MATLAB
смешанным массивом9 (cell array, массив ячеек) называется многомерный мас-
массив, элементами которого являются копии других массивов, которые могут при-
принадлежать разным классам данных. Например смешанный массив
с = {'gauss', [1 0; 0 1], 3}
состоит из трех элементов: символьной строки 'gauss', числовой матрицы раз-
размера 2 х 2 и скаляра (обратите внимание на использование здесь фигурных скобок
при задании элементов массива). Для адресации элементов смешанного массива
используются целые индексы, заключенные в фигурные скобки. Например,
ans =
gauss
>> с{2}
ans =
1 0
0 1
>> с{3}
ans =
3
Важная особенность смешанных массивов состоит в том, что в них хранятся
именно копии соответствующих аргументов, а не указатели на эти аргументы.
Например, при работе со смешанным массивом
с = {А, В} ,
9 Смешанные массивы и структуры обсуждаются в § 11.1.1.
Глава 2. Цифровые изображения в МАТЬ А В
где А и В — это некоторые матрицы, которые в дальнейшем будут программно
изменяться, то содержимое массива с останется неизменным.
Понятие структура аналогично смешанному массиву в том смысле, что в
ней допускается группирование разнородных типов данных в одной переменной.
Однако в отличие от смешанных массивов, в которых индексами служат целые
числа, элементы структур арестуются именами, которые называются полями.
В зависимости от конкретного приложения, использование полей повышает по-
понимание смысла и читаемость М-функций. Например, пусть S — это структурная
переменная, в которой имеются поля с именами char.string, matrix и scalar.
Тогда в предыдущем примере можно идентифицировать структуру с помощью
следующих присвоений:
S.char_string = 'gauss';
S.matrix = [1 0; 0 1] ;
S.scalar = 3;
Обратите внимание на использовании символа точка, который стоит между
именем структуры и соответствующим полем при обращении к его содержимому.
Например, задав команду S.matrix, получим в ответ
>> S. matrix
ans =
1 0
0 1
что согласуется с выходом соответствующего смешанного массива. Здесь оче-
очевидно преимущество использования выражения S.matrix по сравнению с запи-
записью с{2}. Такая адресация данных может быть особенно полезна при работе с
большим числом разнородных данных, которые должны легко распознаваться
пользователем.
Выводы
Материалы данной главы являются фундаментом всего последующего содержа-
содержания книги. С этого места читатель должен уметь считывать изображения с дис-
диска, обрабатывать их с помощью простейших операций, отображать результаты
на экране и сохранять их на диске. Главным уроком этой главы является уме-
умение комбинировать разные функций MATLAB и IPT, а также основные приемы
программирования для решения конкретных задач, расширяющих возможности
этих стандартных функций. На самом деле, эти примеры служат моделью пред-
представления новых материалов в следующих главах. Сочетая стандартные функ-
функции и новый программный код, можно получить прототипы решений для весь-
весьма широкого спектра задач, которые возникают в области цифровой обработки
изображений.
ГЛАВА 3
ПРЕОБРАЗОВАНИЯ
ЯРКОСТИ
ИЗОБРАЖЕНИЙ
И ПРОСТРАНСТВЕННАЯ
ФИЛЬТРАЦИЯ
Введение
Термин пространственная область относится к плоскости изображения в целом,
и методы из этой категории основываются на прямых манипуляциях с пиксела-
пикселами изображений. В этой главе наше внимание будет сконцентрировано на двух
важных группах методов обработки пространственной области: преобразования
яркости (полутоновой градации) и пространственная фильтрация. Вторая груп-
группа также иногда называется обработкой окрестностей или пространственной
фильтрацией. В следующих параграфах развиваются представления о техноло-
технологиях обработки изображений из этих двух групп, которые будут иллюстрировать-
иллюстрироваться функциями MATLAB. Для лучшей согласованности разных тем большинство
примеров этой главы направлено на улучшение конкретных изображений. Такое
введение в пространственную обработку изображений является вполне продук-
продуктивным, поскольку визуальное оценивание качества изображений является, с од-
одной стороны, достаточно субъективным, а с другой стороны — привлекательным
для начинающих исследователей в данной области. Однако, как будет видно из
всего содержания книги, такой подход является достаточно общим, и он широко
применяется во многих других областях цифровой обработки изображений.
3.1. Некоторые основы
Как уже отмечалось, техника обработки пространственной области оперирует
напрямую с пикселами изображения. Процессы в пространственной области, об-
обсуждаемые в этой главе, можно обозначить уравнением
g(x,y) = T[f(x,y)} ,
где f{x,y) — входное изображение, д(х,у) — выходное (обработанное) изобра-
изображение, а Т — некоторый оператор (преобразование) над /, который определен в
некоторой окрестности точки (ж, у). Кроме того, оператор Т может обрабатывать
последовательность изображений, например, он может суммировать К входных
изображений для подавления шума.
Глава 3. Преобразования яркости изображений и пространственная фильтрация
Начало
координат
Главный подход к определению про-
пространственной окрестности вокруг точки
(х, у) состоит в использовании квадрат-
квадратной или прямоугольной области с центром
в точке (я,у), как показано на рис. 3.1.
Центр заданной шаблонной подобласти пе-
перемещается от пиксела к пикселу, начиная,
скажем, из верхнего левого угла, и на сво-
своем пути он накрывает различные окрест-
окрестности. Преобразование Т применяется в
каждой точке (х, ?/), давая в результате вы-
выходное (обработанное) значение д для дан-
данной точки. В процессе вычислений исполь-
используются только пикселы внутри заданной
окрестности с центром в (х,у).
Далее в этой главе будут рассмотрены
различные применения введенного уравнения. Несмотря на то, что это уравнение
выглядит концептуально весьма просто, его численная реализация на MATLAB
требует внимания и аккуратности, когда необходимо учитывать возможные клас-
классы данных и диапазонов значений величин.
Рис. 3.1. Окрестность размера 3x3 во-
вокруг точки (х,у) изображения
3.2. Преобразования яркости изображений
Простейшая форма преобразования Т получается, когда окрестность на рис. 3.1
имеет размер 1x1 (т.е. состоит из одного пиксела). В этом случае значение д в
точке (х, у) зависит только от значения / в этой точке, и Т становится функ-
функцией преобразования яркости (также называемой функцией градационного пре-
преобразования). Эти два термина эквивалентны применительно к монохромным
(полутоновым) изображениям. При обращении с цветными изображениями тер-
термин яркость используется для обозначения цветовой компоненты изображения
в конкретном цветовом пространстве (см. гл. 6).
Поскольку такие преобразования зависят только от значения яркости, но не
от (х,г/), функцию преобразования яркости часто записывают в простой форме
s = Г(г),
где г обозначает яркость /, a s — яркость g в любой соответствующей точке (х, у)
изображения.
3.2.1. Функция imadjust
Функция imadjust является базовым инструментом пакета IPT при преобразо-
преобразованиях яркости полутоновых изображений. Она имеет следующий синтаксис:
g = imadjust(f, [low.in, high.in], [low.out, high.out], gamma) .
На рис. 3.2 проиллюстрировано отображение с помощью этой функции исходного
изображения f в новое изображение g, при котором значения яркости в интер-
3.2. Преобразования яркости изобраэюений
вале [low_in, high_in] переходят в значения интервала [low.out, high_out],
а значения, меньшие порога low_in или большие порога low_in, обрезаются, т. е.
все, что меньше low_in, отображается в low_in, а все, что больше high_in, отоб-
отображаются в high_in. Входное изображение может иметь класс uint8, uintl6 или
double, а класс выходного изображения совпадает с классом входного. Все вход-
входные параметры функции imadjust, за исключением f, должны быть веществен-
вещественными числами в интервале от 0 до 1, независимо от класса f. Если f принадлежит
классу uint8, функция imadjust умножает эти параметры на 255 для задания
истинных величин, которые будут использоваться; если f — класса uintl6, то все
умножается на 65535. Если вместо векторов [low_in, high_in] или [low_out,
high_out] поставить пустой вектор ([ ]), то будут использоваться величины по
умолчанию, равные [0 1]. Если high.out меньше, чем low.out, то выходные
яркости симметрично переворачиваются.
Рис. 3.2. Различные отобра- а)
жения, допустимые в функции
imadjust
gamma = 1
gamma > 1 j
Параметр gamma служит для задания формы кривой, отображающей яркость f
в яркость g. Если gamma меньше 1, то яркость отображения смещается вверх в
сторону более ярких значений, как показано на рис. 3.2, а). Если gamma боль-
больше 1, то яркость отображения смещается вниз в сторону менее ярких значений.
Если параметр gamma опущен, то его значение по умолчанию равно 1 (линейное
отображение).
Пример 3.1. Применение функции imadjust.
На рис. 3.3, а) приведена цифровая рентгенограмма молочной железы f, демон-
демонстрирующая небольшое поражение ткани этого органа, а на рис. 3.3, б) дано его
негативное изображение, полученное по команде
>> gl = imadjust(f, [0 1], [10]);
Эта процедура, которая является цифровым эквивалентом получения фотонега-
фотонегатива, является весьма полезной для усиления белых или серых участков, окру-
окруженных большими, преимущественно темными, областями. Отметим, насколь-
насколько легче в этом случае анализировать ткань грудной железы по рис. 3.3, б).
Негативное изображение можно легко построить также с помощью функции
imcomplement из пакета IPT:
g = imcomplement(f) .
На рис. 3.3, в) приведен результат команды
>> g2 = imadjust(f, [0.5 0.75], [10]);
Глава 3. Преобразования яркости изображений и пространственная фильтрация
которая растягивает шкалу градации между 0.5 и 0.75 на весь интервал [0,1].
Такое преобразование может быть полезным для выделения некоторой полосы
яркости. Наконец, по команде
>> g3 = imadjust(f, [ ], [ ] , 2) ;
получается похожий результат (но с большими серыми тонами), как на рис. 3.3, в).
При этом производится сжатие нижнего и растяжения верхнего участка града-
градационной шкалы (см. рис. 3.3, г)). ?
Рис. 3.3. а) Исходная рент-
рентгенограмма молочной желе-
железы, б) Негативное изобра-
изображение, в) Результат расши-
расширения интенсивности из ин-
интервала [0.5,0.75]. г) Резуль-
Результат улучшения изображения
с gamma = 2. (Предостав-
(Предоставлено компанией G.E. Medical
System)
3.2.2. Логарифмические преобразования и
преобразования растяжения контрастности
Логарифмические преобразования и преобразования растяжения контрастности
являются основными инструментами манипуляций в динамическом диапазоне.
Логарифмические преобразования выполняются с помощью выражения
g = с* log(l + double(f)) ,
где с — некоторая константа. Форма этого преобразования похожа на гамма-
кривую, приведенную на рис. 3.2(а), где нижние величины отображаются в 0,
3.2. Преобразования яркости изображений
а верхние — в 1. Отметим, однако, что форма гамма-кривой является переменной,
в то время как форма функции log зафиксирована.
Основное применение логарифмического преобразования состоит в сжатии
динамического диапазона. Например, спектр Фурье часто имеет диапазон вели-
величин от 0 до 106 и даже выше. Если линейно масштабировать этот диапазон в
интервал с 8-ми битной градацией, то при визуализации наиболее яркие пикселы
будут доминировать, что приведет к утере деталей менее ярких участков спек-
спектра. Если применить функцию log, то динамический диапазон с амплитудой,
например, 106, сократится примерно до 14, что намного удобнее.
При выполнении логарифмических преобразований часто бывает необходи-
необходимо возвращать сжатый диапазон назад к исходному значению. Для 8 бит такое
действие в MATLAB можно совершить командой
>> gs = im2uint8(mat2gray(g)) ;
Применение mat2gray переводит величины в диапазон [0,1], а функция im2uint8
преобразует их к диапазону [0,255]. В следующем параграфе мы обсудим функ-
функцию масштабирования, которая автоматически определяет класс входных дан-
данных, а затем выполняет подходящее обращение.
Рис. 3.4. а) Преобразование рас- а)
тяжения контрастности, б) Поро- s = Т{г)
говое преобразование
б)
s = Т(г)
m m
Темное < > Светлое Темное < » Светлое
Функция, показанная на рис. 3.4, а), называется функцией преобразования
растяжения контрастности, поскольку она сжимает входные величины, мень-
меньшие чем га, в более узкий поддиапазон темных уровней на выходном изобра-
изображении, и, соответственно, величины, большие га, — в более узкую полосу яр-
ярких уровней. В результате получается изображение с большей контрастностью.
На самом деле, в предельном случае, показанном на рис. 3.4, б), выходом слу-
служит двоичное (черно-белое) изображение. Эта предельная функция, называемая
пороговой, является простейшим инструментом при сегментации изображений,
которое обсуждается в гл. 10. Используя обозначение, введенное в начале пара-
параграфа 3.2, функцию на рис. 3.4, а) молено записать в виде
s = T(r) =
1
(m/r)E'
где г — это яркость входного изображения, s — соответствующая яркость выход-
выходного изображения, а параметр Е контролирует наклон функции. Это уравнение
Глава 3. Преобразования яркости изображений и пространственная фильтрация
реализуется на MATLAB в виде следующей команды обработки всего изображения:
g = 1./U + (т./(double(f) + eps)).~E) .
Заметим, что использование величины eps (см. табл. 2.10) позволяет избежать
ошибки переполнения, если в f имеются нулевые величины. Поскольку верхнее
предельное значение функции Т(г) равно 1, выходные значения масштабированы
в диапазоне [0,1] при работе с этим типом преобразований. Форма кривой на
рис. 3.4, а) была получена при Е — 20.
Пример 3.2. Использование логарифмического преобразования для сокращения
динамического диапазона.
На рис. 3.5, а) показан спектр Фурье со значениями в диапазоне от 0 до 1.5хЮ6,
который дан в линейном масштабе по 8-ми битной системе. На рис. 3.5, б) дан
результат применения команд
>> g = im2uint8(mat2gray(log(l + double(f))));
>> imshow(g)
Визуальное улучшение изображения g по сравнению с исходным изображением
не вызывает сомнения. ?
Рис. 3.5. а) Спектр Фурье.
б) Результат применения пре-
преобразования log
3.2.3. Некоторые утилитные М-функции
преобразования яркости
В этом параграфе мы построим две М-функции, в которых будут использованы
различные аспекты преобразования яркости, рассмотренные выше. Мы приведем
подробный код одной из этих функций для иллюстрации проверки ошибок, а так-
также для демонстрации возможности MATLAB описывать функции, допускающие
переменное число входных и выходных данных. Такие приемы часто используют-
используются при написании М-функций. С этого места детальные коды М-функций будут
приводиться и обсуждаться только при необходимости объяснить новые специфи-
специфические конструкции программирования или при иллюстрировании новых функ-
функций MATLAB и IPT. Иногда это будет делаться при обзоре уже изложенного
материала. В противном случае будет приводиться лишь синтаксис рассматри-
рассматриваемой функции, а ее полный код можно найти в приложении С. Кроме того, для
3.2. Преобразования яркости изображений
большей концентрации внимания на основных структурах, это будет последний
параграф, где разбираются приемы проверки возможных ошибок. Все эти проце-
процедуры являются весьма типичными при программировании на языке MATLAB.
Использование переменного числа входных и выходных данных
Для определения числа входных аргументов М-функции используется функция
nargin,
n = nargin,
которая возвращает фактическое число входных аргументов функции. Аналогично,
функция nargout определяет число выходных аргументов. Она имеет синтаксис
n = nargout.
Например, пусть выполнена команда со следующей М-функцией:
>> Т = testhvD, 5);
Использование в теле этой функции команды nargin даст результат 2, а приме-
применение функции nargout выдаст 1.
Функцию nargchk можно применять в теле М-функций для проверки кор-
корректности числа передаваемых аргументов. Она имеет синтаксис
msg = nargchk(low, high, number).
Эта функция выдает сообщение Not enough input parameters, если number мень-
меньше, чем low или Too many input parameters, если number больше, чем high.
Если параметр number находится между low и high (включая эти значения), то
nargchk возвращает пустую матрицу. Обычно функция nargchk используется для
остановки вычислений (через функцию error) при обнаружении неправильного
числа входных аргументов.Число фактических входных аргументов устанавли-
устанавливается функцией nargin. Например, разберем следующий фрагмент кода:
function G = testhv2(x, у, z)
error(nargchkB, 3, nargin));
Если теперь набрать команду
>> testhvF);
в которой имеется всего один входной аргумент, то это породит сообщение об
ошибке
Not enough input parameters,
и вычисления будут прерваны.
Часто бывает удобно писать функции с переменным числом входных и/или вы-
выходных данных. Для этого следует использовать аргументы varargin и varargout,
которые необходимо набирать строчными буквами. Например, запись
function [m, n] = testhv3(varargin)
Глава 3. Преобразования яркости изображений и пространственная фильтрация
допускает переменное число входных аргументов при вызове функции testhv3,
а запись
function [varargout] = testhv4(m, n, p)
возвращает переменное число выходных аргументов для функции testhv4. Если
функция testhv3, скажем, имеет один фиксированный входной аргумент х, за
которым следует переменное число других входных аргументов, то запись
function [m, n] = testhv3(x, varargin)
позволит пользователю выбирать разное число входных аргументов по своему
усмотрению, начиная со второго аргумента. Допускается иметь функции, у ко-
которых переменно число и входных, и выходных аргументов.
При использовании varargin во входных аргументах функции MATLAB фор-
формирует соответствующий смешанный массив (cell array, см. § 2.10.5), который
допускает переменное число входных данных. Поскольку переменная varargin
является смешанным массивом, при вызове такой функции в ее аргументах могут
стоять данные разных типов. Например, при обращении к нашей гипотетической
функции testhv3, снабженной этой переменной, вполне допустимым будет обра-
обращение типа
>> [m, n] = testhv(f, [0 0.5 1.5], A, 'label');
где f — это изображение, следующий аргумент — это вектор-строка длины 3, А —
матрица, а ' label' — это строка символов. Такая организация данных является
очень мощным средством, которая позволяет существенно упростить структуру
функций, которым необходимо много входных аргументов. То же в полной мере
относится и к использованию переменной varargout.
М-функция преобразования яркости
В этом параграфе будет представлена функция, которая реализует следующие
преобразования: обращение, log, gamma и растяжение контрастности. Эти преоб-
преобразования нам еще понадобятся в дальнейшем изложении материала. Кроме того,
они прекрасно иллюстрируют процесс конструирования М-функций для преоб-
преобразования яркости. При написании этой функции мы воспользовались функцией
change с lass1, которая имеет синтаксис
g = cchangeclass(newclass, f) .
Эта функция конвертирует входное изображение f в изображение g, класс ко-
которого предписан переменной newclass. Допустимые значения для newclass:
Juint8', 'uintl6' и 'double'.
В следующей М-функции, которую мы назовем intrans, обратите внимание
на то, как ее использование описано в тексте справки, а также на то, как реали-
реализуется возможность переменного числа входных аргументов, как закладывается
1 Функция changeclass является недокументированной утилитой IPT. Ее код имеется в прило-
приложении С.
3.2. Преобразования яркости изображений
проверка ошибок и как устанавливается согласование классов входных и выход-
выходных изображений. Не забудьте, что переменная varargin является смешанным
массивом, поэтому его элементы следует окружать фигурными скобками.
function g = intrans(f, varargin)
°/oINTRANS Performs intensity (gray-level) transformations.
7, G = INTRANS(F, 'neg') computes the negative of input image F.
'/.
°/o G = INTRANS(F, 'log', C, CLASS) computes C*log(l + F) and
% multiplies the result by (positive) constant C. If the last two
°/0 parameters are omitted, С defaults to 1. Because the log is used
°/, frequently to display Fourier spectra, parameter CLASS offers the
°/o option to specify the class of the output as 5uint8' or
°/, 3uintl6J. If parameter CLASS is omitted, the output is of the
°/o same class as the input.
°/o G = INTRANS(F, 'gamma', GAM) performs a gamma transformation on
°/o the input image using parameter GAM (a required input) .
°/o
°/o G = INTRANS(F, 'stretch', M, E) computes a contrast-stretching
°/o transformation using the expression l./(l + (M./(F +
°/e eps)).~E). Parameter M must be in the range [0, 1]. The default
°/, value for M is mean2(im2double(F)) , and the default value for E
°/o is 4.
У.
°/o For the 'neg', 'gamma', and 'stretch' transformations, double
7, input images whose maximum value is greater than 1 are scaled
7, first using MAT2GRAY. Other images are converted to double first
7e using IM2D0UBLE. For the 'log' transformation, double images are
7e transformed without being scaled; other images are converted to
У. double first using IM2D0UBLE.
7,
7e The output is of the same class as the input, except if a
7o different class is specified for the 'log' option.
7e Verify the correct number of inputs.
error(nargchkB, 4, nargin))
7e Store the class of the input for use later,
classin = class(f);
7e If the input is of class double, and it is outside the range
7o [0, 1], and the specified transformation is not 'log', convert the
7e input to the range [0, 1] .
if strcmp(class(f), 'double') & max(f(:)) > 1 & ...
~strcmp(varargin{l}, 'log')
f = mat2gray(f);
else 7e Convert to double, regardless of class(f).
f = im2double(f);
end
Глава 3. Преобразования яркости изображений и пространственная фильтрация
% Determine the type of transformation specified.
method = varargin{l};
% Perform the intensity transformation specified.
switch method
case 'neg'
g = imcomplement(f);
case 'log5
if length(varargin) == 1
с = 1;
elseif length(varargin) == 2
с = varargin{2};
elseif length(varargin) == 3
с = varargin{2};
classin = varargin{3};
else
error('Incorrect number of inputs for the log option.')
end
g = c*(log(l + double(f)));
case 'gamma'
if length(varargin) < 2
error('Not enough inputs for the gamma option.')
end
gam = varargin{2};
g = imadjust(f, [ ] , [ ] , gam);
case 'stretch'
if length(varargin) == 1
°/o Use defaults,
m = mean2(f);
E = 4.0;
elseif length(varargin) == 3
m = varargin{2};
E = varargin{3};
else error('Incorrect number of inputs for the stretch option.')
end
g = l./(l + (m./(f + eps)).~E);
otherwise
error('Unknown enhancement method.')
end
% Convert to the class of the input image.
g = changeclass(classin, g) ;
Пример 3.3. Иллюстрация функции intrans.
Рассмотрим изображение на рис. 3.6, а), которое прекрасно подходит для приме-
применения преобразования растяжения контрастности для усиления структуры ске-
скелета. Результат, приведенный на рис. 3.6, б), получен при следующем обращении
к функции intrans:
3.2. Преобразования яркости изображений
» g = intrans(f, 'stretch', mean2(im2double(f)), 0.9);
>> figure, imshow(g)
Здесь функция mean22 используется для вычисления среднего значения f пря-
прямо в аргументе вызываемой функции. Найденное среднее используется в виде
аргумента т. Изображение f было конвертировано в класс double с помощью
функции im2double для перемасштабирования значений в область [0,1], поэто-
поэтому среднее значение будет также лежать в этих границах, что требуется для
входного аргумента т. Величина Е была задана интерактивно. ?
Рис. 3.6. а) Изображение
при сканировании скеле-
скелета, б) Улучшенное изобра-
изображение после растяжения
контрастности. (Исходное
изображение предоставле-
предоставлено компанией G.E. Medical
Systems.)
М-функция масштабирования яркости
Часто приходится работать с изображениями, имеющими очень широкий диапа-
диапазон значений пикселов — от отрицательных до положительных. При выполнении
промежуточных вычислений это не порождает больших сложностей, однако про-
проблемы возникают при желании сохранить или показать изображение в 8-и или
16-ти битном формате. Тогда следует перемасштабировать изображение на пол-
полный, максимальный интервал [0,255] или [0,65535]. Это делает функция gscale.
Кроме того, эта функция может трансформировать выходные уровни в заданный
диапазон значений. Код этой функции не содержит новых концепций програм-
программирования на MATLAB, поэтому мы его здесь не приводим. Его листинг имеется
в приложении С.
Синтаксис функции gscale имеет следующий вид:
g = gscale(f, method, low, high) ,
где f — это изображения для масштабирования. Значениями переменной method
могут быть 'full8' (принято по умолчанию), которое масштабирует в полный
2Функция m = mean2(A) вычисляет среднее значение элементов матрицы А.
Глава 3. Преобразования яркости изображений и пространственная фильтрация
интервал [0, 255], и 'full 16', приводящее к интервалу [0,65535]. При этих значе-
значениях переменной method аргументы low и high игнорируются (их можно вовсе
опускать). Третьим допустимым значением переменной method служит 'minmax'.
В этом случае аргументы low и high обязаны присутствовать и должны на-
находиться в диапазоне [0,1]. Итак, если выбрано значение 'minmax', то изобра-
изображение отображается в интервал [low, high]. Хотя эти значения имеют диапа-
диапазон [0,1], программа совершает подходящее масштабирование в зависимости от
класса входного изображения, а затем преобразует выходное изображение в тот
же класс, что и входное. Например, если f было класса uint8 и задан метод
'minmax' с интервалом [0,0.5], то выходное изображение будет того же класса
uint8 в диапазоне [0,128]. Если же f было класса double, и диапазон его зна-
значений выходит за пределы [0,1], то программа сначала конвертирует его в этот
диапазон, а потом совершит требуемое перемасштабирование. Функция gscale
будет многократно использоваться на протяжении всей книги.
3.3. Обработка гистограмм и построение графиков
функций
Функции преобразования изображений, основанные на информации, которая из-
извлекается из гистограмм яркости изображений, играют ключевую роль при об-
обработке изображений, совершаемой при решении задач улучшения изображений,
их сжатия, сегментации и описания. В этом параграфе будут разобраны методы
нахождения, построения и использования гистограмм для улучшения изображе-
изображений1. Другие применения гистограмм будут обсуждаться в следующих главах.
3.3.1. Нахождение и построение гистограмм
Гистограммой цифрового изображения, число возможных уровней яркости ко-
которого равно L, лежащих в диапазоне [0,G], называется дискретная функция
h(rk) = rife,
где г к — это к-ый уровень яркости из интервала [0,G], a rik — число пикселов
изображения, уровень яркости которых равен г к- Значение G равно 255 для изоб-
изображений класса uint8, 65535 — для класса uintl6 и 1.0 — для класса double.
Напомним, что индексы в MATLAB начинаются с 1, а не с 0, поэтому г\ соответ-
соответствует уровню яркости 0, г2 соответствует уровню яркости 1 и так далее до г^,
что соответствует уровню G. Заметим, что G = L — 1 для изображений класса
uint8 и uintl6.
Часто бывает удобно работать с нормированными гистограммами, которые
получаются делением элементов h(rk) на общее число пикселов изображения,
которое мы обозначим п:
ч h{rk) rik
Р(гк) = — = -
1В § 4.5.3 рассматривается техника построения двумерных графиков.
3.3. Обработка гистограмм и построение графиков функций
при к = 1,2,..., L. С точки зрения теории вероятностей, число p(rk) — это ве-
вероятность (частота) появления (присутствия) уровня интенсивности г^ в данном
изображении.
Стержневой функцией пакета для обращения с гистограммами служит функ-
функция imhist со следующим синтаксисом:
h = imhist(f, b) ,
где f — это входное изображение, h - его гистограмма, /г(г^), и Ъ — число корзин,
использованных при формировании гистограммы (если аргумент Ъ отсутству-
отсутствует, то по умолчанию принимается b = 256). Корзиной называется подразделение
шкалы яркости. Например, если при работе с изображениями класса uint8 пере-
переменная b = 2, то шкала яркости делится на две подобласти (корзины): от 0 до 127
и от 128 до 255. Итоговая гистограмма будет иметь два значения: ^A), равное
числу пикселов изображения, величины которых находятся в интервале [0,127],
и /гB), которое равно числу пикселов со значениями в интервале [128, 255]. Чтобы
получить нормированную гистограмму, надо просто выполнить действие
р = imhist(f, b)/numel(f).
Напомним, что numel(f) дает число элементов массива f, т.е. число пикселов
изображения (см. § 2.10.3).
Пример 3.4. Нахождение гистограмм и построение их графиков.
Рассмотрим изображение f на рис. 3.3, а). Простейший способ построения его
гистограммы состоит в применении функции imhist без обозначения выходного
аргумента:
>> imhist(f);
На рис. 3.7, а) показан результат этого действия. Такое построение гистограм-
гистограммы заложено по умолчанию в пакете. Однако имеется много других способов по-
построения и графического отображения гистограммы. Мы воспользуемся этой воз-
возможностью для объяснения некоторых опций построения графиков в MATLAB,
которые пригодятся в конкретных приложениях обработки изображений.
Гистограмму можно построить с помощью столбчатых диаграмм. Для этого
служит функция
bar(horz, v, width),
где v — это вектор-строка, график которого надо построить, horz — вектор того
же размера, что и вектор v, состоящий из приращений по горизонтальной шкале,
и width — число между 0 и 1. Если параметр horz опущен, то горизонтальная ось
делится с шагом 1 от 0 до length (v). Когда width равно 1, соседние столбики со-
соприкасаются, когда width равно 0, столбики являются вертикальными линиями,
как на рис. 3.7(а). По умолчанию width равно 0.8. При построении столбчатых
диаграмм принято уменьшать разрешение по горизонтальной оси, деля ее на по-
полосы. Следующие команды приводят к построению столбчатой диаграммы, на
которой горизонтальная ось делится на группы по 10 уровней:
Глава 3. Преобразования яркости изобраэюений и пространственная фильтрация
» h = imhist(f);
>> hi = h(l:10:256);
>> horz = 1:10:256;
>> bar (horz, hi) ;
>> axis([0 255 0 15000]);
>> set(gca, 'xtick', 0:50:255)
>> set(gca, 'ytick', 0:2000:15000)
Рис. 3.7, б) дает результат этих команд. Высокий пик, расположенный на правом
конце шкалы яркости на рис. 3.7, а), отсутствует на столбчатой диаграмме в силу
большего шага приращения по горизонтали.
б)
14ШК)
12000
10000
8000
6000
4000
2000
_
. . i_
¦
Л.
ш.
¦
г)
Рис. 3.7. Различные спосо-
способы построения графиков ги-
гистограмм, a) imhist, б) bar,
в) stem, г) plot
50 100 150 200 250
14A1H
1201Ю
10000
8000
6000
4000
2000
-
-
-
-
-
-
- |
i i i i
h
r \
\
\
-
-
-
-
-
-
100 150 200 250
Пятая команда приведенного кода была использована для того, чтобы рас-
расширить нижнюю область вертикальной оси для визуального анализа, а также
для приведения горизонтальной оси к тому же масштабу, что и на рис. 3.7, а).
Функция axis имеет синтаксис
axis( [horzmin horzmax vertmin vertmax]),
где устанавливаются минимальные и максимальные значения горизонтальных и
вертикальных координат. В последних двух командах gca означает фразу «get
current axis» (использовать текущие оси, т. е. оси ранее построенного графика), а
xtick и ytick устанавливают метки на горизонтальной и вертикальной оси через
заданные интервалы.
Возле горизонтальной и вертикальной оси графика можно поместить поясни-
пояснительные надписи с помощью функций
xlabeK'text string', 'fontsize', size)
ylabeK'text string', 'fontsize', size),
3.3. Обработка гистограмм и построение графиков функций
где size — это размер шрифта в пунктах. Текст можно также разместить прямо
на графике с помощью функции text следующим образом:
text(xloc, yloc, 'text string', 'fontsize', size),
где xloc и yloc — это координаты начала текста. Применение этих трех функций
будет проиллюстрировано в примере 3.5. Обратите внимание на то, что функции
оформления графика следует использовать после построения самого графика.
График можно снабдить заголовком с помощью функции title
title('titlestring') ,
где titlestring — это строка символов заголовка, которая будет размещена по
центру над графиком.
Стеблевая диаграмма строится аналогично столбчатой диаграмме. Ее син-
синтаксис имеет вид2
stem(horz, v, 'color_linestyle_marker', 'fill'),
где v — это вектор-столбец, график которого необходимо построить, а переменная
horz имеет тот же смысл, что и в функции bar. Аргумент color_linestyle_marker
состоит из комбинации символов, возможные значения которых приведены в
табл. 3.1. Например, команда stem(v, 'r s') построит стеблевую диаграм-
диаграмму, на которой вертикальные стебли будут проведены красными пунктирными
линиями, а головки стеблей будут квадратными. Если присутствует переменная
fill, а переменная marker обозначает круг, квадрат или ромб, то эти символы
внутри закрашиваются в цвет, предписанный переменной color. По умолчанию
цвет считается черным, линии стеблей сплошными, а головками служат круги.
Стеблевая диаграмма на рис. 3.7, в) получена с помощью команд
>> h = imhist(f) ;
>> hi = h(l:10:256);
>> horz = 1:10:256;
>> stem(horz, hi, 'fill');
>> axis([0 255 0 15000]);
>> set(gca, 'xtick', 0:50:255)
>> set(gca, 'ytick', 0:2000:15000)
Таблица З.1. Атрибуты функций stem и plot. Атрибут none применяется только к функ-
функции plot, и его следует описывать отдельно (см. синтаксис функции plot)
Символ
к
W
г
g
Ъ
с
У
m
Цвет Символ
черный —
белый
красный :
зеленый —.
синий попе
голубой
же л ты й
пурпурный
Стебель
сплошной
пунктирный
точечный
штрихпунктирный
отсутствует
Символ
+
о
*
X
S
d
none
Головка
плюс
круг
звезда
точка
крест
квадрат
ромб
отсутствует
2Дополнительные опции функции stem см. на справочной странице этой функции.
Глава 3. Преобразования яркости изображений и пространственная фильтрация
В заключение рассмотрим функцию plot, которая строит график по точкам,
соединяя их отрезками прямых линий. Она имеет синтаксис3
plot(horz, v, 5color_linestyle_marker') ,
где аргументы имеют тот же смысл, что и у функции stem. Допустимые зна-
значения атрибутов color, linestyle и marker даны в табл. 3.1. Если переменная
linestyle или marker имеет значение попе, то все атрибуты должны быть зада-
заданы индивидуально. Например, команда
>> plot(horz, v, 'color5, g', 'linestyle', 'none', 'marker', 's')
построит график из зеленых квадратов и соединит их прямыми линиями. По умол-
умолчанию функция plot строит черный сплошной график без отметки узловых точек.
График на рис. 3.7, г) получен с помощью команд
>> h = imhist(f);
>> plot(h); % Use the default values.
» axis([0 255 0 15000]);
>> set(gca, 'xtick', 0:50:255)
>> set(gca, 'ytick', 0:2000:15000)
Функция plot часто используется для отображения функций преобразования
(см. пример 3.5). ?
В рассмотренных нами примерах разметка осей координат на графиках произ-
производилась вручную. Однако это можно делать автоматически с помощью функций
ylim и xlim. Для наших целей достаточно использовать их синтаксис вида
ylim('auto')
xlim('auto').
Другой возможный вариант синтаксиса этих функций допускает ручное задание
опций
ylim([ymin ymax])
xlim([xmin xmax]).
(См. также справочные страницы). Если ограничения установлены только для
одной оси, то вторая ось оформляется по умолчанию. Эти функции будут ис-
использоваться в следующих параграфах.
Если в командной строке набрать команду hold on, то текущий график будет
сохранен на экране, причем результаты выполнения последующих графических
команд будут отображаться в этом же окне. См. пример 10.6 для иллюстрации
команды hold on.
3Дополнительные опции функции plot см. на справочной странице этой функции.
3.3. Обработка гистограмм и построение графиков функций
3.3.2. Эквализация гистограммы
Предположим на некоторое время, что уровни яркости являются непрерывными
величинами, распределенными в диапазоне [0,1]. Пусть рг(г) обозначает функ-
функцию плотности распределения вероятности (PDF, probability density function)
уровней яркости данного изображения, где нижний индекс используется для раз-
различения PDF входного и выходного изображений. Рассмотрим следующее пре-
преобразование входных уровней для получения выходных (обработанных) уровней
яркости s
г
s = T{r)= pr{w)dw,
где w — переменная, по которой ведется интегрирование. Можно показать (см.
[Gonzalez, Woods, 2002]), что функция распределения плотности выходных уров-
уровней является равномерной, т. е.
( 1
= { 0
при 0 < з < 1,
0 иначе.
Другими словами, предыдущее преобразование порождает изображение, уровни
яркости которого являются равновероятными и покрывают весь интервал [0,1].
Результат этого процесса эквализации изображения состоит в увеличении дина-
динамического диапазона уровней яркости, что обычно означает большую контраст-
контрастность выходного изображения. Заметим, что функция преобразования является
не чем иным, как функцией кумулятивного (накопленного) распределения (CDF,
cumulative distribution function).
Имея дело с дискретными величинами, нам приходится работать с гистограм-
гистограммами, поэтому в этом случае описанная выше техника называется гистпограмм-
ной эквализацией, хотя в общем случае гистограмма обрабатываемого изображе-
изображения не будет равномерной в силу самой природы дискретных величин. Используя
обозначения, введенные в § 3.3.1, пусть pr(r3),j = 1,..., L, обозначает гистограм-
гистограмму уровней яркости некоторого исходного изображения. Напомним, что величи-
величины нормированной гистограммы являются приближениями вероятностей появ-
появления каждого уровня яркости на изображении. Для дискретных величин мы
делаем суммирование (вместо интегрирования), и преобразование эквализации
приобретает следующий вид:
3=1 3=1
при к = 1,..., L, где s/c — величина яркости выходного (обработанного) изобра-
изображения, соответствующая значению яркости г к входного изображения.
Эквализация гистограмм реализована в пакете IPT функцией histeq, которая
имеет синтаксис
g = histeq(f, nlev),
Глава 3. Преобразования яркости изображений и пространственная фильтрация
где f — это входное изображение, a nlev — число уровней интенсивности, уста-
установленное для выходного изображения. Если nlev равно L (общему числу воз-
возможных уровней входного изображения), то histeq просто реализует функцию
преобразования Т(гь). Если число nlev меньше, чем L, то histeq стремится пе-
перераспределить уровни так, чтобы они приближали плоскую гистограмму. В от-
отличие от imhist, значением nlev в histeq по умолчанию является 64. Обычно
мы будем использовать максимально возможное число уровней (например, 256)
для nlev, поскольку это дает истинную реализацию описанного выше метода
гистограммной эквализации.
Пример 3.5. Гистпограммная эквализация.
На рис. 3.8, а) представлена фотография пыльцы, сделанная на электронном
микроскопе. Изображение увеличено примерно в 700 раз. Это изображение яв-
является весьма темным и у него имеется очень низкий динамический диапазон,
что необходимо улучшить. Гистограмма этого изображения дана на рис. 3.8, б),
на которой выявлена темная природа изображения, т.к. гистограмма целиком
расположена в темном участке спектра. Также очевиден низкий динамический
диапазон изображения, поскольку «ширина» гистограммы весьма мала по срав-
сравнению с шириной всего диапазона серых полутонов. Пусть f обозначает это изоб-
изображение, к которому применим следующую последовательность команд, которая
построит все изображения на рис. 3.8 от а) до г):
» imshow(f);
>> figure, imhist(f)
>> ylim('auto')
>> g = histeq(f, 256);
>> figure, imshow(g)
>> figure, imhist(g)
>> ylim('auto')
Изображения были сохранены на диске в формате TIFF с разрешением 300
dpi с помощью функции imwrite, а построенные графики были аналогично экс-
экспортированы на диск с помощью функции print, которая обсуждалась в § 2.4.
Изображение на рис. 3.8, в) является гистограммной эквализацией исходно-
исходного изображения. Улучшение средней яркости и контрастности вполне очевидно.
То же можно заключить, изучив его гистограмму, приведенную на рис. 3.8, г).
Повышение контрастности вызвано существенным расширением динамического
диапазона на всю шкалу яркости. Повышение общей яркости изображения свя-
связано с тем, что средний уровень яркости на гистограмме эквализованного изоб-
изображения стал выше (ярче), чем на исходном изображении. Несмотря на то, что
обсуждаемый метод гистограммной эквализации не приводит к плоской гисто-
гистограмме, он обладает требуемыми характеристиками, позволяющими повышать
динамический диапазон уровней яркости изображений.
Как уже отмечалось, функция преобразования T(rk) является кумулятивной
суммой величин нормированной гистограммы. Можно использовать функцию
cumsum4 и построить функцию преобразования следующим образом:
4Если А — вектор, то В = cumsum(A) — это сумма всех элементов А. Если А — многомерный
3.3. Обработка гистограмм и построение графиков функций 97
>> hnorm = imhist (f) ./numel(f) ;
>> sdf = cumsum (hnorm) ;
Рис. З.8. Иллюстрация гисто-
граммной эквализации. а) Ис-
Исходное изображение. б) Его
гистограмма, в) Изображение
после эквализации. г) Эква-
лизованная гистограмма. Оче-
Очевидно улучшение от а) к в).
(Исходное изображение предо-
предоставил д-р Роджер Хиди, Фа-
Факультет биологических иссле-
исследований Австралийского наци-
национального университета, Кан-
Канберра, Австралия)
X 1U1
100 ISO 200 250
г)
X 104
График sdf, приведенный на рис. 3.9, получен при выполнении следующих ко-
команд:
>> plot(x, cdf);
>> axis([O 10 1]);
set(gca, 'xtick', 0:
set(gca, 'ytick', 0:
>>
>>
>> х = linspace@, 1, 256); °/0 Intervals for [0, 1] horiz scale.
°/o Note the use of linspace from § 2.8.1.
°/, Plot sdf vs. x.
% Scale, settings, and labels:
2:l)
2:l)
>> xlabel('Input intensity values', 'fontsize', 9)
>> уlabel('Output intensity values', 'fontsize', 9)
>> 7e Specify text in the body of the gragh:
>> text@.18, 0.5, 'Transformation function', 'fontsize', 9)
Теперь мы можем визуально подтвердить, что эта функция преобразует узкий
входной диапазон яркости на всю шкалу яркости выходного изображения. ?
массив, то В = cumsum(A, dim) — это сумма элементов вдоль размерности dim.
Глава 3. Преобразования яркости изображений и пространственная фильтрация
0.2
0.4 0.6 0.8
Входные уровни яркости
Рис. 3.9. Функция преобразования, исполь-
использованная при отображении уровней ярко-
яркости входного изображения на рис. 3.8, а) на
уровни яркости выходного изображения на
рис. 3.8, в).
3.3.3. Гистограммная подгонка (спецификация)
Гистограммная эквализация совершается преобразованием, которое является адап-
адаптивным в том смысле, что оно зависит от гистограммы исходного изображения.
Однако если функция преобразования уже вычислена, то она не будет меняться,
пока не изменится само изображение. Как уже отмечалось в предыдущем па-
параграфе, гистограммная эквализация улучшает изображение путем расширения
диапазона его уровней до более широкой шкалы яркости. В этом параграфе бу-
будет показано, что такая процедура не всегда приводит к удовлетворительному
результату. Поэтому в конкретных приложениях полезно уметь задавать форму
гистограммы, которую желательно иметь для обработанного изображения. Ме-
Метод построения обработанного изображения с заданной гистограммой называется
гистограммной подгонкой или гистограммной спецификацией.
Этот метод, в принципе, очень прост. Рассмотрим сначала непрерывные вели-
величины, распределенные на отрезке [0,1], и пусть г и z обозначают, соответствен-
соответственно, уровни яркости входного и выходного изображений. Входные уровни имеют
функцию плотности вероятностирг(г), а функция плотности вероятности выход-
выходного изображения обозначается pz(z). Как было установлено, преобразование
г
= Г(г)= fpr(w)dw
дает яркость уровней s, которые имеют равномерную плотность вероятности ps(s)-
Зададим переменную z со следующим свойством:
z
H(z) = JPz
[w) dw = s.
Следует иметь в виду, что полученные уровни яркости должны иметь предпи-
предписанную плотность pz{z). Из предыдущих двух уравнений следует, что
3.3. Обработка гистограмм и построение графиков функций
Функцию Т(г) можно вычислить по исходному изображению (это преобразо-
преобразование гистограммной эквализации, обсуждавшееся ранее), следовательно, преды-
предыдущее уравнение можно использовать для нахождения преобразованных уров-
уровней г, для которых функция PDF была задана до тех пор, пока можно найти
функцию Н~1. При работе с дискретными величинами можно гарантировать,
что обратная к Н функция существует, если pz{z) — допустимая гистограмма
(т. е. она не отрицательна и имеет единичную область) и среди ее компонент нет
нулей (т.е., у pz(z) нет пустых корзин). Как и при гистограммной эквализации,
дискретная реализация этого метода дает лишь приближение заданной гисто-
гистограммы.
В пакете IPT метод гистограммной подгонки реализован в функции histeq
со следующим вариантом синтаксиса:
g = histeq(f, hspec) ,
где f — это входное изображение, hspec — заданная гистограмма (вектор-строка),
a g — выходное изображение, гистограмма которого близка к заданной гисто-
гистограмме hspec. Этот вектор должен состоять из целых чисел, соответствующих
одинаковым разбиениям (корзинами) диапазона уровней. Гистограмма изобра-
изображения g, построенного функцией histeq, лучше приближается к hspec, когда
length(hspec) существенно меньше числа уровней яркости исходного изображе-
изображения f.
Пример 3.6. Гистпограммная подгонка.
На рис. 3.10, а) показано изображение f спутника Марса Фобоса, а на рис. 3.10, б)
приведена его гистограмма, полученная функцией imhist(f). На этом изобра-
изображении доминируют темные области, что соответствует большой концентрации
яркости пикселов в темной части градационной шкалы. На первый взгляд, мож-
можно было бы заключить, что гистограммная эквализация способна улучшить ка-
качество этого изображения, поскольку детали темных областей стали бы более
заметными. Однако результат на рис. 3.10, в), полученный командой
>> fl = histeq(f, 256);
показывает, что этот метод не дает существенного улучшения для этой фотогра-
фотографии. Причину этого можно объяснить, анализируя гистограмму эквализованного
изображения на рис. 3.10, г). Здесь видно, что уровни яркости были сдвинуты
в верхнюю половину градационной шкалы, что привело лишь к общему освет-
осветлению изображения, которое теперь выглядит как бы «вылинявшим». Причиной
такого сдвига является большая концентрация значений темных пикселов вблизи
нулевого уровня на исходной гистограмме. Оказывается, что функция кумуля-
кумулятивного преобразования, построенная по этой гистограмме, имеет очень крутой
подъем. Это приводит к тому, что яркость пикселов, сконцентрированных возле
нижнего нулевого уровня, отображается в верхнюю часть яркостного диапазона.
Одним из возможных средств в такой ситуации может служить гистограмм-
гистограммная подгонка с заданной гистограммой, которая имела бы меньшую концентра-
концентрацию компонент в нижней части градационной шкалы, но при этом сохраняла бы
Глава 3. Преобразования яркости изобраэюений и пространственная фильтрация
общую форму гистограммы исходного изображения. Заметим, что исходная ги-
гистограмма (см. рис. 3.10, б)), в целом, является бимодальной, т.е. имеется одна
большая мода возле нулевого значения, а другая, меньшая мода, расположена в
верхней области градационной шкалы. Такой тип гистограмм можно смоделиро-
смоделировать, например, с помощью нормированных мультимодальных гауссовых функ-
функций. Следующая М-функция вычисляет бимодальную функцию Гаусса, норми-
нормированную на единичном отрезке, т. е. ее можно использовать в качестве гисто-
гистограммы.
б)
х ш4
Рис. 3.10. а) Изображение Фо-
Фобоса, спутника Марса, б) Гисто-
Гистограмма, в) Гистограммно-эква-
лизованное изображение, г) Ги-
Гистограмма в). (Исходный сни-
снимок предоставлен Агентством
NASA.)
150 200
250
г)
; i i
i 1 i
i i
1|в-
50
100 150 200 250
function р = twomodegauss(ml, sigl, m2, sig2, Al, A2, k)
'/oTWOMODEGAUSS Generates a bimodal Gaussian function.
°/« P = TWOMODEGAUSS(M1, SIG1, M2, SIG2, Al, A2, K) generates a bimodal,
°/0 Gaussian-like function in the interval [0, 1] . P is a 256-element
°/o vector normalized so that SUM(P) equals 1. The mean and standard
7, deviation of the modes are (Ml, SIG1) and (M2, SIG2), respectively.
% Al and A2 are the amplitude values of the two modes. Since the
7o output is normalized, only the relative values of Al and A2 are
% important. К is an offset value that raises the >floor> of the
°/e function. A good set of values to try is Ml = 0.15, SIG1 = 0.05,
У. M2 = 0.75, SIG2 = 0.05, Al = 1, A2 = 0.07, and К = 0.002.
3.3. Обработка гистограмм и построение графиков функций
cl = А1 * A / (B * pi) ~0.5) * sigl);
kl = 2 * (sigl -2);
c2 = A2 * A / (B * pi) ~0.5) * sig2);
k2 = 2 * (sig2 -2);
z = linspace@, 1, 256);
p = к + cl * exp(((z ml) .~2) ./ kl) + ...
c2 * exp(((z m2) Г2) ./ k2) ;
p = p ./ sum(p(:));
Следующая интерактивная М-функция принимает входные данные с клави-
клавиатуры и строит результирующую гауссову функцию. Мы отсылаем читателей к
§ 2.10.5, где объяснялись функции input и str2num.
function p = manualhist
7oMANUALHIST Generates a bimodal histogram interactively.
7, P = MANUALHIST generates a bimodal histogram using
'/. TWOMODEGAUSS (ml, sigl, m2, sig2, Al, A2, k) . ml and m2 are the means
7e of the two modes and must be in the range [0, 1] . sigl and sig2 are
7e the standard deviations of the two modes. Al and A2 are
7e amplitude values, and k is an offset value that raises the
7e >floor> of histogram. The number of elements in the histogram
'/. vector P is 256 and sum(P) is normalized to 1. MANUALHIST
7e repeatedly prompts for the parameters and plots the resulting
7e histogram until the user types an 'xJ to quit, and then it returns
7e the last histogram computed.
7.
7e A good set of starting values is: @.15, 0.05, 0.75, 0.05, 1,
'/. 0.07, 0.002) .
7e Initialize.
repeats = true;
quitnow = 'x' ;
7e Compute a default histogram in case the user quits before
7e estimating at least one histogram.
p = twomodegauss@.15, 0.05, 0.75, 0.05, 1, 0.07, 0.002);
7e Cycle until an x is input.
while repeats
s = input('Enter ml, sigl, m2, sig2, Al, A2, k OR x to quit:', 's');
if s == quitnow
break
end
7e Convert the input string to a vector of numerical values and
7e verify the number of inputs.
v = str2num(s);
if numel(v) ~= 7
dispCIncorrect number of inputs.')
continue
end
Глава 3. Преобразования яркости изобраэюений и пространственная фильтрация
р = twomodegauss(v(l), vB), vC), vD), vE), vF),
°/e Start a new figure and scale the axes. Specifying only xlim
7o leaves ylim on auto,
figure, plot(p)
xlim([0 255])
end
Поскольку проблема, возникшая при гистограммной эквализации в этом при-
примере, связана прежде всего с большой концентрацией уровней яркости пикселов
возле нулевого значения, разумным решением будет модификация гистограммы
изображения, чтобы у нее отсутствовало это явление. На рис. 3.11, а) приведен
график функции (полученной с помощью программы manualhist), который со-
сохраняет общие черты исходной гистограммы, но имеет более гладкий переход
концентрации уровней яркости в темной части градационной шкалы. Выход про-
программы р состоит из 256 равномерно распределенных точек, полученных из этой
кривой, и его молено использовать в качестве задаваемой (специфицированной)
гистограммы. Изображение с этой гистограммой строится командой
g = histeq(f, p);
Рис. 3.11. а) Заданная гисто-
гистограмма, б) Результат гисто-
гистограммной подгонки, в) Гисто-
Гистограмма б)
О «50 100 150 200 2*50
б)
ft
5
4
3
2
1
0
-
-
-
-
-
-
-
-
-
-
-
Illll
50 100 150 200 250
На рис. 3.11, б) приведен ее результат. Улучшение по сравнению с гистограммной
эквализацией на рис. 3.10, в) вполне очевидно. Интересно заметить, что выбран-
выбранная новая гистограмма имеет весьма малые отличия по сравнению с исходной
гистограммой. Этого небольшого изменения оказалось вполне достаточно для
существенного визуального улучшения изображения. Гистограмма рис. 3.11, б)
показана на рис. 3.11, в). Характерной чертой этой гистограммы является сдвиг
ее нижнего конца в сторону более яркой области градационной шкалы, т. е. ближе
3.4- Пространственная фильтрация
к выбранной форме. Заметим, однако, что этот сдвиг вправо был не столь ради-
радикальным, как на гистограмме, показанной на рис. 3.10, г), которая соответствует
очень слабому улучшению изображения, приведенного на рис. 3.10, в). ?
3.4. Пространственная фильтрация
Как уже было отмечено в § 3.1 и проиллюстрировано на рис. 3.1, окрестностная
обработка изображений состоит из следующих действий:
A) определение центральной точки (ж, у);
B) совершение операции, которая использует лишь значения пикселов в зара-
заранее оговоренной окрестности вокруг центральной точки;
C) назначение результата этой операции «откликом» совершаемого процесса в
этой точке;
D) повторение всего процесса для каждой точки изображения.
В результате перемещения центральной точки образуются новые окрестности,
отвечающие каждому пикселу изображения. Для описанной процедуры приня-
принято использовать термины окрестностная обработка и пространственная филь-
фильтрация, причем последний является более употребимым. Как будет объяснено в
следующем параграфе, если операции, совершаемые над пикселами окрестности,
являются линейными, то вся процедура называется линейной пространственной
фильтрацией (также иногда используется термин пространственная свертка),
в противном случае она называется нелинейной пространственной фильтрацией.
3.4.1. Линейная пространственная фильтрация
Понятие линейной фильтрации тесно связано с преобразованием Фурье при об-
обработке сигналов в частотной области. Эта тематика будет рассматриваться в
гл. 4. В настоящей главе рассматриваются операции фильтрации, непосредствен-
непосредственно применяемые к пикселам изображения. Использование термина линейная про-
пространственная фильтрация подчеркивает отличие этого процесса от фильтра-
фильтрации в частотной области.
Линейные операции, рассматриваемые в настоящей главе, состоят из умноже-
умножения каждого пиксела окрестности на соответствующий коэффициент и суммиро-
суммирование этих произведений для получения результирующего отклика процесса в
каждой точке (ж, у). Если окрестность имеет размер гахп, то потребуется ran ко-
коэффициентов. Эти коэффициенты сгруппированы в виде матрицы, которая назы-
называется фильтром, маской, фильтрующей маской, ядром, шаблоном или окном,
причем первые три термина являются наиболее распространенными. По при-
причинам, которые скоро станут известны, мы также будем использовать термины
сверточный фильтр, маска или ядро.
Механизм линейной пространственной фильтрации проиллюстрирован на рис. 3.12.
Процесс заключается в перемещении центра фильтрующей маски w от точки
к точке изображения /. В каждой точке (ж, у) откликом фильтра является сум-
сумма произведений коэффициентов фильтра и соответствующих пикселов окрест-
окрестности, которые накрываются фильтрующей маской. Для маски размера гахп
№lO4 Глава 3. Преобразования яркости изобраэюений и пространственная фильтрация
обычно предполагается, что т = 2а+ 1 ип = 26+1, где а и b — неотрицательные
целые числа, т. е. основное внимание уделяется маскам, имеющим нечетные раз-
размеры, причем наименьшим содержательным размером маски считается размер
3x3 (маска 1x1 исключается как тривиальная). Преимущественное обращение
с масками нечетных размеров является вполне обоснованным, поскольку в этом
случае у маски имеется выраженная центральная точка.
Начало координат изображения
ициенты маски
с относительными
ачениями координат
Элементы области
изображения
под маской
Рис. 3.12. Механизм линейной пространственной фильтрации. Увеличенный рисунок по-
показывает маску 3x3 и соответствующий фрагмент изображения под ней, кото-
который несколько смещен для удобства прочтения формул
Имеется две тесно связанные концепции, которые необходимо хорошо пони-
понимать при совершении линейной пространственной фильтрации. Первая — это
3-4- Пространственная фильтрация 105
корреляция, а вторая — свертка. Корреляция состоит в прохождении маски w по
изображению /, показанному на рис. 3.12. С точки зрения механики процесса,
свертка делается так же, но маску w надо повернуть на 180° перед прохожде-
прохождением по изображению /. Две эти концепции лучше всего объяснить на простых
примерах.
На рис. 3.13, а) изображена одномерная функция / и маска w. Началом функ-
функции / считается ее самая левая точка. Чтобы совершить корреляцию этих двух
функций, перемещаем w так, чтобы ее самая правая точка совпала с началом /,
как показано на рис. 3.13, б). Заметим, что имеются точки на обеих функциях,
которые не перекрываются. Для решения этой проблемы предполагается, что
функция / равна нулю везде, где это необходимо, чтобы гарантировать наличие
соответствующих точек на / при прохождении над ней маски w. Такая ситуация
проиллюстрирована на рис. 3.13, в).
Корреляция
у- лачали j
а) 00010000 12320
у- Начало /
Свертка
w повернут
у- Начало / на 180 градусов
00010000 02321 и)
0 0 0 10 0 0 0
б) 12 3 2 0
^- Подгонка начала
Заполнение
I нулями
в) 000000010000 00 О'
12 3 2 0
0 0 0 10 0 0 0
0 2 3 2 1
0000000100000000 л)
0 2 3 2 1
г) 0000000100000000
12 3 2 0
t- Положение после одного сдвига
0000000100000000 м)
0 2 3 2 1
д) 0000000100000000
12 3 2 0
^Положение после четырех
сдвигов
е) 0000000100000000
12 3 2 0
Окончательное положение -j
Результат корреляции 'full'
ж) 000023210000
Результат корреляции 'same'
з) 00232100
0000000100000000 н)
0 2 3 2 1
0000000100000000 о)
0 2 3 2 1
Результат свертки 'full'
000123200000 п)
Результат свертки 'same'
01232000 р)
Рис. 3.13. Иллюстрация одномерной корреляции и свертки
Теперь все готово для совершения корреляции. Первым значением корреля-
корреляции является сумма поэлементных произведений двух функций в положении на
Глава 3. Преобразования яркости изображений и пространственная фильтрация
рис. 3.13, в). В этом случае сумма произведений равна 0. Затем маска w пере-
перемещается на один шаг вправо и процесс вычисления повторяется [рис. 3.13, г)].
Сумма произведений опять равна 0. После четырех сдвигов [рис. 3.13, д)\ нам
встретится первое ненулевое значение 2x1 = 2. Продолжая тем же манером до
тех пор, пока w полностью пройдет / [последняя конфигурация показана на
рис. 3.13, ej], мы получим результат, показанный на рис. 3.13, ж). Эта строка
чисел и является корреляцией w и /. Отметим, что если бы мы зафиксировали
w, а перемещали бы /, то результат был бы иным, так что порядок операции
здесь имеет значение.
Метка 'full' над результатом корреляции на рис. 3.13, ж) является флагом
(он будет обсуждаться позже), который предписывает применение корреляции с
расширением изображения продемонстрированным выше методом. Пакет имеет
и другую опцию, 'same' [рис. 3.13, з)], когда вычисляется корреляция, размер
которой совпадает с размером исходного изображения /. Эти вычисления так-
также используют расширение нулями, но начальная позиция центральной точки
маски (это точка с отметкой 3) совмещается с началом /. Последнее вычисление
производится, когда центральная точка маски совмещается с концом /.
Для совершения свертки необходимо повернуть маску w на 180° и совместить
ее самый правый конец с началом / [см. рис. 3.13, к)]. Затем процесс скольже-
скольжения/вычисления совершается как при получении корреляции. Он проиллюстри-
проиллюстрирован на рис. 3.13 от л) до о). Результаты свертки с флагами 'full' и 'same'
показаны, соответственно, на рис. 3.13, п) и р).
Функция / на рис. 3.13 является дискретным единичным импульсом, т. е. она
равна 1 только в одной координате, а во всех остальных она равна 0. Из ре-
результатов на рис. 3.13, п) или р) видно, что свертка просто «копирует» it; в то
место, где был единичный импульс. Это простое свойство копирования (называ-
(называемое сдвигом) является фундаментальной концепцией теории линейных систем,
чем объясняется необходимость поворота одной из функций на 180° при выполне-
выполнении операции свертки. Заметим, что перестановка порядка функций при свертке
даст тот же самый результат, чего не происходит при корреляции. Если сдвигае-
сдвигаемая функция является симметричной, то, очевидно, корреляция и свертка дают
одинаковые результаты.
Представленные концепции легко обобщаются на двумерные функции, т. е.
на изображения, что иллюстрируется на рис. 3.14. Начало находится в верхнем
левом углу изображения /(х,у) [см. рис. 2.1]. Для совершения корреляции на-
надо поместить нижнюю правую точку w(x,y) так, чтобы она совпала с началом
/(#,?/), см. рис. 3.14, в). Обратите внимание на использование расширения нуля-
нулями, причина которого обсуждалась при рассмотрении рис. 3.13. Для совершения
корреляции надо перемещать w(x, у) по всем возможным положениям, так чтобы
хоть один пиксел маски перекрывался с пикселами изображения f(x,y). Резуль-
Результат корреляции 'full' показан на рис. 3.14, г). Чтобы получить корреляцию
'same', приведенную на рис. 3.14, д), необходимо перемещать маску так, чтобы
ее центр перекрывал исходное изображение /(х,у).
Для совершения свертки необходимо сначала повернуть w(x,y) на 180° и со-
совершить ту же процедуру, что и при вычислении корреляции [см. рис. 3.14 от е)
до з)\. Как и в обсуждавшемся выше одномерном примере, свертка дает одинако-
3.4- Пространственная фильтрация
вый результат независимо от того, какая из двух функций подвергается переме-
перемещению. При нахождении корреляции порядок функций имеет значение. В пакете
IPT при реализации этих процедур всегда перемещается фильтрующая маска.
Заметим также, что результаты корреляции и свертки получаются друг из друга
поворотом на 180°. В этом нет ничего удивительного, так как свертка — это не
что иное, как корреляция с повернутой фильтрующей маской.
Рис. 3.14. Иллюстра-
Иллюстрация двумерной корре-
корреляции и свертки. Нули
показаны серым цве-
цветом для лучшей на-
наглядности
>- Начало J[x, у)
0
(.)
0
0
0
0
0
0
о
0
0
0
1
0
0
0
0
0
0
0
(.)
0
0
0
0
а)
(х,у)
1
4
7
2
5
8
Исходное положение
]1
'4
]7
0
0
0
0
0
0
~2
5
8.
6
0
0
0
0
0
маски w
~з1
6!
"о"
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
в)
0
0
0
0
0
0
0
0
о
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
3
6
9
0
0
0
0
о
0
о
0
0
г Повернутая маска w
]9"
;б
]з
0
0
0
о
0
о
8"
5
.2
6
Г)
0
0
0
0
71,
4!
~0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
о
0
е)
0
о
0
0
0
0
0
0
0
о
0
0
0
0
0
0
0
0
{)
0
0
0
о
0
0
0
0
0
{)
0
0
о
0
0
0
0
Расширение нулями/
о
0
0
0
0
0
0
0
0
0
о
0
0
0
0
0
и
0
0
0
0
0
0
0
0
0
0
0
Г)
0
0
о
0
0
0
0
0
0
0
0
1
0
0
0
0
б)
0
0
0
0
0
0
0
0
0
0
0
0
0
о
0
0
о
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Результат корреляции
0
о
о
0
0
0
0
0
0
0
о
0
0
0
0
0
0
0
0
0
Г)
0
0
0
0
0
0
0
0
0
9
6
3
0
0
0
¦м
0
0
0
8
5
2
0
0
0
г)
V
0
0
0
7
4
1
0
0
0
0
0
0
0
0
0
0
0
0
Результат сверткк
0
0
0
о
0
0
0
0
0
0
0
0
0
0
0
0
о
0
0
0
0
0
0
0
0
0
0
0
0
о
1
4
7
0
о
0
0
0
0
2
5
8
0
0
0
0
0
0
3
6
9
0
0
0
ж)
0
0
0
0
0
0
0
о
0
0
0
0
0
0
0
0
0
0
{)
0
0
0
0
0
о
0
0
[ 'full'
0
0
0
0
0
0
0
0
0
0
о
0
0
0
0
0
0
0
Результат корреляции
0
0
0
0
0
'same'
0
9
6
3
0
0
8
5
2
0
0
7
4
1
0
0
0
0
0
0
д)
Результат свертки 'sai
0
0
0
о
0
о
1
4
7
0
0
2
5
8
О
0
3
6
9
0
о
0
0
0
0
з)
В пакете IPT линейная пространственная фильтрация реализована функцией
imf ilter, которая имеет следующий синтаксис:
>> g= imf ilter(f, w, f ilter ing.mode, boundary ..options, size_options) ;
где f — это входное изображение, w — фильтрующая маска, g — результат филь-
фильтрации, а остальные параметры сведены в табл. 3.2. Параметр f iltering.mode
определяет, что совершает фильтр, корреляцию ('согг') или свертку ('conv').
Опция boundary^opt ions отвечает за расширение границ, причем размеры рас-
расширения определяются размерами фильтра. Подробнее этот параметр будет раз-
Глава 3. Преобразования яркости изображений и пространственная фильтрация
бираться в примере 3.7. Опция size.options — это либо 'full', либо 'same',
смысл которых уже объяснялся на рис. 3.13 и 3.14.
Чаще всего функция imf ilter применяется в виде команды
g = imfilter(f, w, 'replicate') .
Эта форма команды используется при реализации в IPT стандартных линейных
пространственных фильтров, которые будут обсуждаться в § 3.5.1. Эти фильтры
уже повернуты на 180°, поэтому можно делать процедуру корреляции, которая
задана в функции imf ilter по умолчанию. А как уже обсуждалось при изуче-
изучении рис. 3.14, совершение корреляции с перевернутым фильтром эквивалентно
свертке с исходным фильтром. Если фильтр симметричен относительно своего
центра, то обе опции дают одинаковые результаты.
Таблица 3.2. Опции функции imf ilter
Опции
Мода фильтрации
>согг>
'conv'
Граничные опции
Р
'replicate'
'symmetric'
'circular'
Опции размера
'full'
'same'
Описание
Фильтрация делается методом корреляции (см. рис. 3.13 и 3.14). Мода
по умолчанию.
Фильтрация делается методом свертки (см. рис. 3.13 и 3.14)
Границы изображения расширяются значением Р (без апострофов).
По умолчанию Р=0.
Размер изображения увеличивается повторением величин на его бо-
боковых границах.
Размер изображения увеличивается путем зеркального отражения че-
через границы.
Размер изображения увеличивается периодическим повторением дву-
двумерной функции.
Выход имеет те же размеры, что и расширенное входное изображение.
Выход имеет те же размеры, что и вход. Это достигается с помощью
ограничения перемещения центра фильтрующей маски точками, при-
принадлежащими исходному изображению, (см. рис. 3.13 и 3.14). Опция
по умолчанию.
При работе с фильтрами, которые не были предварительно перевернуты или
были несимметричными, когда требуется построить свертку, можно поступать
двумя способами. Один из них использует синтаксис
g = imfilter(f, w, 'conv', 'replicate').
Другой подход заключается в предварительной обработке маски w с помощью
функции rot90(w, 2I, которая поворачивает w на 180°. После этого приме-
применяется команда imf ilter (f, w, 'replicate'). Конечно, эти два шага можно
записать в одной формуле. В результате получится изображение, размер кото-
которого совпадает с размером исходного (т. е. по умолчанию принята опция ' same',
которая обсуждалась ранее).
1 Функция rot90(w, k) поворачивает w на угол fcx90°, где к — целое число.
3.4- Пространственная фильтрация
Каждый элемент фильтрованного изображения вычисляется с использовани-
использованием арифметики двойной точности с плавающей запятой, но в конце работы функ-
функция imf ilter конвертирует выходное изображение в класс исходного. Значит, ес-
если f — это целый массив, то элементы обработанного массива, которые выходят
за область целых чисел, будут обрезаться, а дробные величины — округляться.
Если требуется результат с повышенной точностью, то необходимо предвари-
предварительно перевести изображение в класс duble с помощью функций im2double или
double перед применения imf ilter.
Рис. 3.15. а) Исходное изображение, б) Результат применения imf ilter с нулевым продол-
продолжением, в) Результат с опцией 'replicate', г) Результат с опцией 'symmetric'.
д) Результат с опцией 'circular', e) Результат конвертации исходного изобра-
изображения в класс uint8 с последующей фильтрацией с опцией 'replicate'. Везде
использован фильтр размера 31x31 из одних единиц
Пример 3.7. Применение функции imf ilter.
На рис. 3.15, а) дано изображение класса double, размера 512x512 пикселов. Рас-
Рассмотрим простой фильтр размера 31x31
>> w = onesC1) ;
который пропорционален фильтру усреднения. Мы не делим коэффициенты на
31 х31, чтобы продемонстрировать в конце этого примера действие функции imf ilter
на изображениях класса uint8.
Свертка с фильтром w дает эффект размытия исходного изображения. По-
Поскольку фильтр симметричен, можно использовать моду корреляции, заданную
в imf ilter по умолчанию. На рис. 3.15, б) приведен результат выполнения сле-
следующих действий:
>> gd = imf ilter (f, w) ;
>> imshow(gd, [ ])
Глава 3. Преобразования яркости изображений и пространственная фильтрация
где использовалась граничная опция, принятая по умолчанию, т. е. расширение
изображения нулями (черным цветом). Как и ожидалось, границы между белы-
белыми и черными областями стали размытыми. Тот же эффект имел место на гра-
границах изображения, к которым примыкают белые области, что вполне понятно в
силу расширения границ черным цветом. С этой трудностью можно справиться,
если использовать опцию 'replicate'
>> gr = imfilter(f, w, 'replicate');
>> figure, imshow(gr, [ ])
Из рис. 3.15, в) видно, что теперь границы фильтрованного изображения вы-
выглядят так, как и ожидалось. Эквивалентный результат получается с опцией
'symmetric'
>> gs = imfilter(f, w, 'symmetric');
>> figure, imshow(gs, [ ])
Результат показан на рис. 3.15, г). Однако, если применить опцию 'cirular'
>> gc = imfilter(f, w, 'cirular');
>> figure, imshow(gc, [ ])
(см. рис. 3.15, д)), то обнаружится та же проблема, что и при расширении нуля-
нулями. Этому не стоит удивляться, ведь при периодическом повторении исходного
изображения черные квадраты примыкают к белым.
Наконец, проиллюстрируем эффекты, происходящие из-за сохранения клас-
класса изображения функцией imf ilter, который может привести к определенным
проблемам, если не обращать на это внимание:
f8 = im2uint8(f);
>> g8r = imfilter(f8, w, 'replicate');
>> figure, imshow(g8r, [ ])
На рис. 3.15, e) изображен результат этих команд. Здесь при конвертации выход-
выходного изображения в класс uint8 функцией imf ilter произошло усечение части
изображения. Причина этого состоит в том, что сумма коэффициентов фильтра-
фильтрации не принадлежит интервалу [0,1], в результате чего фильтрованные коэф-
коэффициенты вышли за допустимые пределы области определения [0, 255] данного
класса. Чтобы избежать такой неприятности, следует делать нормировку коэф-
коэффициентов фильтра, чтобы их сумма принадлежала интервалу [0,1] (в рассмот-
рассмотренном примере для этого необходимо разделить коэффициенты на 312, тогда
их сумма будет равна 1), или переводить изображение в класс double. Отметим,
однако, что даже во втором случае данные придется где-то перенормировать для
приведения их к нужному формату (например, при сохранении изображения на
диске). В любом случае, следует всегда помнить об области значений данных,
чтобы избегать неожиданных результатов. ?
3.4- Пространственная фильтрация
3.4.2. Нелинейная пространственная фильтрация
Нелинейная пространственная фильтрация также основана на окрестностных
операциях, причем механизм определения окрестности размера тхп и сколь-
скольжения ее центра по изображению является таким же, как и в линейной филь-
фильтрации, описанной в предыдущем параграфе. Однако там, где линейная филь-
фильтрация использует сумму произведений (т.е. линейную операцию), нелинейная
фильтрация основана (что следует из ее названия) на нелинейных операциях, со-
совершаемых над пикселами текущей окрестности. Например, если положить, что
отклик фильтра в каждой центральной точке равен максимальному значению
в ее окрестности, то это определит нелинейную операцию фильтрации. Другое
фундаментальное отличие состоит в том, что концепция маски не превалирует
в нелинейных процессах. Идея фильтрации остается, но сам «фильтр» следует
представлять себе в виде нелинейной функции, которая применяется к пикселам
окрестности, и ее отклик состоит из отклика операции, примененной к централь-
центральному пикселу окрестности.
В пакете предусмотрены две функции для совершения общей нелинейной
фильтрации: nlf ilter и coif ilt. Первая из них совершает операции непосред-
непосредственно в матричной форме, а функция coif ilt организует данные в форме
столбцов. Хотя coif ilt требует большего объема памяти, она выполняется су-
существенно быстрее, чем nlf ilter. В большинстве приложений обработки изобра-
изображений скорость вычисления является первостепенным фактором, поэтому функ-
функция coif ilt является более предпочтительной при реализации общей нелинейной
пространственной фильтрации.
Для заданного входного изображения f размера М х N и для заданной окрест-
окрестности размера тхп функция coif ilt строит матрицу, назовем ее А, максималь-
максимального размера mnxMN2, в которой каждый столбец соответствует пикселам,
окруженным окрестностью с центром в некоторой точке изображения. Напри-
Например, первый столбец соответствует пикселам, окруженным окрестностью, центр
которой расположен в самом левом верхнем углу изображения f. Все необходи-
необходимые расширения выполняются функцией coif ilt (с помощью нулевых добавок).
Синтаксис функции coif ilt имеет вид
g = colfilt(f, [m, n], 'sliding', @fun, parameters) ,
где, как и раньше, тип — это размеры области фильтра, 'sliding' обозна-
обозначает, что процесс производится скольжением области тхп от пиксела к пик-
пикселу по входному изображению f, @fun обозначает ссылку на функцию fun, a
parameters — это параметры (разделенные запятыми), которые могут потре-
потребоваться функции fun. Символ @ называется дескриптором функции, который
является особым типом данных MATLAB, содержащим информацию, которая
используется при вызове функции. Как скоро будет видно, эта конструкция яв-
является весьма плодотворной.
В силу организации матрицы А, функция fun должна обращаться к каждому
столбцу этой матрицы индивидуально, возвращая вектор-строку v, в которой
2Матрица А всегда имеет тп строк, но число столбдов может меняться в зависимости от раз-
размера входного изображения. Выбор размера производится функцией coif ilt автоматически.
Глава 3. Преобразования яркости изображений и пространственная фильтрация
записан результат для всех столбцов. В k-ом элементе вектора v стоит результат
применения операции fun к к-ому столбцу матрицы А. Поскольку матрица А
может иметь до MN столбцов, максимальный размер v равен lxMN.
Обсуждавшаяся в предыдущих параграфах линейная фильтрация имеет сред-
средства для расширения изображений, чтобы разрешать граничные проблемы, при-
присущие пространственной фильтрации. Однако при использовании coif ilt необ-
необходимо заранее расширить входное изображение до его фильтрации. Для этого
служит функция padarray, которая в двумерном случае имеет синтаксис
fp = padarray(f, [г с], method, direction) ,
где f — входное изображение, f p — расширенное изображение, [г с] дает число
добавляемых к f строк и столбцов, а параметры method и direction объясняются
в табл. 3.3. Например, если изображение f = [1 2; 3 4], то команда
>> fp = padarray(f, [3 2], 'replicate', 'post')
дает результат
fp =
12 2 2
3 4 4 4
3 4 4 4
3 4 4 4
3 4 4 4.
Если среди аргументов отсутствует direction, то значение по умолчанию есть
'both', а если отсутствует аргумент method, то расширение по умолчанию дела-
делается нулями. Если оба параметра опущены, то делается расширение нулями со
всех сторон изображения. В конце вычислений изображение обрезается до исход-
исходного размера.
Таблица 3.3. Опции функции padarray
Опции Описание
Method
'symmetric' Размер изображения увеличивается с помощью его зеркального отобра-
отображения через границы.
'replicate' Размер изображения увеличивается с помощью продолжения пригранич-
приграничными значениями.
'circular' Расширение производится путем периодического повторения исходного
изображения.
Direction
'pre' Расширять перед первыми элементами по каждой размерности.
'post' Расширять после последних элементов по каждой размерности.
'both' Расширить в обе стороны по каждой размерности.
3.4- Пространственная фильтрация
Пример 3.8. Использование функции coif ilt при реализации нелинейной про-
пространственной фильтрации.
В качестве иллюстрации применения функции coif ilt мы реализуем нелиней-
нелинейный фильтр, отклик которого в любой точке совпадает со средним геометриче-
геометрическим яркости пикселов в окрестности с центром в данной точке. Геометрическим
средним окрестности размера тхп называется произведение величин яркости
всех пикселов окрестности, возведенное в степень 1/тп. Сначала построим нели-
нелинейную функцию, которую мы назовем gmean3:
function v = gmean(A)
mn = size(A, 1); °/0 The length of the columns of A is always mn.
v = prod(A, l).~(l/mn);
Для подавления граничных эффектов мы расширим изображение, например,
с помощью опции 'replicate3 в функции padarray:
>> f = padarray(f, [m n] , 'replicate');
Наконец, вызываем функцию coif ilt
>> g = colfilt(f, [m n] , 'sliding', @gmean) ;
В этих действиях имеется несколько важных моментов. Прежде всего отме-
отметим, что несмотря на то, что матрица А является частью аргументов функции
gmean, сама она не включается в список аргументов функции coif ilt. Эта мат-
матрица автоматически передается в gmean из coif ilt посредством дескриптора
функции. Кроме того, поскольку матрица А обрабатывается в coif ilt автома-
автоматически, число столбцов в А является переменным (но, как уже подчеркивалось,
число строк, т.е. длина столбца в А, всегда равна mn). Следовательно, размер
А должен вычисляться каждый раз при вызове функции аргумента функцией
coif ilt. Процесс фильтрации в нашем случае заключается в вычислении про-
произведения всех пикселов окрестности и возведения результата в степень 1/тп.
Для каждой пары координат (ж, у) результат фильтрации будет записан в со-
соответствующий элемент вектора v. Функция, обозначенная дескриптором @, мо-
может быть любой функцией, которую можно вызывать из того места, где этот
дескриптор был создан. Ключевое требование заключается в том, что нелиней-
нелинейная функция оперирует над столбцами матрицы А и возвращает вектор-строку,
содержащую результат для каждого индивидуального столбца. Затем функция
coif ilt принимает эти результаты и группирует их в виде соответствующего
выходного изображения g. ?
Некоторые часто встречающиеся нелинейные фильтры можно также постро-
построить на основе других функций MATLAB и IPT, например, imf ilter и ordf ilt2
(см. § 3.5.2). В частности, функция spf ilt из § 3.5 реализует фильтр геометри-
геометрического среднего из примера 3.5 с помощью функции imf ilter и стандартных
функций log и ехр системы MATLAB. При этом производительность вычис-
вычислений обычно повышается, а объем требуемой памяти становится меньше, чем
3Функция prod(A) возвращает произведение элементов А, а функция prod(A, dim) вычисляет
произведение элементов А вдоль размерности dim.
I 14 Глава З. Преобразования яркости изображений и пространственная фильтрация
у coif ilt. Тем не менее, функция coif ilt остается хорошим выбором при вы-
выполнении операций нелинейной фильтрации, для которых нет альтернативных
реализаций.
3.5. Стандартные пространственные фильтры
из пакета IPT
В этом параграфе обсуждаются линейные и нелинейные пространственные филь-
фильтры, которые поддерживаются в пакете IPT. Дополнительные нелинейные филь-
фильтры будут реализованы в конце § 5.3.
3.5.1. Линейные пространственные фильтры
В пакете IPT имеются некоторые стандартные двумерные линейные простран-
пространственные фильтры, которые можно получить из функции f special, которая ге-
генерирует маску фильтра w при выполнении команды
w = fspecial Оtype', parameters),
где 'type' обозначает тип фильтра, а в аргументах parameters задаются пара-
параметры выбранного фильтра. Пространственные фильтры, получаемые этой ко-
командой, приведены в табл. 3.4 вместе с соответствующими параметрами каждого
фильтра.
Пример 3.9. Использование функции imf ilter.
Проиллюстрируем использование f special и imf ilter при улучшении изобра-
изображения фильтром Лапласа. Оператор Лапласа изображения f(x,y) обозначается
y) и задается формулой
В качестве численных приближений вторых производных часто используются
выражения
—. = /(х + 1,^) + f(x -\^y)- 2/(x,у)
и
^-2 = /О, у + 1) + /(ж, у - 1) - 2/(ж, у),
поэтому
V2/ = [/(х + 1, у) + fix - 1, у) + fix, y + l) + fix, y-l)}- 4/(х, у).
Это выражение молено применить в любой точке (х, у) изображения, сделав
свертку со следующей пространственной маской:
О 1 О
1-41.
О 1 О
3.5. Стандартные пространственные фильтры из пакета IPT
Таблица 3.4. Пространственные фильтры функции f special
Тип
Синтаксис и параметры
'average'
'disk'
'gaussian'
'laplacian'
'log'
'motion'
'prewitt'
'sobel'
'unsharp'
f special ('average', [re]). Прямоугольный усредняющий фильтр разме-
размера гхс. По умолчанию 3x3. Одно число на месте [г с] означает квадрат-
квадратный фильтр.
fspeciaK'disk', г). Круговой усредняющий фильтр (внутри квадрата со
стороной 2г+1) радиуса г. По умолчанию г = 5.
i special Cgaussian', [re], sig). Низкочастотный гауссов фильтр разме-
размера гхс со стандартным (положительным) отклонением sig. Значения по
умолчанию 3x3 и 0.5. Одно число на месте [г с] означает квадратный
фильтр.
f special('laplacian', alpha). Фильтр Лапласа 3x3, форма которого за-
задается параметром alpha из интервала [0,1]. По умолчанию alpha = 0.5.
f special ('log', [г с], sig). Лаплас от гауссова фильтра (LoG) размера
гхс со стандартным (положительным) отклонением sig. Значения по умол-
умолчанию 5x5 и 0.5. Одно число на месте [г с] означает квадратный фильтр,
f special('motion', len, theta). Выдает фильтр, который, будучи сверну-
свернутым с изображением, приближает линейное перемещение (видеокамеры по
отношению к изображению) на len пикселов. Направление перемещения за-
задается углом theta, который измеряется в градусах от горизонтали против
часовой стрелки. Значения по умолчанию 9 и 0, что соответствует переме-
перемещению на 9 пикселов в горизонтальном направлении.
f special ('prewitt'). Выдает 3x3 маску Превитта wv, которая аппрокси-
аппроксимирует вертикальный градиент. Маску горизонтального градиента можно
получить, транспонировав результат: wh = wv'.
fspecial('sobel'). Выдает 3x3 маску Собела sv, которая аппроксимиру-
аппроксимирует вертикальный градиент. Маску горизонтального градиента можно полу-
получить, транспонировав результат: sh = sv'.
f special ('unsharp', alpha). Выдает 3x3 маску нечеткого фильтра. Пара-
Параметр alpha контролирует форму, он должен быть не меньше 0 и не больше
1.0. По умолчанию alpha = 0.2.
Альтернативное приближение вторых производных учитывает значения диа-
диагональных элементов и дает маску
1 1 1
1-81.
1 1 1
Обе производные иногда определяются с противоположным знаком, что приво-
приводит к смене знаков в приведенных выше формулах для масок.
Улучшение изображений с помощью оператора Лапласа производится по фор-
формуле
д(х, у) = f(x, у) + cV2/(z, у),
где /(х, у) — это исходное изображение, д(х, у) — улучшенное изображение, а па-
параметр с равен 1, если центральный коэффициент маски положителен, и с = — 1
в противном случае (см. [Gonzalez, Woods, 2002]). Поскольку оператор Лапласа
является дифференциальным, он повышает резкость изображения, но переводит
области с постоянными значениями яркости в 0. Добавление исходного изобра-
изображения восстанавливает тональность уровней таких областей.
Глава 3. Преобразования яркости изобраснсений и пространственная фильтрация
Функция f special ( ' laplacian', alpha) реализует более сложную маску Ла-
Лапласа:
1
1
1
а
+
-
+
а
а
а
а
1
1
1
1
— а
+ а
-4
+ а
— а
1
1
1
а
+
-
+
а
а
а
а
\ + а 1 + а 1 + а'
которая позволяет тоньше подстраивать результат. Однако преобладающее ис-
использование оператора Лапласа основано на приведенных выше двух масках.
Рис. 3.16. а) Снимок Север-
Северного полюса Луны, б) Изобра-
Изображение, отфильтрованное лап-
лапласианом в формате uint8.
в) Изображение, отфильтро-
отфильтрованное лапласианом в форма-
формате double, г) Улучшение изоб-
изображения вычитанием б) из а).
(Исходное изображение предо-
предоставлено Агентством NASA.)
Теперь рассмотрим улучшение изображения на рис. 3.16, а) с помощью филь-
фильтра Лапласа, который часто называется лапласианом. На этой фотографии дан
несколько расплывчатый снимок Северного полюса Луны. Улучшение в этом
случае заключается в подчеркивании перепадов уровней на изображении при со-
сохранении, насколько это возможно, областей постоянной тональности. Сначала
мы генерируем и отображаем фильтр Лапласа:
>> w = f special( 'laplacian', 0);
w =
3.5. Стандартные пространственные фильтры из пакета IPT
0.0000 1.0000 0.0000
1.0000 -4.0000 1.0000
0.0000 1.0000 0.0000
Заметим, что фильтр принадлежит классу duoble, и параметр формы alpha = 1
приводит к описанному выше фильтру. Такую форму можно легко задать вручную
>> w = [0 1 0; 1 -4 1; 0 1 0] ;
Теперь применим фильтр w к изображению f, которое имеет класс uint8:
>> gl = imfilter(f, w, 'replicate');
>> imshow(gl, [ ])
На рис. 3.16, б) приведен результат этих команд. Этот результат представляет-
представляется правдоподобным, но имеется одна проблема: все его пикселы положительны.
В силу отрицательности центрального коэффициента фильтра можно ожидать
появления фильтрованного изображения с отрицательными значениями пиксе-
пикселов. Однако в нашем случае исходное изображение было класса uint8, а, как
уже говорилось в предыдущем параграфе, фильтрация функцией imf ilter про-
производит на выходе изображение того же класса, что было на входе, поэтому
отрицательные величины будут обрезаны. Чтобы обойти эту проблему, следует
преобразовать изображение f в класс double перед фильтрацией:
>> f2 = im2double(f) ;
>> g2 = imfilter(f2, w, 'replicate');
>> imshow(g2, [ ])
Результат, показанный на рис. 3.16, ej, является правильно обработанным изоб-
изображением при фильтрации с помощью лапласиана.
Наконец, для восстановления тонов областей, потерянных при выполнения
фильтрации лапласианом, следует вычесть (напомним, что центральный коэф-
коэффициент фильтра отрицателен) отфильтрованное изображение из исходного:
>> g = ±2 - g2;
>> imshow(g)
Окончательный результат приведен на рис. 3.16, г). Видно, насколько улучшен-
улучшенное изображение является более резким по сравнению с исходным. ?
Пример ЗЛО. Подбор параметров фильтров и сравнение разных техник улуч-
улучшения изображений.
Задача улучшения изображений часто требует подбора параметров фильтров из
имеющегося набора. Лапласиан является хорошим примером. В пакете имеется
фильтр-лапласиан 3x3 с числом —4 в центре. Как правило, еще большую рез-
резкость изображения можно получить с лапласианом, в центре которого стоит чис-
число —8, окруженное со всех сторон 1 (см. обсуждение выше). Целью следующего
примера является ручная реализация этого фильтра для сравнения результатов,
которые получаются с помощью двух форм фильтра лапласиана. Имеем следу-
следующую цепочку команд:
Глава 3. Преобразования яркости изображений и пространственная фильтрация
» f = imread('moon.tif');
>> w4 = fspecial('laplacian', 0); °/0 Same as Example 3.9.
>> w8= [111; 1-8 1; 111];
>> f = im2double(f) ;
>> g4 = f - imfilter(f, w4, 'replicate');
>> g8 = f - imfilter(f, w8, 'replicate');
>> imshow(f)
>> figure; imshow(g4)
>> figure; imshow(g8)
На рис. 3.17, а) еще раз для удобства приведено исходное изображение f.
На рис. 3.17, б) дано g4, которое совпадает с рис. 3.16, г), а на рис. 3.17, б) изоб-
изображено g8. Как и ожидалось, оно еще более четкое, чем 3.17, б). ?
Рис. 3.17. а) Снимок Северного полюса Луны, б) Изображение, улучшенное лапласианом
с —4 в центре, в) Изображение, улучшенное лапласианом с —8 в центре
3.5.2. Нелинейные пространственные фильтры
Наиболее употребительные нелинейные фильтры порождаются в пакете IPT функ-
функцией ordf ilt2, которая строит фильтры порядковых статистик (их также на-
называют ранговыми фильтрами). Отклики этих нелинейных пространственных
фильтров основаны на предварительном упорядочении (ранжировании) пиксе-
пикселов изображения из текущей окрестности, после чего центральному пикселу при-
присваивается значение, определенное в результате данного упорядочения. В этом
параграфе все внимание будет сосредоточено на фильтрах, получающихся при
помощи функции ordf ilt2. Несколько дополнительных нелинейных фильтров
будут рассмотрены в § 5.3.
Синтаксис функции ordf ilt2 имеет следующий вид:
g = ordfilt2(f, order, domain).
Эта функция создает выходное изображение g, заменяя каждый элемент f на
элемент номер order в упорядоченной последовательности ненулевых элементов
из окрестности, заданной параметром domain. Здесь domain — это матрица тхп,
3.5. Стандартные пространственные фильтры из пакета IPT
состоящая из нулей и единиц, которые обозначают позиции пикселов, участвую-
участвующие в вычислениях. В этом смысле матрица domain действует как маска. Пикселы
окрестности, которым соответствуют нули в domain, не участвуют в вычислени-
вычислениях. Например, чтобы реализовать фильтр минимума (порядка 1) размера ттгхп,
применяется команда
g = ordfilt2(f, 1, ones(m, n)).
В такой записи order = 1 означает первый элемент в упорядоченной последова-
последовательности из тп пикселов, a ones(m, n) — это матрица ттгхп из одних единиц,
указывающая на то, что все элементы окрестности участвуют в вычислении от-
отклика фильтра.
Используя терминологию статистик, фильтр минимума (первый элемент упо-
упорядоченной по возрастанию последовательности) — это нулевой процентиль. Ана-
Аналогично, сотый процентиль — это последний элемент упорядоченной последова-
последовательности, имеющий номер тп. Он соответствует фильтру максимума, который
реализуется командой
g = ordfilt2(f, m*n, ones(m, n)).
Самым известным фильтром порядковых статистик в цифровой обработке изоб-
изображений является медианный1 фильтр, который соответствует 50-ому процен-
тилю. Можно использовать функцию median в ordf ilt2 для построения этого
фильтра
g = ordfiIt2(f, median(l:m*n), ones(m, n)).
Здесь median A :m*n) — это медиана упорядоченной последовательности чисел
1,2,..., ran. Функция median имеет следующий общий синтаксис:
v = median(A, dim),
где v — это вектор, элементы которого образуют медиану А вдоль размерности
dim. Например, если dim = 1, то каждый элемент v — это медиана элементов
вдоль соответствующих столбцов матрицы А.
В силу практической важности медианного фильтра в пакете IPT предусмот-
предусмотрена специальная реализация этого фильтра:
g = medfilt2(f, [m, n], padopt),
где пара [m, n] задает окрестность размера raxn, по которой вычисляется ме-
медиана, а параметр padopt специфицирует три возможные опции расширения
границ изображения: опция по умолчанию 'zeros' с нулевым расширением,
'symmetric', при которой изображение f расширяется путем его зеркального
отражения через границы, и 'indexed', при которой i расширяется значением
1, если i имеет класс double и значением 0 в противном случае. По умолчанию
эта функция имеет вид
g = medfilt2(f),
1 Напомним, что медиана некоторого множества величин — это такое число ?, что половина
этих величин не больше ?, а другая половина — не меньше ? .
Глава 3. Преобразования яркости изображений и пространственная фильтрация
при этом используется окрестность 3x3 для вычисления медианы, и входное изоб-
изображение расширяется нулевыми значениями пикселов.
Пример 3.11. Медианная фильтрация с функцией medf ilt.
Медианная фильтрация весьма эффективна при удалении с изображений им-
импульсных шумов, которые иногда называют шумами «соль и перец». Борьбу с
различными шумами мы будем обсуждать подробно в гл. 5, однако здесь умест-
уместно проиллюстрировать эти действия с помощью медианного фильтра.
На рис. 3.18, а) представлен рентгеновский снимок f печатной платы, полу-
полученный на стадии автоматического контроля продукции производства. На рисун-
рисунке 3.18, б) дано то же изображение, сильно подпорченное шумом «соль и перец»,
при котором белые и черные точки имеют вероятность появления 0.2. Этот шум
был искусственно сгенерирован функцией imnoise, которая будет подробно об-
обсуждаться в § 5.2.1:
>> fn = imnoise(f, 'salt & paper', 0.2);
На рис. 3.18, в) дан результат медианной фильтрации этого искаженного изоб-
изображения при выполнении команды
gm = medfilt2(fn) ;
Рис. 3.18. Медианная фильтрация, а) Рентгеновский снимок, б) Изображение, испор-
испорченное шумом «соль и перец», в) Результат медианной фильтрации функцией
medf ilt 2 с опциями, принятыми по умолчанию, г) Результат медианной филь-
фильтрации с опцией расширения границ 'symmetric'. Обратите внимание на раз-
различие поведения границ изображений в) и г)
Выводы
При рассмотренном уровне шумов на рис. 3.18, б) медианный фильтр дает
хорошие результаты при использовании его настроек по умолчанию. Обратите,
однако, внимание на черные пятнышки на границах отфильтрованного изобра-
изображения. Это произошло из-за расширения границ изображения черными пиксе-
пикселами (напомним, что по умолчанию изображение продолжается нулевыми, т. е.
черными пикселами). Такого рода артефакты часто можно избежать, используя
опцию 'symmetric':
>> gms = medfilt2(fn, 'symmetric');
Результат, изображенный на рис. 3.18, г), похож на рис. 3.18, в), но эффект
почернения границ на нем не проявляется. ?
Выводы
В этой главе, помимо обсуждения методов улучшения изображения, были зало-
заложены основы многих концепций, которые будут изучаться в следующих главах.
Например, пространственная фильтрация снова встретится в гл. 5 в связи с по-
поворотами изображений, где мы еще раз подробно рассмотрим задачу удаления
шумов и приведем функции MATLAB, моделирующие различные шумы. Некото-
Некоторые пространственные маски лишь вскользь упоминались в этой главе, и они еще
будут подробным образом изучаться в гл. 10 при обнаружении границ в задачах
сегментации изображений. Концепции свертки и корреляции будут рассматри-
рассматриваться вновь в гл. 4 применительно к частотной области. Базовые идеи обработ-
обработки маской при использовании различных методов пространственной фильтрации
будут часто встречаться в дальнейшем. По ходу изложения нового материала бу-
будет продолжено обсуждение вопросов эффективной реализации пространствен-
пространственной фильтрации в среде MATLAB.
ГЛАВА 4
ОБРАБОТКА
В ЧАСТОТНОЙ
ОБЛАСТИ
Введение
Материал этой главы во многом параллелен обсуждавшимся в гл. 3 методам
фильтрации, однако здесь фильтрация будет производиться в частотной обла-
области после выполнения преобразования Фурье. Находясь в основе методов ли-
линейной фильтрации, преобразование Фурье обеспечивает значительную гибкость
при разработке и реализации алгоритмов фильтрации при решении задач улуч-
улучшения, восстановления и сжатия изображений. Преобразование Фурье также ле-
лежит в фундаменте великого множества других важный практических приложе-
приложений. В этой главе внимание сфокусировано на основах фильтрации в частотной
области, реализуемой средствами MATLAB. Как и в гл. 3, мы проиллюстриру-
проиллюстрируем фильтрацию в частотной области примерами по улучшению изображений,
включая фильтры низких частот, базовую фильтрацию высоких частот, а также
фильтрацию с усилением высоких частот. Мы коротко остановимся на том, как
частотная и пространственная фильтрации, выполненные одновременно, могут
дать хорошие результаты, недоступные при использовании только одного типа
фильтрации. Концепции и методы, развиваемые в следующих параграфах, явля-
являются достаточно общими, поэтому они будут часто иллюстрироваться в других
приложениях, которым посвящены гл. 5, 8 и 11.
4.1. Двумерное дискретное преобразование Фурье
Пусть f(x, у), при х = 0,1,2,..., М — 1 и у = О,1,2,..., TV — 1, обозначает изобра-
изображение MxN. Двумерное дискретное преобразование Фурье (DFT, Desrete Fourier
Transform) изображения /, которое обозначается F(u,v), задается уравнениями
М-1 N-1
F(U,V)= ? J2 f(x^y)e-J2n(ux/M+vy/N)
х=0 у=0
при и = О,1, 2,..., М — 1 и v = 0,1,2,..., N — 1. Мы могли бы разложить экспо-
экспоненту на синусы и косинусы от переменных unv с соответствующими частотами
(переменные х и у уйдут после суммирования). Частотной областью называ-
называется координатная система, задающая аргументы F(u,v) частотными перемен-
переменными и и v. Здесь можно обнаружить аналогию с заданием аргументов /(ж, у)
пространственными переменными х иу. Прямоугольную область размера MxN',
4-1. Двумерное дискретное преобразование Фурье
задаваемую при и = О,1, 2,..., М — 1 и v = О,1, 2,..., 7V — 1, принято называть
частотным прямоугольником. Видно, что частотный прямоугольник имеет те
же размеры, что и исходное изображение.
Обратное дискретное преобразование Фурье задается уравнениями
M-liV-l
и=0 v=0
при х = 0,1, 2,..., М — 1 и у = 0,1, 2,..., N — 1. Таким образом, зная F(u, v),
можно восстановить f(x,y) с помощью обратного DFT. Величины F(u,v) в этих
уравнениях принято называть коэффициентами разложения Фурье.
В некоторых определениях коэффициент 1/MN помещается в прямое преоб-
преобразование, а в других — в обратное. Для совместимости с реализацией преобра-
преобразования Фурье в системе MATLAB мы будем считать, что коэффициент 1/MN
расположен в формулах обратного преобразования, как это приведено выше. По-
Поскольку индексы массивов в MATLAB начинаются с 1, а не с 0, в MATLAB фор-
формулы F(l, 1) и f A, 1) соответствуют математическим величинам F@,0) и /@,0),
которые стоят в прямом и обратном преобразованиях.
Значение преобразования Фурье в начале координат частотной области (т. е.
величина F@,0)) называется коэффициентом или компонентой dc преобразо-
преобразования Фурье. Эта терминология пришла из электротехники, где «dc» означает
«direct current», постоянный электрический ток (ток с нулевой частотой). Лег-
Легко показать, что величина F@,0) равна числу MN, умноженному на среднее
значение функции /(х,у).
Даже если изображение f(x,y) вещественно, его преобразование Фурье яв-
является, как правило, комплексным. Основной метод визуального анализа этого
преобразования заключается в вычислении его спектра (т. е. абсолютной вели-
величины F(u,v)) и его отображения на дисплее. Пусть R(u,v) и I(u,v) обозначают
вещественную и мнимую компоненты F(u,v), тогда спектр Фурье задается вы-
выражением
\F(u,v)\ = [R2(u,v) + I2(u,v)}1/2.
Фазовый угол (угол сдвига фазы) преобразования задается формулой
0M = arctg[ife^]-
Введенные выше функции можно использовать для представления F(u, v) в стан-
стандартных полярных координатах разложения комплексных величин
F(u,v) = \F(u,v)\ej<i){u>v).
Энергетический спектр (или спектральная функция) равен квадрату модуля
P{u,v) = \F(u,v)\2 = R2{u,v) + I2{u,v).
С точки зрения визуализации не принципиально, какую функцию отображать на
экране, \F(u,v)\ или P(u,v).
Глава 4- Обработка в частотной области
Если f(x,y) вещественно, то его преобразование Фурье является сопряженно
симметричным относительно начала координат, т. е.
что означает симметрию спектра Фурье относительно начала координат:
\F(u,v)\ = \F(-u,-v)\.
Сделав прямую подстановку в уравнения для F(u,v), можно показать, что
F{u, v) = F(u + M,v) = F(u, v + N) = F(u + M, v + АО-
Другими словами, функция DFT является периодической по обеим переменным
и и v, периоды которой равны М и N соответственно. Обратное преобразование
Фурье также имеет свойство периодичности:
/(х, у) = f{x + М,у) = /(*, у + N) = f{x + М, у + N).
Это свойство часто приводит к затруднениям, так как интуитивно не очевидно,
что взятие обратного преобразования Фурье приводит к периодической функции.
Стоит помнить, что это обстоятельство просто является математическим свой-
свойством прямого и обратного DFT. Заметьте также, что в конкретных реализациях
вычисляется только один период DFT, поэтому мы будем работать с массивами
размера MxN.
F(u)
р—
Г
б)
М/2 О М/2
Один период
(М точек)
F(u)
М/2
М
Один период
(М точек)
-М -\
Рис. 4.1. а) Спектр Фурье
показан составлением рядом
двух полупериодов а интер-
интервале [О, М — 1]. б) Переме-
Перемещение центра спектра в том
же интервале, которое дости-
достигается умножением f(x) на
(—1)х до взятия преобразова-
преобразования Фурье
Свойство периодичности весьма важно при изучении того, как данные DFT
связаны с периодами преобразования. Например, на рис. 4.1, а) показан спектр
F(u) одномерного преобразования Фурье. В этом случае свойство периодичности
выражается формулой F(u) = F(u + M), откуда следует, что |-F(n)| = |F(
4-1. Двумерное дискретное преобразование Фурье
а из свойства симметрии заключаем, что F(u) = F(—u). Свойство периодичности
указывает на то, что F(u) имеет период М, а свойство симметрии означает сим-
симметрию функции относительно начала координат, как показано на рис. 4.1, а).
Этот график, а также предыдущие комментарии показывают, что модули вели-
величин преобразования от М/2 до М — 1 являются повтором величин из первой
половины слева от начала координат. Поскольку в одномерном DFT необходимо
вычислять М точек (т. е. для величин и из интервала [О, М—1]), то достаточно вы-
вычислить преобразование для первой половины точек. Нам нужен один, правильно
упорядоченный период на интервале [О, М — 1]. Нетрудно показать (см. [Gonzalez,
Woods, 2002]), что нужный период получается умножением f(x) на (—1)х до вы-
вычисления преобразования. На самом деле, все это означает перемещение начала
координат преобразования в точку и = М/2, как показано на рис. 4.1, б). Те-
Теперь величина спектра при и = 0 на рис. 4.1, б) соответствует |F(—М/2)| на
рис. 4.1, а). Аналогично, величины \F(M/2)\ и \F(M —1)| на рис. 4.1, б) соответ-
соответствуют величинам |F@)| и \F(M/2 — 1)|.
Похожая ситуация наблюдается для двумерных функций. Вычисление дву-
двумерного DFT дает точки преобразования в прямоугольной области, показанной
на рис. 4.2, а), где затененная область показывает величины F(u,v), которые
вычисляются по формулам, указанным в начале этого параграфа. Пунктирные
прямоугольники получаются периодическим повторением, как на рис. 4.1, а). За-
Затененная область показывает, что величины F(u,v) распадаются на 4 периодиче-
периодических квадранта, которые соприкасаются в точке, указанной на рис. 4.2, а). Визу-
Визуальный анализ спектра упрощается, если переместить начало координат преоб-
преобразования в центр спектрального прямоугольника. Это можно сделать, умножив
f(x.y) на (—\)х+у до вычисления преобразования Фурье. Тогда периоды выстра-
выстраиваются так, как показано на рис. 4.2, б)). Как и при обсуждении одномерных
функций, значение спектра в точке (М/2, N/2) на рис. 4.2, б) совпадает со значе-
значением в @,0) на рис. 4.2, а), а значение в @,0) на рис. 4.2, б) совпадает со значе-
значением в (—М/2, — N/2) на рис. 4.2, а). Аналогично, значение в точке (М — 1, N — 1)
на рис. 4.2, б) равно значению в (М/2 — 1, N/2 — 1) на рис. 4.2, а).
Рис. 4.2. а) Спектр Фурье разме- а)
pa MxN (затененная область); по- |
казан составлением 4 квадрантов. •
б) Спектр, полученный умножением ! о
f{x,y) на (—1)х+у до взятия преоб- |д//2-1
разования Фурье. Показан один пе- .] Ц\
риод (затененный), поскольку толь- I
ко его необходимо вычислить по фор- ¦ М — 1
муле ! "^
б)
.Л//2-11 N-\
10 \! . .. \
| N12 N-\\
lo \ \_
й точке1
м-
• В этой'
I соседствуют!
все четыре периода
[^ "• Периоды двумерного DFT
Р] Массив данных Мх N, который
получается при вычислении F(u, v)
Приведенные выше рассуждения о центрировании преобразования с помо-
помощью умножения f(x,y) на ( — \)х+у представляют важную концепцию, которая
Глава 4- Обработка в частотной области
здесь приводится для полноты изложения. Однако при работе с MATLAB под-
подход заключается в вычислении преобразования без умножения на (—1)х+у, после
чего данные передвигаются с помощью функции fftshift. Эта функция и ее
применение обсуждаются в следующем параграфе.
4.2. Вычисление и визуализация двумерного DFT в
MATLAB
Прямое и обратное DFT на практике вычисляются с помощью алгоритма быст-
быстрого преобразования Фурье (FFT, Fast Fourier Transform). Алгоритм FFT мас-
массива f изображения MxN реализован в пакете функцией fft2, которая имеет
следующий синтаксис:
F = fft2(f).
Эта функция возвращает преобразование Фурье размера MxN, причем данные
организованы в форме, представленной на рис. 4.2, а), т.е. начало данных нахо-
находится в верхнем левом угле, где имеется четыре четверть-периода (квадранта),
которые примыкают к центральной точке частотной области.
Как объясняется в § 4.3.1, необходимо дополнять входное изображение ну-
нулями при использовании преобразования Фурье в фильтрации. В этом случае
синтаксис имеет вид
F = fft2(f, P, Q).
В этом случае функция f f t2 дополняет входное изображение нужным количе-
количеством нулей, и результат ее выполнения имеет размер PxQ.
Для получения спектра Фурье следует применить команду
S = abs(F),
которая вычисляет абсолютную величину (корень квадратный из суммы квадра-
квадратов вещественной и мнимой частей) каждого элемента массива.
Визуальный анализ спектра при отображении его в виде изображения яв-
является важным инструментом при работе в частотной области. В качестве ил-
иллюстрации рассмотрим простое изображение f на рис. 4.3, а). Мы вычисляем
преобразование Фурье и отображаем его спектр с помощью следующей последо-
последовательности шагов:
>> F = fft2(f);
>> S = abs(F) ;
imshow(S, [ ]);
На рис. 4.3, б) приведен результат этих действий. Четыре яркие точки по углам
изображения появляются в силу свойства периодичности, объясненного в преды-
предыдущем параграфе.
Функцию fftshift пакета можно использовать для смещения начала коор-
координат преобразования в центр частотной области. Ее синтаксис имеет вид
Fc = fftshift(F) ,
4.2. Вычисление и визуализация двумерного DFT в МАТЬ А В
где F — это преобразование, вычисленное с помощью f f t2, a Fc — отцентрован-
отцентрованное преобразование. Функция f f tshif t переставляет квадранты F надлежащим
способом. Например, если а = [12; 3 4], то f ftshif t (a) = [4 3; 2 1] . Если
применять это действие после вычисления преобразования Фурье, то результат
будет в точности совпадать с умножением изображения на (—\)х+у перед выпол-
выполнением преобразования. Заметим, однако, что эти два процесса нельзя переста-
переставить, т.е., если обозначить оператор преобразования фурье через $[•], который
применяется к аргументу, то выражение Щ(—1)х+у/(х, у)} эквивалентно вычисле-
вычислению f f tshif t (f ft2(f)), но действие f ft2(f f tshif t(f)) приведет к совершенно
иному результату.
В предыдущем примере, набрав команды
>> Fc = fftshift(F) ;
>> imshow(abs(Fc) , []);
получим рис. 4.3, в). Результат, очевидно, отвечает центрированию этого изоб-
изображения.
Рис. 4.3. а) Простое изоб-
изображение, б) Спектр Фурье.
в) Центрированный спектр.
г) Спектр, улучшенный функ-
функцией log для ббльшей нагляд-
Хотя сдвиг спектра был сделан корректно, динамический диапазон его значе-
значений весьма широк (от 0 до 204000) по сравнению с 8 битами дисплея, на котором
доминируют яркие значения в центре. Как уже обсуждалось в § 3.2.2, эту проб-
проблему можно разрешить с помощью преобразования log, выполнив команды
>> S2 = log(l + abs(Fc));
>> imshow(S2, [ ]) ;
Глава 4- Обработка в частотной области
результат которых приведен на рис. 4.3, г). На этом изображении хорошо замет-
заметно визуальное улучшение отдельных деталей.
Функция if f tshif t обращает центрирование спектра. Ее синтаксис имеет вид
F = if f tshif t(Fc).
Эту функцию можно использовать для приведения спектра к его первоначально-
первоначальному виду, т. е. когда центр спектра расположен в верхнем левом углу прямоуголь-
прямоугольника. Это свойство будет использоваться в § 4.4.
Обратите внимание на то, что центр частотного прямоугольника находится в
точке (M/2,iV/2), когда координаты и и v пробегают интервал от 0 до М — 1 и
до N — 1 соответственно. Например, центр частотного квадрата 8x8 находится
в точке D,4), т.е. в пятой точке по каждой оси, если считать от точки @,0).
Если, как в системе MATLAB, эти переменные меняются от 1 до М и от 1 до
N соответственно, то центр квадрата имеет координаты [(М/2) + 1, (N/2) + 1].
В нашем примере с квадратом 8x8 цент находится в точке E,5), если считать
от A,1). Ясно, что эти два центра отвечают одной и той же точке, однако это
место может быть источником ошибок и разночтений при нахождении координат
центров DFT при вычислениях на MATLAB.
Если М и N — нечетные числа, то центр при вычислениях в MATLAB опре-
определяется округлением М/2 и N/2 в сторону уменьшения до ближайшего целого.
Дальнейший анализ делается как в предыдущем абзаце. Например, центр обла-
области 7x7 находится в точке C,3), если считать от @,0), и он имеет координаты
D,4), если начало есть A,1). В обоих случаях центр расположен в четвертой точ-
точке от начала отсчета. Если только одна из размерностей нечетна, то координаты
центра по этому направлению вычисляются округлением, как описано выше. Ис-
Используя функцию floor1 из MATLAB и помня, что начало отсчета находится в
точке A,1), центр частотного прямоугольника вычисляется по формуле
[floor(М/2) +1, floor(N/2) + 1],
которая дает правильный результат и для четных, и для нечетных величин М и N.
Наконец, укажем, что обратное преобразование Фурье вычисляется с помо-
помощью функции if ft 2, синтаксис которой имеет вид
f = ifft2(F),
где F — это преобразование Фурье, a f — соответствующее изображение. Если
исходное изображение, использованное при вычислении F, было вещественным,
то и обратное преобразование, в теории, должно быть вещественным. Однако на
практике выход if ft2 часто имеет очень малую мнимую компоненту, которая
получается из-за ошибок округления при выполнении арифметических действий
с плавающей запятой. Поэтому хорошим практическим советом является выде-
выделение вещественной части после выполнения обратного преобразования Фурье,
1 Команда В = floor (А) округляет каждый элемент массива А до ближайшего целого числа, не
превосходящего его по значению. Функция ceil округляет до ближайшего целого, большего
или равного заданному числу.
4-3. Фильтрация в частотной области
чтобы изображение имело вещественные пикселы. Эти два действия можно вы-
выполнить в одной команде2:
» f = real(ifft2(f));
Как и в случае прямого преобразования, эта функция имеет альтернативную
форму if ft2(f , P, Q), когда F расширяется нулями до размера PxQ до совер-
совершения преобразования. Эта опция не будет использоваться в нашей книге.
4.3. Фильтрация в частотной области
Фильтрация в частотной области имеет весьма простую концепцию. В этом пара-
параграфе будет сделан краткий обзор понятий, связанных с фильтрацией, а также
будут приведены некоторые ее реализации на MATLAB.
4.3.1. Базовые концепции
Основой линейной фильтрации в частотной и пространственной области служит
теорема о свертке, которую можно сформулировать так3:
/(х, у) * h(x, у) <^> Н(щ v)F(u, v),
и в обратную сторону
/О, y)h(x, у) Ф=Ф Н(и, v) * F(u, v).
Здесь символ «*» обозначает операцию свертки двух функций, а выражения по
обе стороны от двойных стрелок определяют соответствующие пары при преоб-
преобразовании Фурье. Например, первое выражение означает, что свертку двух про-
пространственных функций можно получить, если вычислить обратное преобразова-
преобразование Фурье от произведения прямых преобразований Фурье этих двух функций.
Наоборот, прямое преобразование Фурье свертки двух пространственных функ-
функций дает произведение их прямых преобразований Фурье. Аналогичным образом
можно прокомментировать и второе утверждение.
Применительно к фильтрации нас интересует первое из приведенных выше
выражений. Фильтрация в пространственной области состоит из свертки изобра-
изображения f(x,y) и маски h(x,y). Линейная пространственная свертка объяснялась
в § 3.4.1. В соответствии с теоремой о свертке, тот же результат можно полу-
получить в частотной области, умножив F(u,v) на H(u,v) — преобразование Фурье
пространственного фильтра. Принято называть H(u,v) передаточной функцией
фильтра.
На самом деле, основная идея фильтрации в частотной области заключается
в подборе передаточной функции фильтра, которая модифицирует F(u,v) специ-
специфическим образом. Например, фильтр на рис. 4.4, а) имеет передаточную функ-
2Функции real(arg) и image (arg) извлекают, соответственно, вещественную и мнимую части
arg.
3Для цифровых изображений эти выражения выполняются строго, только когда функции
f(x,y) и h(x,y) продолжены нулями правильным образом, что обсуждается позже.
Глава 4- Обработка в частотной области
цию, которая, будучи умноженной на центрированную функцию F(u, v), ослабля-
ослабляет высокочастотные компоненты F(u,v) и оставляет низкочастотные компонен-
компоненты относительно неизменными. Фильтр с такими характеристиками называется
низкочастотным. В § 4.5.2 показывается, что результатом низкочастотной филь-
фильтрации является размытие (сглаживание) изображения. На рис. 4.4, б) приведен
тот же фильтр после его сдвига функцией fftshift. Такой формат фильтров
особенно часто используется в этой книге при фильтрации в частотной области,
когда преобразования Фурье не центруются.
Основываясь на теореме о свертке, мы знаем, что для получения соответству-
соответствующего отфильтрованного изображения в пространственной области нам следует
просто вычислить обратное преобразование Фурье от произведения ff (u, v)F(u, v).
Еще раз обращаем ваше внимание на то, что результат этих действий будет
идентичен выполнению операции свертки в пространственной области с маской
/i(x, у), которая есть обратное преобразование Фурье от Н(и, v). На практике про-
пространственная фильтрация сильно упрощается при использовании малых масок,
которые стремятся поймать выраженные характеристики их частотных двойников.
Рис. 4.4. Передаточные функ-
функции а) центрированного низко-
низкочастотного фильтра; б) в фор-
формате, используемом при филь-
фильтрации в DFT. Напомним, что
здесь изображены фильтры в
частотной области
Как отмечалось в § 4.1, изображения и их преобразования автоматически счи-
считаются периодическими, если фильтрация реализована на основе DFT. Нетрудно
дать визуальные примеры свертки периодических функций, для которых возни-
возникают эффекты интерференции между смежными периодами, если эти периоды
близко относительно длины ненулевых частей функций. Эту интерференцию,
которую принято называть ошибкой возврата или ошибкой перекрытия, можно
подавить, дополняя функции нулями следующим образом.
Предположим, что функции /(х,у) и h{x,y) имеют размеры Ах В и CxD
соответственно. Мы формируем две расширенные функции, обе имеющие разме-
размеры PxQ, путем добавления нулей к / и д. Можно показать, что ошибка пере-
перекрытия не происходит, если выбрать
Р>А+С+1 и Q>B + D + l.
В этой книге в основном рассматриваются функции одинаковых размеров MxN.
В этом случае сформулированное правило имеет следующий вид: Р > 2М — 1 и
Q> 2AT-1.
Следующая функция, называемая paddedsize, вычисляет минимальные чет-
четные4 значения для Р и Q, которые удовлетворяют этим условиям. Имеется также
4 Принято работать с массивами четных размерностей для ускорения вычисления FFT.
4-3. Фильтрация в частотной области
опция, позволяющая дополнять входные данные до квадрата, длина стороны ко-
которого равна ближайшей степени числа 2. Время выполнения алгоритма FFT за-
зависит, грубо говоря, от числа простых делителей Р и Q. Этот алгоритм работает
быстрее, когда Р и Q являются степенями двойки, чем когда Р и Q — простые
числа. Кроме того, на практике можно посоветовать работать с квадратными
изображениями и фильтрами, т. е. чтобы фильтрация имела одинаковые разме-
размеры по обоим измерениям. Функция paddedsize позволяет делать такой выбор
достаточно гибко, исходя из входных параметров.
В функции paddedsize векторы АВ, CD и PQ имеют элементы [А В], [С D] и
[Р Q] соответственно (все эти числа были определены вышеM.
function PQ = paddedsize(АВ, CD, PARAM)
'/ePADDEDSIZE Computes padded sizes useful for FFT-based filtering.
°/e PQ = PADDEDSIZE(AB), where AB is a two-element size vector,
°/e computes the two-element size vector PQ = 2*AB.
V.
У. PQ = PADDEDSIZE (AB, 'PWR2') computes the vector PQ such that
У. PQA) = PQB) = 2~nextpow2B*m), where m is MAX(AB) .
У.
e/e PQ = PADDEDSIZE (AB, CD), where AB and CD are two-element size
e/o vectors, computes the two-element size vector PQ. The elements
e/o of PQ are the smallest even integers greater than or equal to
У. AB + CD 1.
У.
°/, PQ = PADDEDSIZE (AB, CD, 'PWR2') computes the vector PQ such that
7, PQA) = PQB) = 2~nextpow2B*m), where m is MAX([AB CD]).
if nargin == 1
PQ = 2*AB;
elseif nargin == 2 & ~ischar(CD)
PQ = AB + CD 1;
PQ = 2 * ceiKPQ / 2);
elseif nargin == 2
m = max(AB) ; °/e Maximum dimension.
e/e Find power-of-2 at least twice m.
P = 2~nextpow2B*m);
PQ = [P, P];
elseif nargin == 3
m = max([AB CD]); °/0 Maximum dimension.
P = 2~nextpow2B*m);
PQ = [P, P];
else
error('Wrong number of inputs.')
end
5 Функция p = nextpow2(n) возвращает наименьшую степень р числа 2, для которой 2Р не мень-
меньше абсолютной величины п.
Глава 4- Обработка в частотной области
Определив PQ с помощью функции paddedsize, вычислим быстрое преобра-
преобразование Фурье по формуле
F = fft2(f, PQA), PQB)).
При этом к изображению f добавляется достаточное количество нулей, чтобы по-
полученное изображение имело размеры PQ(l)xPQB), а затем вычисляется FFT.
Отметим, что при использовании расширения функция фильтра в частотной об-
области должна иметь размеры PQ(l)xPQB).
Пример 4.1. Эффекты фильтрации с использованием и без использования про-
процедуры расширения.
Изображение f, приведенное на рис. 4.5, а), иллюстрирует фильтрацию с расши-
расширением и без расширения. Здесь также используется функция lpf ilter, которая
строит гауссов низкочастотный фильтр (подобный фильтру на рис. 4.4, б)) с за-
заданным значением параметра сигма (sig). Эта функция и ее синтаксис будут
детально рассматриваться в § 4.5.2, но мы пока воспользуемся ею без пояснений.
Рис. 4.5. а) Простое изображение размера 256x256. б) Результат низкочастотной филь-
фильтрации без расширения, в) Результат низкочастотной фильтрации с расширени-
расширением. Сравните вертикальные границы ярких областей б) и в)
Следующие команды совершают фильтрацию без расширения:
>> [М, N] = size(f);
>> F = fft2(f);
>> sig = 10;
>> Н = lpfilter('gaussian', M, N, sig);
>> G = H.*F;
» g = real(ifftB(G));
>> imshow(g, [ ]);
На рис. 4.5, б) построено изображение g. Как и ожидалось, оно выглядит
размытым везде, кроме вертикальных границ. Объяснить это можно с помо-
помощью рис. 4.6, а), на котором графически изображено воображаемое периодиче-
периодическое повторение изображения при вычислении DFT. Тонкие белые линии между
изображениями проведены для удобства обзора. Они не являются частью дан-
данных. Пунктирные линии используются для обозначения (произвольного) NxN
4-3. Фильтрация в частотной области
изображения, обрабатываемого fft2. Представьте себе свертку фильтра сгла-
сглаживания с такой бесконечной периодической последовательностью. Очевидно,
что при прохождении фильтра сверху пунктирного изображения, он пересечет
верхнюю часть самого изображения, а также нижнюю часть периодической ком-
компоненты, находящейся выше этого изображения. Таким образом, когда черная
и белая области смешиваются в фильтре, результатом будет серый (размытый)
вид. Это в точности то, что показано в верхней части рис. 4.5, а). С другой сторо-
стороны, когда фильтр находится на границе яркой части пунктирного изображения,
ему встретятся идентичные области, поэтому там размытия результата не будет.
Объяснение других частей изображения на рис. 4.5, б) делается аналогично.
Рис. 4.6. а) Бесконечное пе- а) \
риодическое повторение изоб-
изображения на рис. 4.5, а). Пунк-
Пунктиром окружена область, к ко-
которой применяется f f t2. б) Та
же периодическая последова-
последовательность после расширения
нулями. Тонкие белые линии
построены для удобства, они • • ¦ ...
не являются частью данных
б)
Рассмотрим теперь фильтрацию с расширением:
>> PQ = paddedsize(size(f)) ;
>> Fp = fft2(f, PQA), PQB)); °/0 Compute the FFT with padding.
>> Hp = lpfilterOgaussian', PQA), PQB), 2*sig) ;
>> Gp = Hp.*Fp;
Глава 4- Обработка в частотной области
gp = real(ifftB(Gp));
>> gpc = gp(l:size(f ,1) , 1: size(f ,2) ) ;
>> imshow(g, [ ]);
В этом примере параметр сигма равен 2*sig, поскольку здесь размер фильтра в
два раза больше, чем у фильтра без расширения.
На рис. 4.7 показано полное расширенное и
отфильтрованное изображение gp. Окончатель-
Окончательный результат на рис. 4.5, в) был получен об-
обрезанием рис. 4.7 до исходных размеров (см.
предпоследнюю команду из приведенной вы-
выше последовательности). Этот результат можно
объяснить с помощью рис. 4.6, б), на котором
пунктиром выделено исходное изображение, про-
продолженное нулями, что делается до выполне-
выполнения команды fft2(f, PQA), PQB)). Перио-
Периодическая последовательность строится как и на
рис. 4.6, а). Теперь изображение на границах
имеет одинаковое черное окружение, поэтому
свертка сглаживающего фильтра с этой беско-
Рис. 4.7. Полное расширенное изоб- нечной последовательностью даст одинаковые
ражение после фильтрации Размер разМытия на границах всех светлых частей ис-
этого изображения равен 512x512
ходного изображения. Тождественный резуль-
результат получается при выполнении следующих ко-
команд пространственной фильтрации:
>> h = fspecial('gaussian', 15, 7);
>> gs = imf ilter (f, h) ;
Напомним, что такая форма вызова функции imf ilter расширяет по умолчанию
границы изображения нулями (см. § 3.4.1). ?
4.3.2. Основные шаги фильтрации в частотной области
Обсуждавшиеся в предыдущем параграфе действия можно формализовать в ви-
виде следующей пошаговой процедуры с использованием функций MATLAB. Че-
Через f обозначим исходное изображение, а через g — результат фильтрации. Пред-
Предполагается, что передаточная функция Н(и, v) имеет те же размеры, что и ис-
исходное изображение.
1. Получить параметры расширения с помощью paddedsize:
PQ = paddedsize(size(f));
2. Построить преобразование Фурье с расширением:
F = fft2(f, PQA), PQB));
3. Сгенерировать функцию фильтра Н размера PQ(l)xPQB) одним из опи-
описываемых далее методов. Фильтр должен иметь формат, показанный на
рис. 4.4, б). Если он был центрирован, до использования его в фильтрации
следует выполнить команду Н = fftshift(H).
4-3. Фильтрация в частотной области
4. Умножить преобразование Фурье на передаточную функцию фильтра:
G = H.*F;
5. Найти вещественную часть обратного преобразования Фурье от G:
g = real(ifft2(G));
6. Вырезать верхний левый прямоугольник исходных размеров:
g = g(l:size(f,1), l:size(f,2));
Эта процедура фильтрации схематически изображена на рис. 4.8. Предвари-
Предварительная стадия обработки может состоять из определения размеров изображения,
вычисления параметров расширения и генерации фильтра. Заключительная ста-
стадия обработки состоит в выделении вещественной части результата, обрезания
изображения до исходного размера и его конвертации в класс uint8 или uintl6
для сохранения на диске.
Преобразование
Фурье
Передаточная
функция
Щи, v)
Обратное
преобразование
Фурье
F(u, v)
Щи, v)F(u, v)
А*. У)
Входное
изображение
Рис. 4.8. Основные шаги фильтрации в частотной области
g(x, у)
Улучшенное
изображение
Передаточная функция фильтра Н(и, v) на рис. 4.8 умножается на веществен-
вещественную и мнимую части F(u, v). Если функция Н(и, v) была вещественной, то фазо-
фазовая часть произведения не меняется, что видно из фазового уравнения (см. § 4.1),
так как при умножении вещественной и мнимой части комплексного числа на од-
одно и то же вещественное число фазовый угол не меняется. Такие фильтры приня-
принято называть фильтрами с нулевым сдвигом фазы. В этой главе рассматриваются
только такие фильтры.
Из теории линейных систем хорошо известно, что при выполнении некоторых
слабых условий подача одиночного импульса в линейную систему полностью опи-
описывает характеристики этой системы. При работе с конечными линейными си-
системами, что имеет место в данной книге, отклик линейной системы, включая
отклик на одиночный импульс, также является конечным. Если линейная си-
система является пространственным фильтром, то молено полностью описать этот
фильтр, подавая на вход одиночный импульс и наблюдая соответствующий от-
отклик. Такие фильтры называются фильтрами с конечной импульсной характери-
характеристикой (FIR, Finite Impulse Response). Все пространственные фильтры в данной
книге имеют тип FIR.
Глава 4- Обработка в частотной области
4.3.3. М-функция для фильтрации в частотной области
Последовательность описанных выше шагов фильтрации используется в этой гла-
главе и в части следующей, поэтому удобно иметь М-функцию, аргументами которой
являются изображение и передаточная функция фильтра, которая выполняет все
необходимые процедуры фильтрации и возвращает отфильтрованное и обрезан-
обрезанное изображение. Следующая функция как раз совершает все эти действия.
function g = dftfilt(f, Н)
°/oDFTFILT Performs frequency domain filtering.
°/o G = DFTFILT(F, H) filters F in the frequency domain using the
°/o filter transfer function H. The output, G, is the filtered
% image, which has the same size as F. DFTFILT automatically pads
°/o F to be the same size as H. Function PADDEDSIZE can be used
°/0 to determine an appropriate size for H.
7.
% DFTFILT assumes that F is real and that H is a real, uncentered,
°/e circularly-symmetric filter function.
°/o Obtain the FFT of the padded input.
F = fft2(f, size(H, 1), size(H, 2));
% Perform filtering.
g = real(ifft2(H.*F));
°/o Crop to original size.
g = g(l:size(f, 1), l:size(f, 2));
Техника построения фильтров в частотной области обсуждается в следующих
трех параграфах.
4.4. Построение фильтров в частотной области по
пространственным фильтрам
В общем случае фильтрация в пространственной области является более эффек-
эффективной с вычислительной точки зрения, чем фильтрация в частотной области,
когда используются «малые» фильтры. Точное определение этой малости яв-
является весьма трудным вопросом, ответ на который зависит от таких факторов,
как тип компьютера и выбор алгоритма, а также от многих других параметров,
например, от размеров буферов. Важную роль играет то обстоятельство, насколь-
насколько удобно реализовано обращение с комплексными данными, а также множество
других факторов, которые выходят за рамки нашего обсуждения. Сравнение, вы-
выполненное в [Brigham, 1988], для одномерных функций показало, что фильтрация
с использованием алгоритма быстрого преобразования Фурье FFT выполняется
быстрее, чем пространственная реализация этого процесса, когда функция имеет
примерно 32 точки, т. е. их число невелико. Поэтому полезно знать, как конвер-
конвертировать пространственные фильтры в эквивалентную частотную форму, чтобы
иметь возможность сравнивать эти два подхода.
Самый очевидный метод построения частотного фильтра Н, отвечающего простран-
пространственному фильтру h, состоит в выполнении команды Н = f f t2 (h, PQ A), PQ B)),
4-4- Построение фильтров в частотной области по пространственным
где значения вектора PQ зависят от размеров изображения, которое будет филь-
фильтроваться (см. предыдущий параграф). Тем не менее, в этом параграфе мы будем
интересоваться следующими вопросами:
A) как преобразовать пространственный фильтр в частотный;
B) как сравнивать результаты, получаемые при пространственном фильтрова-
фильтровании функцией imf ilter, с результатами фильтрования в частотной области,
которые обсуждались выше.
Как объяснялось в § 3.4.1, раз функция imf ilter использует корреляцию и на-
начало координат фильтра расположено в его центре, то для достижения эквива-
эквивалентных результатов при обоих подходах необходимо выполнить определенную
предварительную обработку данных. В пакете имеется функция f reqz2, которая
в точности совершает эти действия, а выходом этой функции служит соответ-
соответствующий фильтр в частотной области.
Функция f reqz2 вычисляет частотный отклик фильтра FIR, а в этой книге
рассматриваются только такие фильтры. Тогда в результате получаем нужный
фильтр в частотной области. Интересующая нас команда выглядит следующим
образом:
Н = freqz2(h, R, С),
где h — это двумерный пространственный фильтр, а Н — соответствующий ему
двумерный фильтр в частотной области. Здесь R обозначает нужное нам число
строк, а С — нужное число столбцов фильтра Н. Обычно полагается, что R =
= PQA)hC = PQ B) (см. § 3.4.1). Если записать функцию freqz2 без обозначения
выходной переменной, то абсолютная величина Н будет изображена на рабочем
столе MATLAB в виде трехмерного аксонометрического графика. Использование
в приложениях функции f reqz2 легко понять, разобрав следующий пример.
Пример 4.2. Сравнение фильтрации в пространственной и частотной обла-
областях.
Рассмотрим изображение f размером 600x600 пикселов, приведенное на рис. 4.9, а).
Сейчас мы сгенерируем фильтр Н в частотной области, соответствующий про-
пространственному фильтру Собела, который улучшает вертикальные края изобра-
изображения (см. табл. 3.4). Затем мы сравним результаты фильтрации f в простран-
пространственной области с помощью маски Собела (используя imf ilter) с результата-
результатами, полученными при совершении эквивалентного процесса в частотной области.
На практике фильтрация с малыми фильтрами вроде маски Собела может быть
реализована непосредственно в пространственной области, как говорилось рань-
раньше. Однако мы выбрали этот фильтр в демонстративных целях, так как он имеет
простые коэффициенты, а результаты его фильтрации интуитивно ясны и легко
поддаются сравнению. С большими фильтрами можно обращаться аналогично.
На рис. 4.9, б) дан спектр Фурье f, полученный следующими командами:
» F = fft2(f);
>> S = fftshift(log(l + abs(F));
>> S = gscale(S) ;
>> imshow(S);
Глава 4- Обработка в частотной области
Рис. 4.9. а) Полутоновое изоб-
изображение, б) Его спектр Фурье
Теперь строим пространственный фильтр функцией f special:
h = fspecial('sobel');
h =
10-1
2 0-2
10-1.
Чтобы увидеть график соответствующего фильтра в частотной области, надо
набрать
>> freqz2(h)
а) Рис. 4.10. а) Абсолютное зна-
значение частотного фильтра, со-
соответствующего вертикальной
маске Собела. б) Тот лее
фильтр после преобразования
f ft shift. На рисунках в) и г)
эти же фильтры построены в
виде изображений
На рис. 4.10, а) приведен этот график с опущенными координатными осями (тех-
(техника построения трехмерных аксонометрических графиков обсуждается в § 4.5.3).
Сам фильтр строится командами
4-4- Построение фильтров в частотной области по пространственным
» PQ = paddedsize(size(f));
>> Н = freqz2(h, PQA), PQB));
>> HI = ifftshift(H);
где команда if f tshif t выполняется для перестановки данных так, чтобы начало
координат фильтра находилось в верхнем левом углу частотного прямоугольни-
прямоугольника. На рис. 4.10, б) дан график abs(Hl). На рис. 4.10, в) и г) показаны абсолют-
абсолютные значения Н и HI в виде полутоновых изображений, построенных командами
>> imshow(abs(H) , [ ])
>> figure, imshow(abs(Hl) , [ ])
Теперь строим отфильтрованное изображение. В пространственной области
используется команда1
>> gs = imfilter (double(f) , h) ;
которая продолжает изображение за его границы по умолчанию нулями. Изоб-
Изображение, отфильтрованное в частотной области, задается выражением
>> gf = dftfilt(f, HI) ;
На рис. 4.11, а) приведен результат команд
>> imshow(gs, [ ])
>> figure, imshow(gf, [ ])
Рис. 4.11. а) Результат филь-
фильтрации рис. 4.9, а) в простран-
пространственной области вертикаль-
вертикальной маской Собела. б) Резуль-
Результат фильтрации в частотной
области с помощью фильтра,
показанного на рис. 4.10, б).
На рисунках в) и г) приведены
абсолютные значения а) и б)
1 Здесь используется функция double, чтобы иметь на выходе imfilter изображение этого клас-
класса (см. § 3.4.1). Формат double понадобится в следующих вычислениях.
Глава 4- Обработка в частотной области
Серый фон на этом рисунке объясняется тем, что оба изображения gs и gf име-
имеют отрицательные значения, что приводит к изменению масштаба при выпол-
выполнении команды imshow. В §§ 6.6.1 и 10.1.3 маска Собела h будет использоваться
при решении задачи распознавания вертикальных краев изображения с помощью
абсолютной величины отклика этого фильтра. Поэтому имеет смысл построить
здесь абсолютные величины отфильтрованных выше изображений. Это сделано
на рис. 4.11, в) и г) посредством команд
>> figure, imshow(abs(gs) , [ ])
>> figure, imshow (abs (gf), [ ])
Края предметов можно выделить более отчетливо, если создать соответству-
соответствующие пороговые двоичные изображения:
>> figure, imshow(abs(gs) > 0.2*abs(max(gs(:))))
>> figure, imshow(abs(gf) > 0.2*abs(max(gf(:))))
где множитель 0.2 был выбран (достаточно произвольно) для того, чтобы выде-
выделить участки изображений, на которых уровни пикселов больше 20% от макси-
максимального значения изображений gs и gf. На рис. 4.12, а) и б) даны эти изобра-
изображения.
Рис. 4.12. Пороговая обра-
обработка рис. 4.11, в) и г), соот-
соответственно, для более четко-
четкого выделения вертикальных
краев предметов
Изображения, построенные методами фильтрации в пространственной и ча-
частотной областях, являются практически идентичными. Этот факт можно про-
проверить, вычислив их разность
d = abs(gs - gf)
и найдя максимальное и минимальное значения этой разности:
>> max(d(:))
ans =
5.4015е-012
ans =
0
4-5. Прямое построение фильтров в частотной области 141
Продемонстрированные подходы можно использовать при реализации любых
пространственных фильтров FIR произвольных размеров с помощью фильтров
в частотной области. ?
4.5. Прямое построение фильтров в частотной области
В этом параграфе будет показано, как можно строить фильтры непосредственно
в частотной области. Мы будем работать с циклически симметричными филь-
фильтрами, которые определяются как различные функции расстояния от начала ко-
координат преобразования. Разработанные в качестве примеров М-функции могут
служить основой для построения других похожих функций. Мы начнем с реа-
реализации нескольких известных (низкочастотных) фильтров. Затем мы покажем,
как с помощью дополнительных средств визуализации и построения графиков в
MATLAB можно удобно отображать эти фильтры на экране компьютера. В конце
параграфа будут кратко обсуждаться (высокочастные) фильтры, повышающие
резкость изображения.
4.5.1. Построение сеточных массивов
для использования в фильтрах
в частотной области
В следующих М-функциях важную роль играет процедура вычисления расстоя-
расстояния между любыми точками частотного прямоугольника. Поскольку в MATLAB
при выполнении FFT предполагается, что начало отсчета находится в верхнем ле-
левом углу частотного прямоугольника, вычисления расстояния ведутся от этой точки.
Для лучшей визуализации центр данных можно смещать функцией f f tshif t.
Следующая функция df tuv создает сеточный массив, который используется
при вычислении расстояний и при других подобных действиях. (См. разбор функ-
функции meshgrid в § 2.10.4). Сеточный массивы, которые строит функция meshgrid,
уже приспособлены для применения в fft2 и ifft2 без дополнительного пере-
переупорядочения1.
function [U, V] = dftuv(M, N)
7oDFTUV Computes meshgrid frequency matrices.
7o [U, V] = DFTUV(M, N) computes meshgrid frequency matrices U and
°/o V. U and V are useful for computing frequency-domain filter
°/o functions that can be used with DFTFILT. U and V are both
7e M-by-N.
°/o Set up range of variables.
u = 0:(M 1);
v = 0:(N 1);
°/o Compute the indices for use in meshgrid.
idx = find(u > M/2);
u(idx) = u(idx) M;
idy = find(v > N/2);
1 Функция find обсуждается в § 5.2.2.
Глава 4- Обработка в частотной области
v(idy) = v(idy) N;
°/о Compute the meshgrid arrays.
[V, U] = meshgrid(v, u);
Пример 4.З. Употребление функции dftuv.
В качестве иллюстрации рассмотрим следующие команды для вычисления квад-
квадрата расстояния от начала координат до всех точек частотного прямоугольника
размеров 8x5.
» [и
>> D
D =
0
1
4
9
16
9
4
1
, V]
= и.
1
2
5
10
17
10
5
2
=
~2
4
5
8
13
20
13
8
5
dftuv(8, 5);
+ V.
4
5
8
13
20
13
8
5
~2
1
2
5
10
17
10
5
2
Обратите внимание на то, что расстояние до левой верхней точки равно 0, а
наибольшее расстояние — до центра прямоугольника, что соответствует фор-
формату, который объяснялся на рис. 4.2, а). Чтобы найти расстояния от центра
прямоугольника до всех его точек, достаточно применить к массиву D функцию
fftshift:
>>
ans =
20
13
8
5
4
5
8
fftshift(D);
17
10
5
2
1
2
5
16
9
4
1
0
1
4
17
10
5
2
1
2
5
20
13
8
5
4
5
8
13 10 9 10 13
Расстояние до точки E, 3) равно нулю, и массив симметричен относительно этой
точки. ?
4.5.2. Низкочастотные фильтры
Идеальный низкочастотный фильтр (ILPF, Ideal Lowpass Filter) имеет переда-
передаточную функцию
H(uv)-l 1 *** D(u,v) ^ Do
4.5. Прямое построение фильтров в частотной области
где Do — это заданное неотрицательное число, a D{u,v) — расстояние от цен-
центра фильтра до точки (u,v). Геометрическое место точек (u,v), для которых
D(u,v) = Do, является окружностью. Помня о том, что фильтр Н умножается на
преобразование Фурье изображения, можно заключить, что идеальный фильтр
«срезает» (умножает на ноль) все компоненты F, лежащие вне этой окружности,
и оставляет неизменными (умножает на 1) все компоненты, находящиеся внутри
или на границе окружности. Несмотря на то, что этот фильтр невозможно реа-
реализовать на практике в аналоговой форме с помощью электронных компонент,
его, безусловно, можно смоделировать на компьютере с помощью заданной пере-
передаточной функции. Свойства идеального фильтра часто бывают полезными при
объяснении таких явлений, как ошибки перекрытия.
Низкочастотный фильтр Баттерворта (BLPF, Butterworth LowPass Filter)
порядка п с обрезанием частот на расстоянии Do от начала координат имеет
передаточную функцию
H(u,v) =
[D{u,v)/D0}2n'
В отличие от идеального низкочастотного фильтра, функция фильтра BLPF не
имеет разрыва в пороговой точке Do. Для фильтров с гладкой передаточной
функцией принято задавать частоту срезания, которая определяется положени-
положением точек, для которых функция H(u,v) меньше определенной доли ее макси-
максимального значения. В предыдущем уравнении значение H(u,v) = 0.5 (т.е., 50%
от максимального значения, которое равно 1), когда D(u,v) = Do-
Передаточная функция гауссова низкочастотного фильтра (GLPF, Gaussian
LowPass Filter) задается формулой
где о — это стандартное отклонение. Если положить а = Do, то получится сле-
следующее выражение в терминах срезающего параметра Do'.
При D(u,v) = Do значение фильтра в этих точках меньше, чем 0.607 от макси-
максимального значения, которое равно 1.
Пример 4.4. Низкочастотная фильтрация.
Для пояснения введенных понятий мы применим гауссов низкочастотный фильтр
к изображению f размера 500x500 пикселов, приведенному на рис. 4.13, а). Мы
взяли Do, равное 5% от ширины расширения изображения. Совершая шаги филь-
фильтрации, приведенные в § 4.3.2, имеем
>> PQ = paddedsize(size(f)) ;
» [U, V] = dftuv(PQU), PQB));
>> DO = 0.05*PQB);
» F = fft2(f, PQA), PQB));
>> H = exp(-(U.~2 + V.~2)/B*(D(T2)));
144 Глава 4- Обработка в частотной области
» g = dftfilt(f, Н);
Построенный фильтр можно «увидеть» [см. рис. 4.13, б)], выполнив команду
>> figure, imshow(fftshift(H) , [ ])
Рис. 4.13. Низкочастотная
фильтрация, а) Исходное изоб-
изображение, б) Гауссов низко-
низкочастотный фильтр в виде изоб-
изображения, в) Спектр а), г) Об-
Обработанное изображение
Аналогично, спектр Фурье можно отобразить на дисплее (см. рис. 4.13, в)), на-
набрав на клавиатуре
>> figure, imshow(log(l + abs(fftshift(F))), [ ])
Наконец, на рис. 4.13, г)) приведено изображение, полученное командой
>> figure, imshow(g, [ ])
Как и ожидалось, отфильтрованное изображение представляет собой размытый
образ исходного. ?
Следующая программа генерирует передаточную функции всех перечислен-
перечисленных выше низкочастотных фильтров.
function [H, D] = lpfilter(type, M, N, DO, n)
°/0LPFILTER Computes frequency domain lowpass filters.
% H = LPFILTER(TYPE, M, N, DO, n) creates the transfer function of a low-
°/0 pass filter, H, of the specified TYPE and size (M-by-N) . To view the
°/o filter as an image or mesh plot, it should be centered using
7, H = fftshift(H) .
4-5. Прямое построение фильтров в частотной области
°/о Valid values for TYPE, DO, and n are:
°/o
°/o 'ideal' Ideal lowpass filter with cutoff frequency DO. n need
°/0 not be supplied. DO must be positive.
7.
°/o 'btw' Butterworth lowpass filter of order n, and cutoff
°/0 DO. The default value for n is 1.0. DO must be
У, positive.
°/o
°/o 'gaussian' Gaussian lowpass filter with cutoff (standard
°/0 deviation) DO. n need not be supplied. DO must be
°/o positive.
У, Use function dftuv to set up the meshgrid arrays needed for
°/o computing the required distances.
[U, V] = dftuv(M, N);
°/o Compute the distances D(U, V) .
D = sqrt(U.~2 + V.~2);
°/o Begin filter computations.
switch type
case 'ideal'
H = double(D <= DO);
case 'btw'
if nargin == 4
n = 1;
end
H = l./(l + (D./D0).~B*n));
case 'gaussian'
H = exp((D.~2)./B*(D0~2)));
otherwise
error('Unknown filter type.')
end
Функция lpf ilter будет использоваться в § 4.6 как основа для построения
высокочастотных фильтров.
4.5.3. Построение графиков каркасных контуров и
поверхностей
Построение графиков функций одной переменной рассматривалось в § 3.3.1. В этом
параграфе мы обсудим методы построения трехмерных каркасных (сеточных)
контуров и поверхностей, которые могут быть полезными при визуализации пере-
передаточных функций двумерных изображений. Самый простой способ нарисовать
сеточный график данной двумерной функции Н состоит в применении функции
mesh, которая имеет базовый синтаксис
mesh(H).
Глава 4- Обработка в частотной области
Эта функция рисует каркасный контур для точек х = 1:Миу = 1: N, где [М, N] =
= size (H). Вид каркасного контура становится очень плотным и неудобным для
глаза, когда числа М и N — велики. В этом случае удобно строить только каждую
/с-ую точку по каждой оси с помощью команды
mesh(H(l:k:end, l:k:end)) .
Как правило, если использовать при построении каркасного контура от 40 до 60
точек по каждой оси, то результат будет вполне приемлемым компромиссом меж-
между разрешением и внешним видом изображения.
По умолчанию MATLAB строит сеточные графики в цвете. Команда
colormap([0 0 0])
устанавливает черную сетку (более подробно функция colormap будет рассмат-
рассматриваться в гл. 6). MATLAB также накладывает оси и линии координатной сетки
на сеточный график. Эти атрибуты отключаются командой
grid off
axis off .
Снова включить их можно соответствующей командой, в которой off замене-
заменено на on. Наконец, точка обзора (местоположение наблюдателя) контролируется
функцией view, которая имеет синтаксис
view(az, el) .
На рис. 4.14 показано, что az и el представляют собой, соответственно, азимут и
угол возвышения (измеренные в градусах). Стрелками обозначены положитель-
положительные направления. Значения по умолчанию: az = -37.5 и el = 30, которые поме-
помещают наблюдателя в квадрант, задаваемый полуосями — х и —у, откуда он смот-
смотрит на квадрант, определяемый положительными полуосями хиуна рис. 4.14.
Чтобы узнать текущее значение углов
обзора, следует набрать
>> [az, el] = view;
у Точка обзора . ^
/ ч& А чтобы присвоить этим параметрам зна-
значения по умолчанию, надо набрать
--<. . >> viewC)
I > i v >.! ! ^ х
. /HOJHhiMk'Hinij Точку обзора можно менять интерактивно,
, , "¦-¦¦¦ - если нажать мышью на кнопку Rotate 3D
в строке инструментов окна графиков, а за-
затем действовать мышью в окне графика.
В гл. 6 будет показано, как можно зада-
Рис. 4.14. Геометрия функции view вать точку обзора с помощью декартовых
координат, что весьма удобно при работе с
цветными данными в формате RGB. Однако при построении общих графиков
удобно использовать описанный выше метод, т. к. в нем используется всего два
параметра и он является более наглядным.
4.5. Прямое построение фильтров в частотной области
Пример 4.5. Построение сеточных графиков.
Рассмотрим гауссов низкочастотный фильтр из примера 4.4.
>> Н = fftshift(lpfilter('gaussian>, 500, 500, 50));
На рис. 4.15, а) показан сеточный (каркасный) график, построенный командами
>> mesh(H(l:10:500, 1:10:500))
>> axis([0 50 0 50 0 1])
Команда axis была описана в § 3.3.1 в двумерном случае. Здесь же обозначен
третий диапазон для координат по оси z.
б)
а)
0.8^
0.6^
0.4 >
0.2 v
0
•- • ^Ji
40'
30
20
10
0 0
20
30
40
в)
Рис. 4.15. а) График, построенный функцией mesh, б) Удалены оси и координатная сет-
сетка, г) Другая точка обзора, заданная функцией view, г) Третья точка обзора,
заданная той же функцией
Как уже ранее отмечалось, сеточный график по умолчанию рисуется в цвете,
причем цвета меняются от синего в основании до красного в вершине. Преобра-
Преобразуем цвет линий графика в черный и отменим нанесение осей и координатных
линий командами
>> colormap([0 0 0])
>> axis off
>> grid off
На рис. 4.15, б) дан результат. На рис. 4.15, в) приведен результат выполнения
команды
view(-25, 30)
Глава 4- Обработка в частотной области
которая смещает наблюдателя немного вправо, оставляя неизменным угол возвы-
возвышения. Наконец, на рис. 4.15, в) при сохранении азимута -25 выбираем нулевой
угол возвышения:
>> view(-25, 0)
Эти графики дают представление об удобных свойствах визуализации функции
mesh. ?
Иногда бывает желательно построить график двумерной функции в виде по-
поверхности, а не в виде сеточного контура. В этом поможет функция surf, имею-
имеющая следующий базовый синтаксис
surf(H) .
Эта функция строит трехмерный график подобно функции mesh, за тем исклю-
исключением, что четырехугольники сетки заливаются цветом (это называется фасе-
фасеточным тонированием). Для преобразования цветов в градацию серых тонов
используется команда
colormap(gray) .
Функции axis, grid и view дают те же эффекты, что и при обращении к
функции mesh. Например, на рис. 4.16, а) дан результат выполнения следующей
последовательности команд:
>> Н = fftshift(lpfilter(>gaussian>, 500, 500, 50);
>> surf (H(l :10:500, 1:10:500))
>> axis([0 50 0 50 0 1])
>> colormap(gray)
>> grid off; axis off
Рис. 4.16. а) График, построен-
построенный функцией surf, б) Резуль-
Результат выполнения команды shading
interp
Можно удалить линии сетки и сгладить фасеточное тонирование по методу
интерполяции командой
shading interp .
Вызов этой команды приводит к графику на рис. 4.16, б).
Если требуется построить некоторую функцию двух переменных, то исполь-
используется функция meshgrid для создания матрицы значений координат, с помощью
которой порождается соответствующая матрица отсчетов. Эта матрица подстав-
подставляется в функции mesh или surf. Например, пусть необходимо построить график
функции
22
4.6. Повышение резкости при частотной фильтрации
в интервале от —2 до 2 с шагом 0.1 по обоим аргументам х и у. Пишем
>> [Y, X] = meshgrid(-2:0.1:2, -2:0.1:2);
>> Z = X.*exp(-X.~2-Y.~2);
после чего применяем mesh(Z) или surf (Z), как описано выше. Напомним, что
в выходных параметрах функции meshgrid сначала следует обозначать столб-
столбцы (Y), а затем строки (X).
4.6. Повышение резкости при частотной фильтрации
В противоположность низкочастотной фильтрации, которая приводит к размы-
размытию изображений, высокочастотная фильтрация повышает резкость изобра-
изображения, ослабляя низкие частоты и оставляя высокие частоты преобразования
Фурье относительно неизменными. В этом параграфе будут рассмотрены неко-
некоторые подходы к высокочастотной фильтрации.
4.6.1. Основы высокочастотной фильтрации
Имея передаточную функцию H\p(u,v) низкочастотного фильтра, можно полу-
получить передаточную функцию соответствующего высокочастотного фильтра с по-
помощью формулы
#hpO, v) = 1- Щр(и, v).
Значит, функцию lpf ilter, разработанную в предыдущем параграфе, можно
использовать для построения генератора высокочастотных фильтров:
function Н = hpfilter(type, M, N, DO, n)
°/0HPFILTER Computes frequency domain highpass filters.
°/o H = HPFILTER(TYPE, M, N, DO, n) creates the transfer function of
7, a highpass filter, H, of the specified TYPE and size (M-by-N) .
°/o Valid values for TYPE, DO, and n are:
°/o
°/o 'ideal' Ideal highpass filter with cutoff frequency DO. n
°/o need not be supplied. DO must be positive.
°/o
7o 'btw' Butterworth highpass filter of order n, and cutoff
°/o DO. The default value for n is 1.0. DO must be
°/o positive.
7.
°/e 'gaussian' Gaussian highpass filter with cutoff (standard
7o deviation) DO. n need not be supplied. DO must be
7e positive.
°/e The transfer function Hhp of a highpass filter is 1 Hip,
7e where Hip is the transfer function of the corresponding lowpass
7o filter. Thus, we can use function lpf ilter to generate highpass
•/. filters.
if nargin == 4
150 Глава 4- Обработка в частотной области
п = 1; °/в Default value of n.
end
°/о Generate highpass filter.
Hip = lpfilter(type, M, N, DO, n);
H = 1 Hip;
Пример 4.6. Высокочастотные фильтры.
На рис. 4.17 приведены графики и изображения идеального высокочастотного
фильтра, а также фильтров Баттерворта и Гаусса высокой частоты. Рис. 4.17, а)
был построен с помощью команд
>> Н = fftshift(ppfilter('ideal', 500, 500, 50));
>> mesh(H(l:10:500, 1:10:500))
>> axis([0 50 0 50 0 1])
>> colormap([0 0 0])
>> grid off;
>> axis off
Соответствующее ему изображение на рис. 4.17, г) получено командой
>> figure, imshow(H, [ ])
На изображение наложено тонкое черное окаймление для уточнения его разме-
размеров. Аналогичные команды породили все остальные графики и изображения на
рис. 4.17 (фильтр Баттерворта находится в центре). ?
г)
•
д)
е)
Рис. 4.17. Верхний ряд — трехмерные графики высокочастотых фильтров: идеального,
Баттерворта и Гаусса
4.6. Повышение резкости при частотной фильтрации
Пример 4.7. Высокочастотная фильтрация.
На рис. 4.18, а) приведен тот же тестовый образец f, что и на рис. 4.13, а).
Рис. 4.18, б) получен с помощью следующих команд, результат которых демон-
демонстрирует применение высокочастотного гауссова фильтра к изображению f:
>> PQ = paddedsize(size(f)) ;
>> DO = 0.05*PQ(l);
>> H = hpfilter('gaussian\ PQA), PQB), DO);
>> g = dftfilt(f, H);
>> figure, imshow(g, [ ])
На рис. 4.18, б) заметно повышение четкости границ и усиление других конту-
контуров. Вместе с тем, поскольку средняя яркость изображения задается величиной
F@,0), а, как мы знаем, высокочастотная фильтрация гасит низкие частоты в
окрестности начала отсчета, то отфильтрованное изображение потеряло большую
часть фоновой тональности, имевшуюся на исходном изображении. Эта проблема
затрагивается в следующем параграфе. ?
Рис. 4.18. а) Исходное изоб-
изображение, б) Результат высоко-
высокочастотной фильтрации Гаусса
4.6.2. Фильтрация с усилением высоких частот
Как уже отмечалось в примере 4.7, высокочастотные фильтры отбрасывают ко-
коэффициент dc, в итоге среднее становится равным нулю. Чтобы компенсировать
этот недостаток, необходимо добавить некоторое смещение к высокочастотному
фильтру. Если смещение комбинируется вместе с умножением фильтра на ко-
коэффициент усиления, больший 1, то такая процедура называется фильтрацией
с усилением высоких частот. Поскольку этот коэффициент больше единицы, то
в результате происходит увеличение высоких частот. Конечно, амплитуда низ-
низких частот при этом тоже увеличивается, однако этот эффект меньше влияет
на низкие частоты, поскольку смещение мало по сравнению с коэффициентом
усиления. Высокочастотное усиление имеет передаточную функцию
Ные(щ v) =a + bHhp(u, v),
где а — это смещение, Ъ — коэффициент усиления, a H^^u^v) — передаточная
функция фильтра высоких частот.
Глава 4- Обработка в частотной области
Пример 4.8. Комбинированная фильтрация с усилением высоких частот и
гистограммная эквализация.
На рис. 4.19, а) представлен рентгеновский снимок грудной клетки f. Поскольку
рентгеновские лучи хуже поддаются фокусировке, как это делается со свето-
световыми лучами при помощи линз, рентгеновские снимки, как правило, выглядят
расплывчато. Цель этого примера заключается в повышении резкости данного
изображения. В этом конкретном примере яркость изображения сдвинута в тем-
темную область градационной шкалы, поэтому мы воспользуемся этим обстоятель-
обстоятельством для демонстрации пространственной обработки, которая удачно дополняет
фильтрацию в частотной области.
Рис. 4.19. Фильтрация с усилением высоких частот, а) Исходное изображение, б) Резуль-
Результат высокочастотной фильтрации, в) Результат повышения высоких частот.
г) Изображение в) после гистограммной эквализации. (Исходное изображе-
изображение предоставлено д-ром. Томасом Р. Гестом, отделение анатомии медицинской
школы университета шт. Мичиган)
На рис. 4.19, б) изображен результат фильтрации рис. 4.19, а) с использова-
использованием высокочастотного фильтра Баттерворта порядка 2 с частотой срезания Do,
равной 5% от вертикального размера расширенного изображения. Высокочастот-
Высокочастотная фильтрация не очень сильно зависит от параметра Do, поскольку радиус
фильтра не так мал, чтобы пропускать частоты, расположенные возле начала
отсчета. Как и ожидалось, результат фильтрации не очень выразителен, одна-
однако на нем слабо различимы основные контуры изображения. Рис. 4.19, в) де-
демонстрирует преимущество фильтрации с усилением высоких частот (в данном
случае, а — 0.5 и Ъ = 2.0), при котором сохранен общий яркостной тон исход-
исходного изображения. Следующая последовательность команд была использована
при построении изображений на рис. 4.19, где f обозначает входное изображение
[последняя команда строит рис. 4.19, г)\.
» PQ = paddedsize(size(f));
>> DO = 0.05*PQ(l);
Выводы
» HBW = hpfliterObtw', PQA), PQB), DO, 2);
>> H = 0.5 + 2*HBW;
>> gbw = dftfilt(f, HBW);
>> gbw = gscale(gbw);
>> ghf = dftfilt(f, H);
>> gbf = gscale(ghf);
>> ghe = histeq(ghf, 256);
Как отмечалось в § 3.3.2, изображение, характеризующееся узким диапазоном
яркости, является идеальным кандидатом для гистограммной эквализации. Из
рис. 4.19, г) видно, что этот метод действительно продолжает улучшать изоб-
изображение. Обратите внимание на четкое выявление структур костей и других
деталей, которых даже не видно на трех предыдущих изображениях. В послед-
последнем изображении можно обнаружить некоторое усиление шумов, но это явле-
явление весьма характерно для рентгеновских снимков при растяжении диапазона
их яркости. Результат, полученный при совместном использовании фильтрации
с усилением высоких частот и метода гистограммной эквализации, превосходит
любой результат, который можно было бы получить, применяя каждый из этих
методов по отдельности. ?
Выводы
Материалы этой и предыдущей главы были проиллюстрированы приложениями
по улучшению изображений. Однако разработанные при этом методы и концеп-
концепции можно с успехом применять и в других областях цифровой обработки изоб-
изображений, которые будут последовательно излагаться далее в этой книге. Преоб-
Преобразования яркости будут часто использоваться при растяжении и сжатии диа-
диапазонов яркости, пространственная фильтрация найдет применение в задачах
восстановления изображений в следующей гл. 5, а также при обработке цветных
изображений (гл. 6), при сегментации изображений (гл. 10) и при извлечении
дескрипторов изображений (гл. 11). Техника преобразования Фурье будет ин-
интенсивно применяться в следующей главе при изучении методов восстановления
изображений, в гл. 8 при сжатии изображений и в гл. 11 при описании изобра-
изображений.
ГЛАВА 5
ВОССТАНОВЛЕНИЕ
ИЗОБРАЖЕНИЙ
Введение
Задача восстановления изображения заключается в улучшении данного изобра-
изображения в некотором заранее оговоренном смысле. Несмотря на значительное пе-
пересечение областей применения этих двух методов обработки, улучшение изобра-
изображений является достаточно субъективным процессом, в то время как процедуры
восстановления изображений носят вполне объективный характер. Целью восста-
восстановления является реконструкция или воссоздание изображения, которое ранее
было искажено или испорчено в результате явлений, про которые имеется доста-
достаточно определенная априорная информация. Поэтому методы восстановления
изображения основаны на моделировании процессов искажения и применении
обратных процессов для воссоздания исходного изображения.
При таком подходе валено уметь правильно формулировать критерии каче-
качества, которые позволят оценить результат восстановления. А при решении задач
улучшения изображений используется иная методология, основанная на эври-
эвристических процедурах, визуальный результат которых зависит от особенностей
человеческого зрения. Например, усиление контраста можно рассматривать как
процедуру улучшения изображения, поскольку после ее применения изображение
становится более приятным для глаза, а обработку смазанных изображений с по-
помощью соответствующих обратных процедур следует отнести к арсеналу средств
по восстановлению изображений.
В этой главе будут исследоваться возможности системы MATLAB и средства
пакета IPT при моделировании ухудшающих воздействий на изображения и при
решении задач компенсации этих искажений. Как и в гл. 3 и 4, одни методы
восстановления удобно применять в пространственной области, а другие лучше
проявляют себя в частотной области.
5.1. Моделирование процесса
искажения/восстановления изображения
На рис. 5.1 процесс ухудшения изображения смоделирован в виде функции иска-
искажения, которая вместе с аддитивным шумом действует на исходное изображение
д(х,у) и порождает искаженное изображение д{х,у):
д(х,у) = H[f(x,y)]+rj{x,y).
5.1. Моделирование процесса искажения/'восстановления изображения
Имея функцию д(х,у), обладая некоторой информацией об искажающем опера-
операторе Н и зная основные характеристики аддитивного шума г){х,у), можно по-
построить некоторое приближение /(#, у) исходного изображения. Целью восста-
восстановления изображения является построение приближения /(ж,у), которое было
бы максимально близко к исходному изображению. При этом чем больше мы
знаем об операторе Н и шуме г}(х,у), тем точнее (в принципе) мы сможем при-
приблизить изображение f(x,y) функцией f(x,y).
, у)
Искажающий
оператор
Я
Искажение
Восстанавливающий
оператор
(фильтр)
Восстановление
Рис. 5.1. Моделирование процесса искажения/восстановления изображения
Если известно, что Н — линейный трансляционно-инвариантный оператор,
то можно показать математически, что искаженное изображение представимо в
пространственной области в следующем виде:
д(х, у) = h(x, у) * /О, у) + г](х, у),
где h(x,y) — это пространственное представление искажающего оператора, а сим-
символ «*»1 обозначает свертку, как и в гл. 4. Из материалов § 4.3.1 нам известно,
что свертка функций в пространственной области эквивалентна умножению в
частотной области преобразований Фурье этих функций, поэтому приведенное
выше уравнение модели искажения можно записать в эквивалентном представ-
представлении в частотной области:
G(u, v) = Н(щ v)F(u, v)
(u, v),
где заглавными буквами обозначены соответствующие преобразования Фурье
функций из уравнения свертки. Функцию Н(гл, v) часто называют оптической
передаточной функцией (OTF, Optical Transfer Function). Этот термин заим-
заимствован из анализа Фурье оптических систем. В пространственной области функ-
функция h(x,y) называется функцией разброса точек (PSF, Point Spread Function).
Этот термин возникает при действии функции h(x,y) на точки света для полу-
получения характеристик искажения разных типов входных данных. Функции h(x,y)
и H(u,v) переходят друг в друга под действием прямого и обратного преобразо-
преобразований Фурье, поэтому в пакете имеется две М-функции otf 2psf и psf 2otf для
этих действий.
1 Следуя общему соглашению, мы будем использовать символ «*» в строке уравнения для обо-
обозначения свертки, а помещение его в верхний индекс формулы будет обозначать комплексное
сопряжение. Кроме того, как это требует MATLAB, при написании программ звездочкой обо-
обозначается операция умножения. Поэтому следует быть внимательным, чтобы не перепутать эти
различные использования одного и того же символа.
Глава 5. Восстановление изображений
В силу того, что оператор линейного трансляционно-инвариантного искаже-
искажения Н можно смоделировать в виде свертки (конволюции), иногда этот процесс
искажения называют «конволюцией изображения с PSF или OTF». По аналогии,
обратный процесс восстановления называется деконволюцией.
В следующих трех параграфах предполагается, что Н — тождественный опе-
оператор, т. е. искажения вносятся исключительно шумом. Начиная с § 5.6, мы бу-
будем рассматривать модели, в которых искажения вносятся и оператором Н, и
шумом г].
5.2. Модели шума
Возможность смоделировать шум является ключевым моментом восстановления
изображений. В этом параграфе рассматриваются два типа моделей шумов: шум
в пространственной области (характеризующийся функцией плотности вероят-
вероятности) и шум в частотной области, который описывается разными характеристи-
характеристиками Фурье. За исключением § 5.2.3, везде в этой главе предполагается, что шум
не зависит от координат пиксела изображения.
5.2.1. Добавление шума функцией imnoise
В пакете имеется функция imnoise, которая моделирует искажение изображения
некоторым шумом. Синтаксис этой функции имеет вид
g = imnoise(f, type, parameters),
где f — это исходное изображение, а смысл аргументов type и parameters бу-
будет объяснен позже. Функция imnoise сначала преобразует изображение в класс
double в диапазоне [0,1]. Это следует иметь в виду перед заданием параметров
шума. Например, чтобы прибавить шум со средним 64 и дисперсией 400 к изоб-
изображению класса uint8, следует сжать среднее до величины 64/256, а дисперсию
приравнять 400/B56J, после чего эти параметры можно подставлять в функцию
imnoise. Рассмотрим различные синтаксические формы этой функции.
- g = imnoise (f, 'gaussian', m, var) добавляет к изображению f гауссов
шум со средним m и дисперсией var. По умолчанию, m = 0 и var = 0.01.
- g = imnoise (f, 'localvar', V) добавляет к изображению f локальный
гауссов шум с нулевым средним, дисперсия которого в каждой точке изоб-
изображения i задается матрицей V, размера как у i.
- g = imnoise (f, 'localvar5, image_intensity, var) добавляет к изобра-
изображению f гауссов шум с нулевым средним, в котором локальная дисперсия
шума var является функцией значений яркости изображения f. Аргумен-
Аргументы image.intensity и var являются векторами одинаковой размерности,
а функция plot (image.intensity, var) строит график зависимости дис-
дисперсии var от яркости image.intensity. Вектор image.intensity должен
содержать нормированные значения яркости в диапазоне [0,1].
- g = imnoise (f, 'salt & paper', d) портит изображение f шумом «соль и
перец», где d — это плотность шума (т. е. процент изображения, подвержен-
5.2. Модели шума
ного этому шуму). При этом приблизительно d*numel(f) пикселов будет
испорчено. По умолчанию, d = 0.05.
- g = imnoise(f, 'speckle', var) добавляет к f мультипликативный шум
по формуле g = f + n*f, где n - это равномерно распределенный шум с
нулевым средним и дисперсией var. По умолчанию, var = 0.04.
- g = imnoise(f, 'poisson') генерирует пуассоновский шум, зависящий от
исходных данных, вместо добавления искусственного шума. Чтобы согласо-
согласовываться со статистиками Пуассона, пикселы изображений uint8 и uintl6
должны соответствовать числу фотонов (или другим квантам информа-
информации). Используются изображения с двойной точностью, когда число фото-
фотонов на один пиксел больше, чем 65535 (но меньше 1012). Величины яркости
пикселов меняются в пределах от 0 до 1 и соответствуют числу фотонов,
деленному на 1012.
Несколько иллюстраций использования функции imnoise дается в следующем
параграфе.
5.2.2. Генерация случайного пространственного шума
с заданным распределением
Часто бывает необходимо сгенерировать шум, тип и параметры которого охва-
охватываются функцией imnoise. Значения пространственного шума являются слу-
случайными величинами, которые принято характеризовать функцией плотности
вероятности (PDF, Probability Density Function) или соответствующей функци-
функцией (кумулятивного) распределения (CDF, Cumulative Distribution Function). По-
Построение датчиков случайных чисел с интересующими нас распределениями де-
делается с помощью некоторых простых правил теории вероятностей.
Большинство генераторов случайных чисел основано на переформулирова-
переформулировании задачи в терминах случайных чисел с равномерной функцией распределе-
распределения в интервале [0,1]. В некоторых случаях таким базовым генератором может
служить генератор гауссовых случайных чисел с нулевым средним и единич-
единичной дисперсией. Хотя оба этих генератора можно получить из функции imnoise,
имеет смысл сделать это с помощью функции rand для равномерных случайных
чисел и функции randn для нормальных (гауссовых) случайных чисел, которые
реализованы в системе MATLAB. Эти функции будут описаны несколько позже
в этом параграфе.
Основой описываемого здесь подхода является классический результат тео-
теории вероятностей (см., например, [Peebles, 1993]), который утверждает, что если
имеется случайная величина w с равномерным распределением на отрезке [0,1],
то случайную величину z с заданной функцией распределения Fz, можно постро-
построить по формуле
Этот простой, но весьма полезный результат можно сформулировать в следую-
следующей эквивалентной форме: решить уравнение F(z) = w относительно z.
Глава 5. Восстановление изображений
Пример 5.1. Использование равномерно распределенных случайных чисел в ге-
генераторе случайных чисел с заданной функцией распределения.
Пусть имеется генератор случайных чисел w с равномерным распределением в
интервале @,1), и мы хотим построить случайную величину z с функцией рас-
распределения вероятностей Релея, которая имеет вид
1 — е~(*~°) 1Ъ при z ^ а,
0 при z < а.
Чтобы получить г, достаточно решить уравнение
! _ е-(*-аJ/Ь = w или z = а + ^b\n{l-w).
Поскольку квадратный корень — положительная функция, то генерируемые слу-
случайные величины будут всегда больше а, что требуется в определении функции
Релея. Значит, равномерно распределенные случайные числа могут служить осно-
основой для генератора релеевских случайных чисел с заданными параметрами а и Ь.
В MATLAB это результат легко обобщить, но массив случайных чисел R раз-
размеров М х N с помощью выражения
>> R = а + sqrt(b*log(l - rand(M, N));
где log — это натуральный логарифм (см. § 3.2.2), а функция rand генерирует
равномерно распределенные случайные числа в интервале @,1). Если положить
М = N = 1, то получится скалярная случайная величина с релеевским распреде-
распределением и с параметрами а и Ь. ?
Выражение вида z = а + >/61n(l — it;) иногда называют уравнением генера-
генератора случайных чисел, поскольку в нем определяется, как вычислять требуемые
случайные величины. В этом случае имеется простая формула для решения урав-
уравнения. Однако это не всегда возможно, и проблему можно сформулировать сле-
следующим образом: как получить уравнение генератора случайных чисел, выход
которого хорошо приближает случайную величину с заданной функцией плотно-
плотности вероятностей.
В табл. 5.1 перечислены полезные случайные величины в свете нашего обсуж-
обсуждения. Для некоторых из них удается выписать формулу решения для обратной
функции распределения, например, для экспоненциального распределения или
для функции распределения Релея. В этих случаях имеется простая формула
для выражения требуемых случайных чисел в терминах равномерных случай-
случайных чисел, как это проиллюстрировано в примере 5.1. В других случаях, как,
например, в случае гауссовой или логарифмически нормальной плотности, та-
такой простой формулы не существует. Тогда нужно искать альтернативный путь
для реализации требуемой случайной величины. Например, для случайной вели-
величины z с логарифмически нормальной плотностью можно воспользоваться тем
фактом, что величина In (г) имеет гауссово распределение, и выписать выраже-
выражение, приведенное в табл. 5.1, в терминах гауссовой случайной величины с нулевым
средним и единичной дисперсией. И в других случаях бывает полезно перефор-
переформулировать задачу для нахождения более легкого решения. Например, можно
Таблица 5.1. Генераторы случайных величин
Имя
Плотность
Среднее и дисперсия
Распределение
Генератор1
Равно-
Равномерная
Pz(z)=
_ ) Ь-а
а < z < Ъ
о,
<а
О, иначе
~" 2 ' а ~ 12
= < fff
6_а> "^*
О, z>b
rand (MATLAB)
Гауссова
; = a, a2 = b2
Fz(z)= f pz(v)dv
randn (MATLAB)
7
—oo < z < +oo
«Соль и
перец»
Pa, z = a
Pz(z)= \ Pbi z = b
0, иначе
m = aPa
a2 = (a - mJPa + (b - mJPb
rand (MATLAB)
Лога-
рифми-
рифмически
нормаль-
нормальная
Релея
Pz(z) =
z = a + v/*>ln[l- 1/@,1)]
§(z - а)
0,
z <a
0,
z<a
Экспо-
ненци-
ненциальная
P.{z) =
0,
2<0
Fz{z) =
z >0
2<0
: =-I In [1-1/@,1)]
Эрланга
= TOTT-e-^, 2 > 0
a '
z>0
En — эксп. величины
с параметром a.
1 Здесь iV@, 1) — нормальная (гауссова) случайная величина со средним ноль и дисперсией 1. С/@,1) — равномерная случайная величина из
интервала @,1).
Глава 5. Восстановление изображений
показать, что случайные числа Эрланга с параметрами а и Ь можно построить,
складывая Ь независимых случайных величин с экспоненциальным распределе-
распределением, имеющих параметр а (см. [Leon-Garcia, 1994]).
Генераторы случайных чисел, реализованные в imnoise и перечисленные в
табл. 5.1., играют важную роль при моделировании поведения случайного шума
в приложениях обработки изображений. Мы уже видели пользу от использования
равномерного распределения при генерации случайных чисел с заданной функ-
функцией распределения. Гауссов шум используется в качестве естественного при-
приближения в тех случаях, когда сенсорные детекторы изображения работают на
пороге чувствительности. Шум типа «соль и перец» возникает в устройствах с
ошибочной коммутацией. Размеры зерен на фотоэмульсии являются случайными
величинами с логарифмически нормальным распределением. Шум Релея обра-
образуется при фиксации удаленных изображений, а экспоненциальный шум и шум
Эрланга используется при описании искажений на изображениях, полученных с
помощью лазерного излучения.
М-функция imnoise2, которая будет рассматриваться позже, генерирует слу-
случайные числа, которые имеют функцию распределения из списка в табл. 5.1.
Эта функция использует стандартную функцию rand, которая имеет следующий
синтаксис:
А = rand(M, N).
Эта функция генерирует массив размера MxN, элементами которого служат рав-
равномерно распределенные случайные величины в интервале @,1). Если аргумент
N отсутствует, то по умолчанию он приравнивается к М. Если опущены оба ар-
аргумента, то rand генерирует скалярную случайную величину, которая меняется
при каждом новом вызове функции rand. Аналогично, функция
А = randn(M, N)
строит массив размера MxN с независимыми гауссовыми (нормальными) случай-
случайными величинами с нулевым средним и единичной дисперсией. Если N отсут-
отсутствует, то по умолчанию N = М. Если аргументов нет, то генерируется скалярная
случайная величина.
Функция imnoise2 использует функцию find из MATLAB, которая имеет
следующую синтаксические формы:
I = find(A)
[г, с] = find (А)
[г, с, v] = find(А) .
В первом случае в I записывается индексы массива А, которые обозначают нену-
ненулевые элементы. Если таковые отсутствуют, то find возвращает пустую матрицу.
Вторая форма возвращает строку и столбец, состоящие из индексов элементов
матрицы А с ненулевым содержимым, а в третьей форме также возвращаются
ненулевые элементы А в виде отдельного вектор-столбца v.
В первой форме команды find матрица А трактуется в формате А(:), т.е.
I — это вектор-столбец. Такая форма очень удобна при обработке изображений.
5.2. Модели шума
Например, чтобы найти множество всех пикселов, меньших 128, и присвоить им
значение 0, достаточно выполнить команды
>> I = find (А < 128);
>> АЦ) = 0;
Напомним, что логическая формула А < 128 возвращает матрицу, в которой
1-цы стоят там, где логическое условие выполнено и 0 — там, где оно не выполне-
выполнено. Чтобы присвоить значение 128 всем пикселам, принадлежащих замкнутому
интервалу [64,192], можно записать
>> I = find (А >= 64 & А <= 192) ;
>> АA) = 128;
Первые две формы команды find будут часто использоваться в дальнейшем.
В отличие от imnoise, следующая М-функция imnoise2 порождает шумовую
матрицу R размера MxN, которая не нормируется. Другое значительное отли-
отличие от функции imnoise состоит в том, что выходом imnoise служит зашумлен-
ное изображение, a imnoise2 порождает только шумовую матрицу. Пользователь
должен сам задавать желаемые параметры шума. Заметьте, что шумовая матри-
матрица, генерируемая по методу «соль и перец», принимает три возможных значения:
0 — это «перец», 1 — «соль», а 0.5 соответствует отсутствию шума. Эту матрицу
необходимо еще обрабатывать для дальнейшего использования. Например, что-
чтобы испортить изображение этим шумом, необходимо сначала найти (с помощью
функции find) все координаты шума R, равные 0, и присвоить соответствующим
пикселам изображения самое малое значение (обычно это 0). Затем следует най-
найти все координаты шума R, равные 1, и присвоить соответствующим пикселам
изображения самое большое допустимое значение (обычно это 255 для 8-ми бито-
битовых изображений). Эта процедура моделирует практическое воздействие шума
«соль и перец» на изображение.
function R = imnoise2(type, M, N, а, Ъ)
°/0IMN0ISE2 Generates an array of random numbers with specified PDF.
°/o R = IMN0ISE2(TYPE, M, N, A, B) generates an array, R, of size
7o M-by-N, whose elements are random numbers of the specified TYPE
°/o with parameters A and B. If only TYPE is included in the
°/o input argument list, a single random number of the specified
°/o TYPE and default parameters shown below is generated. If only
°/o TYPE, M, and N are provided, the default parameters shown below
°/o are used. If M = N = 1, IMN0ISE2 generates a single random
7o number of the specified TYPE and parameters A and B.
°/o
°/o Valid values for TYPE and parameters A and В are:
7«
7e 'uniform' Uniform random numbers in the interval (A, B) .
У. The default values are @, 1).
% 'gaussian' Gaussian random numbers with mean A and standard
°/o deviation B. The default values are A = 0, В = 1.
Глава 5. Восстановление изображений
%
У.
У.
%
г
у.
'salt & pepper'
У.
У.
'lognormal'
'rayleigh'
'exponential'
'erlang'
У,
Уо
Уо
Уо
Уо
У.
Уо
Уо
Уо
if nargin == 1
а = 0; b = 1;
М = 1; N = 1;
elseif nargin == 3
а = 0; b = 1;
end
°/e Begin processing.
% being capitalized,
switch lower(type)
case 'uniform'
R = a + (b - a)*rand(M,
case 'gaussian'
R = a + b*randn(M, N);
case 'salt & pepper'
if nargin <= 3
a = 0.05; b = 0.05;
end
°/e Check to make sure that Pa
if (a + b) > 1
error('The sum Pa + Pb must
end
Salt and pepper numbers of amplitude 0 with
probability Pa = A, and amplitude 1 with
probability Pb = B. The default values are Pa =
Pb = A = В = 0.05. Note that the noise has
values 0 (with probability Pa = A) and 1 (with
probability Pb = B), so scaling is necessary if
values other than 0 and 1 are required. The noise
matrix R is assigned three values. If R(x, y) =
0, the noise at (x, y) is pepper (black). If
R(x, y) = 1, the noise at (x, y) is salt
(white). If R(x, y) = 0.5, there is no noise
assigned to coordinates (x, y).
Lognormal numbers with offset A and shape
parameter B. The defaults are A = 1 and В =
0.25.
Rayleigh noise with parameters A and B. The
default values are A = 0 and В = 1.
Exponential random numbers with parameter A. The
default is A = 1.
Erlang (gamma) random numbers with parameters A
and В. В must be a positive integer. The
defaults are A = 2 and В = 5. Erlang random
numbers are approximated as the sum of В
exponential random numbers.
Set default values.
Use lower(type) to protect against input
N);
+ Pb is not > 1.
not exceed 1.')
5.2. Модели шума
RA:M, 1:N) = 0.5;
°/e Generate an M-by-N array of uniformly-distributed random numbers
°/0 in the range @, 1). Then, Pa*(M*N) of them will have values <=
°/e a. The coordinates of these points we call 0 (pepper
°/o noise). Similarly, Pb*(M*N) points will have values in the range
7e > а к <= (a + b) . These we call 1 (salt noise) .
X = rand(M, N);
с = find(X <= a);
R(c) = 0;
u = a + b;
с = find(X > a & X <= u);
R(c) = 1;
case 'lognormal'
if nargin <= 3
a = 1; b = 0.25;
end
R = a*exp(b*randn(M, N));
case 'rayleigh'
R = a + (-b*log(l - rand(M, N))).~0.5;
case 'exponential'
if nargin <= 3
a = 1;
end
if a <= 0
error('Parameter a must be positive for exponential type.')
end
к = -I/a;
R = k*log(l - rand(M, N));
case 'erlang'
if nargin <= 3
a = 2; b = 5;
end
if (b ~= round(b) | b <= 0)
error('Param b must be a positive integer for Erlang.')
end
к = -I/a;
R = zeros(M, N);
for j = l:b
R = R + k*log(l - rand(M, N));
end
otherwise
error('Unknown distribution type.')
end
164 Глава 5. Восстановление изображений
Пример 5.2. Построение гистограмм данных, сгенерированных функцией imnoise2.
е)
10000
9000
8000
7000
6000
5000
4000
3000
2000
1000
0
1 1 1 1 1 1 1 1 1
О 0.5 1 1.5 2 2.5 3 3.5
О 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
5000
4000
3000
2000
1000
О
О 0.5 1 1.5
2.5
3.5
О
10 12
Рис. 5.2. Гистограммы случайных величин: а) гауссова, б) равномерная, в) логарифми-
логарифмически нормальная, г) релеевская, д) экспоненциальная, е) Эрланга. В каждом
случае использовались параметры, принятые по умолчанию в imnoise2
На рис. 5.2 приведены гистограммы всех типов случайных чисел из табл. 5.1.
Данные для каждого из этих графиков были сгенерированы с помощью функции
imnoise2. Например, данные для рис. 5.2, а) получаются следующей командой:
>> г = imnoise2('gaussian', 100000, 1, 0, 1);
Эта команда порождает вектор-столбец г, содержащий 100000 элементов, каж-
каждый из которых является случайной гауссовой величиной с нулевым средним и
5.2. Модели шума
единичным стандартным отклонением. После этого гистограмма строится функ-
функцией hist, которая имеет синтаксис
р = hist(r, bins),
где bins — это число корзин гистограммы. Чтобы построить гистограмму 5.2, а),
мы взяли число bins = 50. Другие гистограммы строились аналогично. Во всех
случаях всем параметрам шумов присваивались значения по умолчанию, пере-
перечисленные в соответствующих описаниях функции imnoise2. ?
5.2.3. Периодический шум
Периодический шум весьма типичен для оцифрованных изображений. Он возни-
возникает при интерференции различных электрических и электромеханических про-
процессов. В этой главе будет рассматриваться только такой тип шума, который
зависит от положения пиксела. Как будет обсуждаться в § 5.4, с таким шумом
можно справиться с помощью фильтрации в частотной области. Нашей моделью
периодического шума будет двумерная синусоида, задаваемая формулой
г (ж, у) = Asm [2тгио(х + Вх)/М + 2ttvo(x + By)/N],
где А — это амплитуда, г^о и г>о определяют синусоидальные частоты, соответ-
соответственно, по осям х и у, Вх и Ву — сдвиги фаз относительно начала отсчета.
Дискретным преобразованием Фурье (DFT) размеров MxN от г(х,у) является
функция
R(U, v) = j^
которая имеет вид пары комплексно сопряженных единичных импульсов, нахо-
находящихся в точках (uq,vo) и (—г^о, — г>о) соответственно.
Следующая М-функция допускает произвольное число местоположений им-
импульсов (координат частот), каждый со своей амплитудой, частотой и сдвигом
фазы, и она вычисляет г(х, у) в виде суммы синусоид в форме, представленной в
предыдущем абзаце. Функция также возвращает преобразование Фурье R(u,v)
в форме суммы импульсов, а также спектр S(u,v). Синусовые волны строятся
по заданным положениям импульсов с помощью обратного DFT. Это позволя-
позволяет лучше понять и визуально представить частотное содержание пространствен-
пространственных шумов. Для определения положения импульса достаточно знать одну пару
координат. Программа строит сопряженно симметричные импульсы. (Обратите
внимание на использование здесь функции if ft shift для приведения R к виду,
подходящему для применения операции if ft 2, что обсуждалось в § 4.2).
function [r, R, S] = imnoise3(M, N, С, А, В)
°/0IMN0ISE3 Generates periodic noise.
°/, [r, R, S] = IMN0ISE3(M, N, С, А, В) , generates a spatial
°/o sinusoidal noise pattern, r, of size M-by-N, its Fourier
°/o transform, R, and spectrum, S. The remaining parameters are as
°/o follows:
Глава 5. Восстановление изобраэюений
% С is a K-by-2 matrix containing К pairs of frequency domain coordi-
% nates (u, v) indicating the locations of impulses in the frequency
°/o domain. These locations are with respect to the frequency rectangle
% center at (M/2 + 1, N/2 + 1). Only one pair of coordinates is requi-
% red for each impulse. The program automatically generates the lo-
% cations of the conjugate symmetric impulses. These impulse pairs
°/o determine the frequency content of r.
'/.
°/0 A is a 1-by-K vector that contains the amplitude of each of the
°/o К impulse pairs. If A is not included in the argument, the
°/o default used is A = ONESA, К). В is then automatically set to
% its default values (see next paragraph). The value specified
% for A(j) is associated with the coordinates in C(j, 1:2).
У.
% В is a K-by-2 matrix containing the Bx and By phase components
% for each impulse pair. The default values for В are BA:K, 1:2) = 0.
% Process input parameters.
[K, n] = size(C);
if nargin == 3
AA:K) = 1.0;
BA:K, 1:2) = 0;
elseif nargin == 4
BA:K, 1:2) = 0;
end
% Generate R.
R = zeros(M, N);
for j = 1:K
ul = M/2 + 1 + C(j, 1); vl = N/2 + 1 + C(j, 2);
R(ul, vl) = i * (A(j)/2) * exp(i*2*pi*C(j, 1) * B(j, 1)/M);
°/o Complex conjugate.
u2 = M/2 + 1 - C(j, 1); v2 = N/2 + 1 - C(j, 2);
R(u2, v2) = -i * (A(j)/2) * exp(i*2*pi*C(j, 2) * B(j, 2)/N);
end
e/o Compute spectrum and spatial sinusoidal pattern.
S = abs(R);
r = real(ifft2(ifftshift(R)));
Пример 5.3. Использование функции imnoise3.
На рис. 5.3, а) и б) построен спектр и пространственный синусовый шум с помо-
помощью последовательности команд
>> С = [0 64; 0 128; 32 32; 64 0; 128 0; -32 32];
>> [г, R, S] = imnoise3E12, 512, С);
>> imshow(S, [ ])
>> figure, imshow(r, [ ])
5.2. Модели шума
Напомним, что порядок частотных координат (u,v). Эти две величины обо-
обозначены по отношению к центру частотного прямоугольника (см. § 4.2 для опре-
определения координат этой центральной точки). На рис. 5.3, в) и г) показан резуль-
результат повторения предыдущих команд, но с параметрами
>> С = [0 32; 0 64; 16 16; 32 0; 64 0; -16 16];
Рис. 5.3. а) Спектр задан-
заданных импульсов, б) Соответ-
Соответствующий синусовый шум. в)
и г) Аналогичная пара изоб-
изображений, д) и е) Два дру-
других шумовых образца. Белые
точки на рис. а) и б) бы-
были увеличены для улучшения
видимости
Аналогично, рис. 5.3, д) построен при
>> С = [6 32;-2 2] ;
Рис. 5.3, е) получен с тем же вектором С, но с модифицированным вектором
амплитуд:
>> А = [1 5];
>> [г, R, S] = imnoise3E12, 512, С, А);
Глава 5. Восстановление изображений
Из рис. 5.3, е) видно, что на изображении доминируют синусовые волны с низкой
частотой. Это легко понять, так как их амплитуда в пять раз больше амплитуды
высокочастотной компоненты. ?
5.2.4. Оценивание параметров шума
Параметры периодического шума можно оценить, анализируя спектр Фурье изоб-
изображения. Периодический шум порождает частотные всплески, которые можно
обнаружить далее визуально. Автоматический анализ возможен в случаях, когда
эти всплески достаточно отчетливы или когда имеется дополнительная инфор-
информация о частотах интерференции.
В случае пространственного шума параметры PDF можно частично узнать
из спецификаций сенсоров, однако часто это делается с помощью анализа про-
простых тестовых изображений. Соотношения между средней величиной m и дис-
дисперсией <т2 шума и параметрами а и 6, которые описывают шум, перечислены в
табл. 5.1 для интересующих нас случайных величин. Поэтому задача заключает-
заключается в оценивании среднего значения и дисперсии по тестовым образцам, которые
можно подставить в уравнения для нахождения параметров а и Ь.
Пусть Zi — дискретная случайная величина, значениями которой являются
уровни яркости изображения. Обозначим через p(zi), г — 1,2,...,L — 1 соот-
соответствующую нормированную гистограмму, где L — это число возможных зна-
значений яркости. Таким образом, число p(zi) приближает вероятность появления
величины яркости Zi на изображении. Гистограмму можно рассматривать как
приближение PDF яркости.
Используя стандартный метод, форму гистограммы можно описать с помо-
помощью статистических центральных моментов, которые вычисляются по формуле
L-1
Цп = Yl(Zi -т)ПР(*г),
г=0
где п — это порядок момента, а га — среднее значение,
L-1
т= y^jzip(zi).
г=0
Поскольку гистограмма была нормирована, сумма всех ее компонентов равна 1,
поэтому из приведенных формул следует, что цо = 1, \х\ = 0. Второй момент
L-1
г=0
равен дисперсии случайной величины z. В этой главе нам понадобятся лишь
среднее значение и дисперсия. Статистические моменты более высокого порядка
будут обсуждаться в гл. 11.
Функция s tat moments вычисляет среднее и статистические моменты до по-
порядка п включительно и возвращает эти величины в виде вектора-столбца v.
5.2. Модели шума
Поскольку моменты нулевого и первого порядков равны, соответственно, 1 и О,
statmoments их игнорирует и присваивает v(l) = m и v(k) = fik при к =
= 2, 3,..., п. Синтаксис имеет вид (см. приложение В):
[v, unv] = statmoments(p, n),
где р — это вектор гистограммы, а п обозначает наибольший порядок моментов.
Требуется, чтобы число компонентов вектора р равнялось 28 для класса изоб-
изображения uint8, 216 для класса uintl6, а также 28 или 216 для класса double.
Выходной вектор v содержит нормированные моменты, вычисленные на основе
приведения случайных величин к диапазону [0,1]. Следовательно, все моменты
будут также принадлежать этому интервалу. Вектор unv содержит те же момен-
моменты, что и v, но в диапазоне исходных данных. Например, если length (р) = 256
и v(l) = 0.5, то unv(l) = 127.5, что равно половине от диапазона [0, 255].
Часто бывает необходимо оценить параметры шума непосредственно по за-
шумленному изображению или по набору таких изображений. В этом случае
следует выбрать на некотором изображении область, по возможности лишенную
характерных черт, чтобы распределение яркости на ней было бы произведено
главным образом шумом. Для выбора такой интересующей области (ROI, Region
Of Interest) можно воспользоваться функцией roipoly, которая строит много-
многоугольную область. Она имеет синтаксическую форму
В = roipoly(f,с,г),
где f — интересующее нас изображение, а с и г — векторы, соответствующие
координатам (по столбцам и строкам) последовательных вершин многоугольни-
многоугольника (заметьте, что в начале идут координаты по столбцам). Выходом функции
служит двоичный массив того же размера, что и f, с единицами внутри инте-
интересующей области и с нулями вне ее. Изображение В используется в качестве
маски для ограничения выполнения операций на выделенную область. Для ин-
интерактивного задания области ROI можно использовать синтаксис
В = roipoly(f).
В этом случае изображение f выводится на экран, и пользователю предлагается
обозначить интересующую область с помощью мыши. Если параметр f опущен,
функция оперирует с последним изображением на экране. Действуя левой кноп-
кнопкой мыши, строим последовательные вершины многоугольника. Нажимая клави-
клавиши Backspace или Delete, можно удалить вершину, выбранную на предыдущем
шаге. Нажав левую кнопку мыши с одновременным удержанием клавиш Shift,
правую кнопку мыши или сделав двойной щелчок левой кнопкой, добавляем по-
последнюю вершину, после чего выбранный многоугольник заполняется единицами.
Если нажать Enter, то построение многоугольника завершается без добавления
последней вершины.
Чтобы получить бинарную маску и список вершин многоугольника, можно
использовать конструкцию
[В, с, г] = roipoly(. . .),
Глава 5. Восстановление изображений
где roipoly ( . . .) обозначает любой допустимый вид этой функции, а с и г —
векторы координат (по столбцам и строкам) вершин многоугольника, как было
описано раньше. Такой формат особенно удобен при интерактивном использова-
использовании roipoly, так как он выдает информацию об области ROI, которую можно
копировать и использовать в последующих программах.
Следующая функция вычисляет гистограмму выбранной многоугольной об-
области ROI на изображении, вершины которой заданы парой векторов сиг, как
описано выше.
function [p, npix] = histroi(f, с, г)
70HISTR0I Computes the histogram of an ROI in an image.
1 [P, NPIX] = HISTROKF, C, R) computes the histogram, P, of a
7o polygonal region of interest (ROI) in image F. The polygonal
°/o vertices, which are specified (sequentially) in vectors С and R,
% respectively. All pixels of F must be >=0. Parameter NPIX is the
°/0 number of pixels in the polygonal region.
% Generate the binary mask image.
В = roipoly(f, c, r);
% Compute the histogram of the pixels in the ROI.
p = imhist(f(B));
% Obtain the number of pixels in the ROI if requested in the output.
if nargout > 2
npix = sum(B(:));
end .
Пример 5.4. Оценивание параметров шума.
На рис. 5.4, а) показано изучаемое изображение f. В этом примере мы восполь-
воспользуемся представленными выше инструментами для определения типа шума и
оценивания его параметров. На рис. 5.4, б) изображена маска В, построенная ин-
интерактивно командой
>> [В, с, г] = roipoly(f);
Рис. 5.4, в) получен при выполнении команд
>> [р, npix] = histroi(f, с, г);
>> figure, bar(p, 1);
Среднее значение и дисперсия области исходного изображения, накрываемой
маской В, вычислены по формулам
>> [v, unv] = statmoments(h, 2);
>> v
V =
0.5794 0.0063
unv
unv =
147.7430 410.9313
5.2. Модели шума
Рис. 5.4. а) Зашумленное изоб-
изображение, б) Область ROI, по-
построенная интерактивно, в) Ги-
Гистограмма ROL г) Гистограмма
гауссова шума, сгенерированная
функцией imnoise2. (Исходное
изображение представлено ком-
компанией Lixi, Inc.)
а)
300
Из рис. 5.4, в) видно, что шум похож на гауссов. На самом деле, найти точное
значение среднего и дисперсии шума в области В не представляется возможным,
так как шум наложен на конкретное изображение. Тем не менее, выбирая одно-
однородную область без фоновых деталей (как это было сделано выше) и полагая шум
гауссовым, можно считать, что средняя яркость изображения с шумом прибли-
приблизительно равна средней яркости этого изображения без шума (мы считаем, что
гауссов шум имеет нулевое среднее). Кроме того, поскольку выбранная область
достаточно однородна по яркости, разумно утверждать, что дисперсия яркости в
области В прежде всего определяется дисперсией шумового слагаемого. (Там, где
это возможно, другой метод оценивания среднего и дисперсии шума состоит в
использовании тестового изображения постоянной яркости.) На рис. 5.4, г) при-
приведена гистограмма множества из npix (это число возвращает функция histroi)
случайных гауссовых величин со средним 147 и дисперсией 400, построенная ко-
командами
>> X = imnoise2('gaussian', npix, 1, 147, 20);
>> figure, hist(X, 130)
>> axis([0 300 0 140)
где число корзин в hist выбрано так, чтобы результат можно было сравнить с
графиком на рис. 5.4, в). Эта гистограмма получена функцией histroi (см. преды-
предыдущий программный код), которая использует масштаб, отличный от масштаба
функции hist. Мы выбрали npix случайных гауссовых величин и записали их в
вектор X, чтобы иметь одинаковое число отсчетов на обеих гистограммах. Схо-
Схожесть графиков на рис. 5.4, в) и г) ясно указывает на то, что шум, и в самом
деле, хорошо аппроксимирован гауссовым распределением, параметры которого
взяты из оценок v(l) и vB). ?
172 Глава 5. Восстановление изображений
5.3. Восстановление в присутствии одного шума —
пространственная фильтрация
Если искажения вносятся в изображение исключительно шумом, то из модели
§ 5.1 вытекает, что
9(х,у) = f(x,y) + ri(x,y).
В этом случае методом удаления шума может служить пространственная филь-
фильтрация с использованием техники, описанной в §§ 3.4 и 3.5. В этом параграфе
мы суммируем эти подходы и построим несколько пространственных фильтров
для подавления шума. Дополнительные детали, характеризующие эти фильтры,
изложены в [Gonzalez, Woods, 2002].
5.3.1. Фильтры для пространственного шума
В табл. 5.2 перечислены пространственные фильтры, которые будут рассмотре-
рассмотрены в этом параграфе. В этой таблице Sxy обозначает подизображение (область)
размера тхп на зашумленном изображении д. Нижний индекс у 5 обозначает ко-
координаты (я, у) центра подизображения. Через /(ж, у) обозначается отклик филь-
фильтра (приближение изображения /) в точке (х,у). Линейные фильтры реализова-
реализованы с помощью функции imf ilter, которая рассматривалась в § 3.4. Медианный,
минимальный и максимальный фильтры являются нелинейными фильтрами по-
порядковых статистик. Медианный фильтр можно непосредственно реализовать на
базе функции medfiIt2 из пакета IPT. Максимальный и минимальный фильтры
можно реализовать с помощью более общей функции ordf ilt2 для нахождения
порядковых статистик, которая обсуждалась в § 3.5.2.
Мы построим функцию spf ilt, которая совершает фильтрацию в простран-
пространственной области с помощью любого фильтра из табл. 5.2. Обратите внимание
на использование функции imlincomb (упомянутой в табл. 5.2) при вычислении
линейной комбинации входных данных. Синтаксис этой функции имеет вид
В = imlincomb(cl, А1, с2, А2, ..., ск, Ак).
Она реализует формулу
В = cl*Al + с2*А2 + . . . + ск*Ак,
где ci — это скалярные величины двойной точности, a Ai — числовые масси-
массивы одного класса и одинаковых размеров. Заметьте также, как в подфункции
gmean можно включить и выключить функцию warning. В этом случае имеется
возможность подавить предупреждение, которое выдает MATLAB, когда аргу-
аргумент функции log становится равен 0. В общем случае, функцию warning можно
использовать в любой программе. Ее базовый синтаксис имеет вид
warning('message').
Эта функция ведет себя в точности, как и функция disp, за тем исключением,
что ее можно включать и выключать командой warning on или warning off.
function f = spfilt(g, type, m, n, parameter)
Таблица 5.2. Пространственные фильтры. Переменные тип,
фильтрации
соответственно, обозначают число строк и столбцов окрестности
Имя фильтра
Арифметическое
среднее
Геометрическое
среднее
Гармоническое
среднее
Контрагармони-
ческое средне
Медиана
Максимум
Минимум
Срединная точка
а-усеченное
среднее
f(x,y)
Уравнение
тпп (s,t)esxy
f(*,v)=\ П 0(М)|
[(s,t)esxy J
f, ч run
J \ ->У) у^ 1
^—' g(s,t)
/(х, у) = median {pE,i)}
f(x,y) = max {p(s,?)}
/>,y)= 1ШП feE,«)}
= ? max {^(s,t)}+ min {p
2 |_(«,t)€Sxl/ (e,0€5xw
(e,*)}|
Комментарии
Реализуется с помощью функций IPT w = f special ('average*,
[m, n]) Hf = imfilter(g, w).
Реализуется функцией gmean (см. функцию spf ilt в этом пара-
параграфе).
Реализуется функцией harmean (см. функцию spf ilt в этом па-
параграфе).
Реализуется функцией charmean (см. функцию spf ilt в этом
параграфе).
Реализуется с помощью функций IPT medfilt2:
f = medfilt2(g, [m, n]).
Реализуется с помощью функций IPT ordfilt2:
f = ordfilt2(g, m*n, ones(m,n)).
Реализуется с помощью функций IPT ordfilt2:
f = ordfilt2(g, 1, ones(m,n)).
Реализуется в виде полусуммы фильтров максимума и минимума
Из области SXy удаляются d/2 наибольших и d/2 наименьших
значений пикселов. gr(s,t) обозначает оставшиеся mn — d зна-
значения окрестности. Реализуется с помощью функции alphatrim
(см. функцию spf ilt).
Глава 5. Восстановление изобраэюений
°/eSPFILT Performs linear and nonlinear spatial filtering.
°/, F = SPFILTCG, TYPE, M, N, PARAMETER) performs spatial filtering
% of image G using a TYPE filter of size M-by-N. Valid calls to
°/e SPFILT are as follows:
F = SPFILTCG, 'median', M, N)
F = SPFILTCG, 'max', M, N)
F = SPFILTCG, 'min', M, N)
F = SPFILTCG, 'midpoint', M, N)
F = SPFILTCG, 'atrimmed', M, N, D)
°/, F = SPFILTCG, 'amean', M, N) Arithmetic mean filtering.
p/e F = SPFILTCG, 'gmean', M, N) Geometric mean filtering.
°/o F = SPFILTCG, 'hmean', M, N) Harmonic mean filtering.
°/e F = SPFILTCG, 'chmean', M, N, Q) Contraharmonic mean
% filtering of order Q. The
% default is Q = 1.5.
Median filtering.
Max filtering.
Min filtering.
Midpoint filtering.
Alpha-trimmed mean filtering.
°/0 Parameter D must be a nonnega-
°/o tive even integer; its default
% value is D = 2.
У. The default values when only G and TYPE are input are M = N = 3,
У. Q = 1.5, and D = 2.
°/o Process inputs,
if nargin == 2
m = 3; n = 3; Q = 1.5; d = 2;
elseif nargin == 5
Q = parameter; d = parameter;
elseif nargin == 4
Q = 1.5; d = 2;
else
error С'Wrong number of inputs.');
end
°/0 Do the filtering,
switch type
case 'amean'
w = fspecial('average', [m n] ) ;
f = imfilterCg, w, 'replicate');
case 'gmean'
f = gmeanCg, m, n);
case 'hmean'
f = harmeanCg, m, n) ;
case 'chmean'
f = charmeanCg, m, n, Q);
case 'median'
f = medfilt2Cg, [m n], 'symmetric');
case 'max'
5.3. Восстановление в присутствии одного шума
f = ordfilt2(g, m*n, ones(m, n), 'symmetric');
case 'min'
f = ordfilt2(g, 1, ones(m, n), 'symmetric');
case 'midpoint'
fl = ordfilt2(g, 1, ones(m, n), 'symmetric');
f2 = ordfilt2(g, m*n, ones(m, n), 'symmetric');
f = imlincomb@.5, fl, 0.5, f2);
case 'atrimmed'
if (d < 0) | (d/2 ~= round(d/2))
errorCd must be a nonnegative, even integer.')
end
f = alphatrim(g, m, n, d);
otherwise
error('Unknown filter type.')
end
•/, I
function f = gmean(g, m, n)
°/o Implements a geometric mean filter.
inclass = class(g);
g = im2double(g);
У, Disable log@) warning.
warning off;
f = exp(imfilter(log(g), ones(m, n), 'replicate')).~A / m / n);
warning on;
f = changeclass(inclass, f);
•/. I
function f = harmean(g, m, n)
°/o Implements a harmonic mean filter.
inclass = class(g);
g = im2double(g);
f = m * n ./ imfilter(l./(g + eps), ones(m, n), 'replicate');
f = changeclass(inclass, f);
•/. I
function f = charmean(g, m, n, q)
°/e Implements a contraharmonic mean filter.
inclass = class(g);
g = im2double(g);
f = imfilter(g.~(q+l), ones(m, n), 'replicate');
f = f ./ (imfilter(g.~q, ones(m, n) , 'replicate') + eps);
f = changeclass(inclass, f);
•/, %
function f = alphatrim(g, m, n, d)
°/o Implements an alpha-trimmed mean filter.
inclass = class(g);
g = im2double(g);
f = imfilter(g, ones(m, n), 'symmetric');
I 76 Глава 5. Восстановление изображений
for к = l:d/2
f = imsubtract(f, ordfilt2(g, k, ones(m, n), 'symmetric'));
end
for к = (m*n - (d/2) + 1):m*n
f = imsubtract(f, ordfilt2(g, k, ones(m, n), 'symmetric'));
end
f = f / (m*n - d);
f = changeclass(inclass, f) ;
a) 6)
в) г)
д)
Рис. 5.5. а) Изображение, испорченное шумом «перец» с вероятностью 0.1. б) Изображе-
Изображение, испорченное шумом «соль» с вероятностью 0.1. в) Результат фильтрации
а) контрагармоническим фильтром размера 3x3 порядка Q = 1.5. г) Резуль-
Результат фильтрации б) при Q = —1.5. д) Результат фильтрации а) максимальным
фильтром размера 3x3. е) Результат фильтрации б) минимальным фильтром
размера 3x3
5.3. Восстановление в присутствии одного шума
Пример 5.5. Использование функции spf ilt.
На рис. 5.5, а) приведено изображение класса uint8, испорченное только шумом
«перец» с вероятностью 0.1. Это изображение построено следующими командами
[f, как всегда, обозначает исходное изображение, которое уже воспроизводилось
на рис. 3.18, а)]:
» [М, N] = size(f);
>> R = imnoise2('salt & paper', M, N, 0.1, 0);
>> с = find(R == 0) ;
» gp = f;
>> gp(c) = 0;
Рис. 5.5, 6)\ подпорченный только шумом «соль», получен командами
>> R = imnoise2('salt & paper', M, N, 0, 0.1);
>> с = find(R == 1) ;
>> gs = f;
>> gs(c) = 255;
Избавиться от шума «перец» можно с помощью контрагармонического фильтра
с положительным значением Q. Рис. 5.5, в) построен командой
>> ip = spfilt(gp, 'chmean', 3, 3, 1.5);
Аналогично, для борьбы с шумом «соль» можно воспользоваться контрагар-
моническим фильтром с отрицательным значением Q :
>> is = spfilt(gs, 'chmean', 3, 3, -1.5);
На рис. 5.5, г) показан результат. Можно также действовать минимальным и
максимальным фильтрами. Например, рис. 5.5, д) и е) получены, соответственно,
из а) и б) с помощью следующих команд
>> fpmax = spfilt(gp, 'max', 3, 3);
>> fpmin = spfilt(gs, 'min', 3, 3);
Другие решения с использованием функции fpmin можно получать аналогич-
аналогичным образом. ?
5.3.2. Адаптивные пространственные фильтры
Приведенные выше фильтры применяются одинаково ко всем пикселам изобра-
изображения независимо от их местоположения. В некоторых случаях результат филь-
фильтрации можно улучшить, если фильтр имеет возможность менять свое действие
в зависимости от характеристик изображения в области фильтрации. В качестве
иллюстрации реализации адаптивной процедуры пространственной фильтрации на
MATLAB рассмотрим адаптивный медианный фильтр. Как и раньше, Sxy обоз-
обозначает окрестность фильтрации с центром в точке (х, у) на изображении, подверга-
подвергаемом обработке. Алгоритм, который детально разобран в [Gonzalez, Woods, 2002],
Глава 5. Восстановление изображений
действует следующим образом. Обозначим
2min = МИНИМУМ ЯрКОСТИ В Sxy,
^max = максимум яркости в Sxy,
2med = медиана яркости в Sxy
zXy = яркость в точке (х,у).
Адаптивный алгоритм медианной фильтрации действует на двух уровнях, кото-
которые мы назовем уровень А и уровень В:
Уровень А Если zmin < zmed < 2max, то перейти на уровень В,
иначе увеличить размер окна.
Если размер окна ^ 5тах, то повторить уровень А,
иначе подать на выход величину zmed-
Уровень В Если zm-m < zxy < zmax, т° подать на выход zxy,
иначе подать на выход величину zmed-
Здесь 5тах обозначает максимально допустимый размер окна адаптивного филь-
фильтра. Другая особенность последнего шага на уровне А состоит в возвращении
величины zxy вместо медианы. Это приводит к немного меньшему размытию
изображения, однако такая процедура может не заметить шум типа «соль» («пе-
(«перец») на постоянном заднем фоне, имеющем то же значение, что и шум «соль»
(«перец»).
М-функция, которая реализует этот алгоритм, называется admedian. Она вклю-
включена в приложение В и имеет синтаксис
f = adpmedian(g, Smax),
где g — это фильтруемое изображение, Smax — определенный выше максимально
допустимый размер окна адаптивной фильтрации.
Пример 5.6. Адаптивная медианная фильтрация.
В качестве примера рассмотрим снимок f монтажной платы на рис. 5.6, а), ис-
испорченный шумом «соль и перец», который наложен на изображение командой
>> g = imnoise(f, 'salt & paper', 0.25);
а на рис. 5.6, б) приведен результат выполнения следующей команды (см. § 3.5.2
по поводу использования функции medf ilt2)
>> fl = medfilt2(g, [7 7], 'symmetric');
Это изображение, очевидно, очищено от шума, но одновременно с этим оно стало
слишком расплывчатым и искаженным (обратите внимание на то, как выглядят
штырьки разъемов вверху изображения). Напротив, совершив действие
>> f2 = adpmedian(g, 7,);
мы получим изображение 5.6, в), на котором шум также отсутствует, но оно
существенно четче, чем рис. 5.6, б). ?
5.4- Подавление периодического шума
а) б) в)
Рис. 5.6. а) Изображение, испорченное шумом «соль и перец» с плотностью ошибок 0.25.
б) Результат применения медианного фильтра размеров 7x7. в) Результат адап-
адаптивной медианной фильтрации с 5тах = 7
5.4. Подавление периодического шума с помощью
фильтрации в частотной области
Как отмечалось в § 5.2.3, периодический шум обнаруживается в виде импульсно-
подобных всплесков, которые можно наблюдать в его спектре Фурье. Основной
метод борьбы с таким шумом основан на режекторной фильтрации. Передаточ-
Передаточная функция режекторного фильтра Баттерворта порядка п имеет вид
H{u,v)
] Di(u,v)D2{u,v)
где
Di(u, v) = [(и - М/2 - иоJ + (v - N/2 - v0J}
D2(u, v) = [{и - М/2 + гх0J + (v - N/2 + v0J}
1/2
1/2
Здесь (гхо, г>о) и (в силу симметрии) (—гхо, — vq) — центры расположения «выемок»,
радиус которых равен Do. Обратите внимание на то, что фильтр задан относи-
относительно центра частотного прямоугольника, т. е. его следует обработать функци-
функцией f ft shift перед тем, как использовать в фильтрации средствами MATLAB
(см. пояснения в §§ 4.2 и 4.3).
Написание М-функции для режекторного фильтра основано на принципах,
изложенных в § 4.5. При этом полезно предусмотреть возможность многих «вы-
«выемок», как это было сделано в § 5.2.3 при построении функции, которая генери-
генерирует многократный синусоидальный шум. Имея функцию Н, можно совершать
фильтрацию с помощью функции dftf ilf, которая объяснялась в § 4.3.3.
Глава 5. Восстановление изображений
5.5. Моделирование искажающих функций
Если имеется оборудование, генерирующее искаженные изображения, то можно
установить природу искажения, экспериментируя с различными установками и
параметрами этого оборудования. Однако доступность такого оборудования яв-
является скорее исключением, чем правилом. Более типичной является ситуация,
когда производятся эксперименты с различными функциями PSF, которые те-
тестируются с разными алгоритмами восстановления изображений. Другой подход
состоит в математическом моделировании самих функции PSF. Такой подход вы-
выходит за рамки обсуждения в этой книге. Подробное изложение этого материала
имеется в [Gonzalez, Woods, 2002]. Наконец, если нет доступной информации про
PSF, можно прибегнуть к «слепой деконволюции» для каких-то заключений от-
относительно свойств PSF. Этот подход будет обсуждаться в § 5.10. Конец этого
параграфа будет посвящен различным методам моделирования функций PSF с
помощью функций imf ilter и f special, которые были введены, соответственно,
в § 3.4 и 3.5, а также различным генераторам шума, рассмотренным ранее в этой
главе.
Одной из основных трудностей, с которой приходится сталкиваться при реше-
решении задач восстановления изображений, является проблема размывания и смазы-
смазывания изображений. Размывание, возникающее, когда сцена и регистрирующее
устройство находятся в покое по отношению друг к другу, можно смоделиро-
смоделировать низкочастотными фильтрами в пространственной или частотной областях.
Другая важная модель искажения изображений смазыванием соответствует рав-
равномерному прямолинейному перемещению сцены относительно регистрирующих
устройств и датчиков в процессе фиксирующей съемки. В этом случае размытие
изображений можно смоделировать с помощью функции f special из пакета IPT:
PSF = fspecial('motion', len, theta) .
Эта форма вызова fspecial возвращает PSF, которая аппроксимирует эффекты
линейного перемещения камеры на len пикселов. Угловой параметр theta изме-
измеряется в градусах, причем он отсчитывается от положительной горизонтальной
полуоси против часовой стрелки. Значения по умолчанию: len = 9 и theta = 0,
что соответствует смещению на 9 пикселов в горизонтальном направлении.
Мы используем функцию imf ilter для построения изображения, искаженно-
искаженного фильтром PSF, который или известен, или построен приведенной выше коман-
командой:
>> g = imfilter(f, PSF, 'circular');
где параметр 'circular' (см. табл. 3.2) используется для подавления граничных
эффектов. После чего искажение вносится в изображение в виде аддитивного
шума по формуле
>> g = g + noise;
где noise — это случайное шумовое изображение, которое имеет тот же размер,
что и g, и строится одним из методов, изложенных в § 5.2.
5.5. Моделирование искажающих функций
При сравнении различных подходов, обсуждаемых в этом и следующем пара-
параграфах, полезно работать с одним и тем лее тестовым изображением. Изображе-
Изображение, которое строится функцией checkerboard, особенно удобно в этом смысле,
поскольку у него очень просто изменять масштаб, не затрагивая его характерных
черт. Функция имеет следующий синтаксис
С = checkerboard(NP, M, N),
где NP — это длина в пикселах каждой клетки, М — это число строк, а N — число
столбцов шахматной доски. Если параметр N опущен, то он по умолчанию при-
приравнивается к М. Если они оба опущены, то строится классическая шахматная
доска 8x8. Наконец, если отсутствует NP, то по умолчанию NP = 10 пикселов.
Светлые клетки в левой половине шахматной доски будут белыми, а в правой
половине они будут светло-серыми. Чтобы построить шахматную доску, у кото-
которой все светлые клетки будут белыми, следует дать команду1
>> К = im2double( checkerboard (NP, M, N) > 0.5);
Изображение, которое строит функция checkerboard, имеет класс double со зна-
значениями в интервале [0,1].
Многие алгоритмы восстановления изображений работают медленно с боль-
большими изображениями. Поэтому имеет смысл экспериментировать с малыми изоб-
изображениями для сокращения времени вычислений, что позволяет скорее оптими-
оптимизировать алгоритм. В этом случае для целей визуализации полезно иметь воз-
возможность увеличивать изображение посредством дублирования пикселов. Это
делается с помощью следующей функции (см. ее программный код в приложе-
приложении В):
В = pixeldup(A, m, n).
Эта функция дублирует каждый пиксел m раз по вертикали и п раз по горизон-
горизонтали. Если п опущено, то по умолчанию п = т.
Пример 5.7. Моделирование размытого зашумленного изображения.
На рис. 5.7, а) построено изображение с помощью команды
>> i = checkerboard(8) ;
Испорченное изображение 5.7, б) получено командами
>> PSF = f special ( 'motion3, 7, 45);
>> gb = imfilter(f, PSF, 'circular');
Заметьте, что PSF — это пространственный фильтр. Он имеет следующие значения:
>> PSF
PSF =
0 0 0 0 0 0.0145 0
0 0 0 0 0.0376 0.1283 0.0145
1 Операция > производит результат класса logical; im2double используется для приведения
изображения к класса double, что согласуется с классом выхода функции checkerboad.
Глава 5. Восстановление изображений
0
0
0
0.0145
0
0
0
0
0
0
.0376
.1283
.0145
0
0
0
0
.0376
.1283
.0376
0
0
0
0
.0376
.1283
.0376
0
0
0
0
.1283
.0376
0
0
0
0.0376
0
0
0
0
0
0
0
0
0
Шумовое изображение на рис. 5.7, в) сгенерировано командой
>> noise = imnoise(zeros(size(f), 'gaussian', 0, 0.001);
Шум можно добавить к изображению прямо в команде imnoise(gb, 'gaussian',
0, 0.001). Однако это шумовое изображение нам еще понадобится в этой главе,
поэтому мы его здесь вычисляем отдельно.
Рис. 5.7. а) Исходное изобра-
изображение, б) Изображение, размы-
размытое функцией fspecial с па-
параметрами len = 7 и theta =
= -45. в) Шумовое изображе-
изображение, г) Сумма б) и в)
Смазанное и зашумленное изображение на рис. 5.7, г) строится по команде
>> gb = g + noise;
Этот шум трудно визуально обнаружить на этом изображении, так как его мак-
максимальное значение имеет порядок 0.15, а максимальное значение пикселов изоб-
изображения равно 1. Однако в § 5.7 и 5.8 будет показано, что даже такой уровень
шума создает проблемы при восстановлении исходного изображения. Наконец,
отметим, что все изображения на рис. 5.7 были сжаты до размеров 512x512 и
отображены командой типа
>> imshow(pixeldup(f, 8), [ ]).
Изображение на рис. 5.7, г) будет восстановлено на рис. 5.8 и 5.9. ?
5.6. Инверсная фильтрация
5.6. Инверсная фильтрация
Самый простой подход к восстановлению испорченного изображения состоит в
построении приближения вида
F(u,v) =
H(u,v)
после чего следует применить обратное преобразование Фурье к функции F(u,v)
(напомним, что G(u, v) — это преобразование Фурье испорченного изображения).
Этот подход удобно называть инверсной фильтрацией. Воспользовавшись моде-
моделью из § 5.1, этот метод можно выразить в виде следующего приближения
Это обманчиво простое выражение говорит нам о том, что даже если мы знаем
H(u,v) точно, то мы не можем восстановить F(u,v) (а значит, и оригинальное,
неиспорченное изображение f(u,v)), поскольку шумовая компонента является
случайной величиной, преобразование Фурье которой N(u,v) остается неизвест-
неизвестной. Кроме того, на практике обычно имеются большие проблемы с функцией
H(u,v), которая может иметь нулевые значения. Даже если член N(u,v) прене-
пренебрежимо мал, деление его на малые значения H(u,v) может дать нежелательно
большую прибавку к приближению F{u,v).
Типичный подход к совершению инверсной фильтрации состоит в построении
частного F(u,v) = G(u,v)/H(u,v), у которого необходимо ограничить частотный
диапазон «малой» окрестностью начала отсчета, а затем делать обратное преоб-
преобразование. Идея здесь заключается в том, что нули функции H{u,v) с меньшей
степенью вероятности будут располагаться «близко» от начала частотных ко-
координат, так как амплитуда преобразования в этой области равна наибольшему
значению этой величины. Имеется множество вариаций на эту тему, при которых
no-разному разбираются значения (и, v) функции Н в нуле или около нуля. Та-
Такой подход иногда называется псевдоинверсной фильтрацией. Но, вообще говоря,
подходы, основанные на инверсной фильтрации такого типа, не очень точны, что
видно из примера 5.8 в следующем параграфе.
5.7. Винеровская фильтрация
Винеровская фильтрация (названная в честь Н. Винера, предложившего этот
метод в 1942 г.) является одним из самых старых и хорошо известных подходов
в линейном восстановлении изображений. Винеровский фильтр ищет приближе-
приближение /, которое минимизирует среднеквадратическое отклонение
где Е — оператор математического ожидания, а / — неискаженное изображение.
Решение этой экстремальной задачи в частотной области выражается формулой
H(u,v)\H(u,v)\* I Sv(u,v)/Sf(u,v)
Глава 5. Восстановление изображений
где H(u,v) — искажающая функция; \Н(и,v)\2 = H*(u,v)H(u,v)\ H*(u,v) —
комплексно-сопряженная функция H(u,v); Srj(u,v) = \N(u,v)\2 — энергетиче-
энергетический спектр шума; Sf(u,v) = \F(u,v)\2 — спектр неискаженного изображения;
частное S^w, v)/Sf(u, v) называется энергетическим соотношением шум/сигнал
(NSPR, Noise-to-Signal Power Ratio). Видно, что если спектр шума равен нулю
для всех значений и и v, то это соотношение также равно нулю, и винеровский
фильтр приводится к инверсному фильтру, который обсуждался в предыдущем
параграфе.
Определим две полезные величины, которые называются средняя энергия шу-
шума и средняя энергия изображения, соответственно,
Здесь М и N обозначают вертикальный и горизонтальный размеры массивов
изображения и шума. Эти величины являются скалярами, а их частное
JA
которое также скалярно, иногда используется при построении постоянной матри-
матрицы, которая используется вместо Sv(u, v)/Sf(u, v). В этом случае, даже при неиз-
неизвестном истинном соотношении шум/сигнал, получается простой способ интерак-
интерактивного экспериментирования путем изменения этой константы и наблюдения ре-
результатов восстановления. Конечно, такой метод является весьма грубым, когда
предполагается, что все функции являются константами. Замена S>q(u, v)/Sf(u, v)
на константу R в приведенной выше формуле для F(u,v) называется параметри-
параметрическим винеровским фильтром. В примере 5.8 показано, что даже такой простой
прием может привести к существенно более лучшему результату, чем при инверс-
инверсной фильтрации.
Винеровская фильтрация реализована в IPT с виде функции deconvwnr, кото-
которая имеет три возможные синтаксические формы. Во всех этих формах g обозна-
обозначает искаженное, a f r — восстановленное изображение. Первая синтаксическая
форма
fr = deconvwnr(g, PSF)
предполагает, что соотношение шум/сигнал равно нулю. Следовательно, такая
форма винеровского фильтра совпадает с инверсным фильтром, рассмотренном
в § 5.6. Синтаксис
textfr = deconvwnr(g, PSF, NSPR)
предполагает, что соотношение шум/сигнал известно или в виде константы, или в
виде массива; годится и то и другое. Этот синтаксис используется для реализации
параметрической винеровской фильтрации. В этом случае аргумент NSPR может
служить интерактивным входным параметром. Наконец, команда вида
fr = deconvwnr(g, PSF, NACORR, FACORR)
5.7. Винеровская фильтрация
предполагает известными автокорреляционные функции NACORR и FACORR шума и
неискаженного изображения. Обратите внимание на то, что в функции deconvwnr
используются автокорреляции rj и /, а не энергетический спектр этих функций.
По теореме о корреляции заключаем, что
\F(u,v)\2 = Z[f(x,y)of(x,y)},
где «о» обозначает операцию корреляции, а9- преобразование Фурье. Это урав-
уравнение дает возможность вычислить автокорреляционную функцию /(х, y)of(x, у)
для использования в deconvwnr, находя обратное преобразование Фурье энер-
энергетического спектра. То же можно сказать про автокорреляционную функцию
шума.
Если восстановленное изображение демонстрирует искажения типа «звоны»,
которые вносятся дискретным преобразованием Фурье, используемым в алгорит-
алгоритме, то иногда с этим явлением позволяет справиться функция edgetaper, кото-
которую следует применить до выполнения функции deconvwnr. Ее синтаксис имеет вид
J = edgetaper(I, PSF).
Эта функция смазывает края входного изображения I, используя функцию раз-
разброса точек PSF. Выходное изображение J есть взвешенная сумма I и его размы-
размытой версии. Весовая матрица, которая определяется автокорреляционной функ-
функцией PSF, присваивает J значения I внутри изображения, а около границ J при-
приравнивается размытой версии I.
Пример 5.8. Применение функции deconvwnr при восстановлении размытого
зашумленного изображения.
Рис. 5.8, а) совпадает с рис. 5.7, г), а рис. 5.8, б) получен командой
>> frl = deconvwnr(g, PSF);
где g — это искаженное изображение, a PSF — функция разброса точек, вычис-
вычисленная в примере 5.7. Как уже отмечалось выше, frl — это результат прямого
применения инверсной фильтрации, и, как ожидалось, на этом изображении пре-
преобладают шумовые эффекты. (Как и в примере 5.7, все изображения были обра-
обработаны функцией pixeldup для их увеличения до размера 512x512 пикселов.)
Число jR, которое обсуждалось ранее в этом параграфе, было получено с по-
помощью исходного и шумового изображений из примера 5.7 по формулам
>> Sn = abs(f ft2(noise)) . Л2; °/0 noise power spectrum
>> nA = sum(Sn(: ))/prod(size(noise)); °/0 noise average power
>> Sf = abs(f ft2(f)) . ; °/0 image power spectrum
>> nA = sum(Sn(:))/prod(size(noise)); % image average power
>> R = nA/fA;
Для восстановления изображения с помощью этого соотношения R выполним
команду
>> fr2 = deconvwnr(g, PSF, R) ;
186 Глава 5. Восстановление изображений
а) б)
г)
Рис. 5.8. а) Размытое и зашумленное изображение, б) Результат инверсной фильтрации.
в) Результат винеровской фильтрации с постоянным соотношением шум/сигнал.
г) Результат винеровской фильтрации с использованием автокорреляционных
функций
Из рис. 5.8, в) видно, что такой подход дает существенное улучшение по срав-
сравнению с инверсной фильтрацией.
Наконец, используем автокорреляционные функции при восстановлении изоб-
изображения (напомним о необходимости использования функции f f tshif t при цен-
центровании) .
>> NCORR = f f tshif t (real (if ft2(Sn)));
>> ICORR = fftshift(real(ifft2(Sf)));
>> fr3 = deconvwnr(g, PSF, NCORR, ICORR);
Из рис. 5.8, г) видно, что результат этих операций весьма близок к оригиналу, хо-
хотя небольшой шум все еще проявляется. Поскольку нам известно само изображе-
изображение и наложенный на него шум, мы можем оценить корректирующие параметры
и сделать заключение, что рис. 5.8, г) дает наилучший результат, который можно
достигнуть винеровской деконволюцией. На практике, когда одна (или более) из
этих величин неизвестна, приходится менять функции для экспериментирования
до тех пор, пока не будет достигнут удовлетворительный результат. ?
5.8. Сглаживающая фильтрация методом наименьших квадратов
5.8. Сглаживающая фильтрация методом наименьших
квадратов со связью
Другой хорошо зарекомендовавший себя метод линейного восстановления заклю-
заключается в фильтрации по методу наименьших квадратов с ограничениями, кото-
который в документации IPT называется сглаживающей фильтрацией. Двумерная
дискретная свертка задается выражением
M-1N-1
h{x, у) * /Or, у) =
т=0 п=0
С помощью этой формулы можно выразить модель линейного искажения д{х,у) —
= h(x,y) * f{x,y) + 77B:, у), которая обсуждалась в § 5.1, в векторно-матричной
форме
Пусть, к примеру, д(х, у) имеет размеры MxN. Тогда можно сформировать пер-
первые N элементов вектора g из элементов изображения, которые располагаются
в первой строке д{х,у), следующие N элементов взять из второй строки д{х,у)
и т. д. В результате получится вектор размера MNxl. Такую же размерность
имеют векторы f и rj, которые строятся по аналогичной схеме. В этом случае
матрица Н имеет размеры MNxMN. Ее элементы берутся из предыдущего урав-
уравнения свертки.
Логично заключить, что задача восстановления изображения может быть пе-
переформулирована в виде простых матричных действий. Однако в данном случае
это не так. Предположим, что мы имеем дело с изображением средних размеров,
например, у которого М = N = 512. Тогда векторы в описанных выше пред-
представлениях будут иметь размерность 262144x1, а у матрицы Н будут размеры
262 144x262 144. Обрабатывать векторы и матрицы таких размеров весьма непро-
непросто. Проблема еще более усложняется тем обстоятельством, что для Н может не
существовать обратной матрицы в силу наличия нулей у передаточной функции
(см. § 5.6). Таким образом, формулировка задачи восстановления в матричной
форме не позволяет облегчить технику восстановления изображений.
Несмотря на то, что мы здесь не собираемся обосновывать метод наимень-
наименьших квадратов со связями, стоит отметить, что центральным местом этого ме-
метода является чувствительность к обращению матрицы Н, о чем говорилось в
предыдущем абзаце. Одним из возможных путей преодоления этой трудности
является оптимизация процедуры восстановления по сглаживающей мере, на-
например, по вторым производным изображения (и, в частности, по лапласиану).
Такая процедура будет иметь смысл, если ограничения задачи являются доступ-
доступными параметрами. Таким образом, требуется найти минимум целевой функции
С, которая определяется по формуле
М-1 N-1
х=0 у=0
при условии выполнения ограничения (связи)
Глава 5. Восстановление изображений
где ||w||2 = wTw — это евклидова норма вектора1, f — это приближение испор-
испорченного изображения, а оператор Лапласа V2 был определен в § 3.5.1.
Решение этой задачи по оптимизации, записанное в частотной области, зада-
задается выражением
где 7 — это некоторый параметр, который следует подобрать так, чтобы выпол-
выполнялось уравнение связи (при 7 — 0 получаем решение для инверсного фильтра),
a P(u,v) — преобразование Фурье функции
р{х,у) =
0 1 О
1 -4 1
О 1 О
В этой функции мы узнаем оператор Лапласа, введенный в § 3.5.1. В предыду-
предыдущих формулах остались неизвестными две величины, 7 и ||?7||2- Однако 7 можно
вычислить интерактивно, если известна скалярная величина ||?7||25 которая про-
пропорциональна энергии шума.
Фильтрация методом наименьших квадратов со связями реализована в IPT в
виде функции deconvreg, которая имеет синтаксис
fr = deconvreg(g, PSF, NOISEPOWER, RANGE),
где g — это искаженное изображение, f г — восстановленное изображение, NOISEPOWER
пропорционально ||т7||25 а RANGE — это диапазон для нахождения решения 7- По
умолчанию это интервал [10~9,109] (или в обозначениях MATLAB, [1е-10,1е10] ).
Если два последних параметра в deconvreg отсутствуют, то эта функция совер-
совершает обычную инверсную фильтрацию. Хорошим начальным приближением для
NOISEPOWER может являться число MN[o~^ + сг2], где М и N — размеры изобра-
изображения, числа в квадратных скобках равны дисперсии и квадрату среднего зна-
значения шума. Эта величина является лишь первым приближением, в то время
как окончательное оптимальное значение может быть совсем иным, что видно в
следующем примере.
Пример 5.9. Использование функции deconvreg при восстановлении смазан-
смазанного заихумленного изображения.
Мы теперь восстановим изображение на рис. 5.7, г) с помощью функции deconvreg.
Это изображение имеет размеры 64x64, а из примера 5.7 нам известно, что его
шум имеет нулевое среднее и дисперсию, равную 0.001 Следовательно, наше на-
начальное приближенное значение для NOISEPOWER равно F4Jх [0.001 + 0] «4.
На рис. 5.9, а) дан результат выполнения команды
>> fr = deconvreg(g, PSF, 4);
хДля вектор-столбца w, имеющего п компонент, wTw = 53JJ=1 u>^, где w^ — &-ая компонента
вектора w.
5.9. Алгоритм Люси-Ричардсона итерационного нелинейного восстановления
где g и PSF взяты из примера 5.7. Это изображение немного лучше исходно-
исходного, однако ясно, что выбранное значение NOISEPOWER не годится с практической
точки зрения. Если немного поэкспериментировать с этим параметром, а так-
также с параметром RANGE, то можно найти оптимальный результат, показанный на
рис. 5.9, б), который был построен командой
>> fr = deconvreg(g, PSF, 0.4, [le-7 Ie7]);
Итак, следует уменьшить величину NOISEPOWER на один порядок, а интервал
диапазона выбрать покомпактнее. Результат винеровской фильтрации того же
изображения приведен на рис. 5.8, г), однако он был получен при наличии пол-
полной информации о спектрах шума и исходного изображения. Без этих ключевых
сведений результаты, достигаемые при экспериментировании с этими фильтра-
фильтрами, часто бывают вполне сравнимы друг с другом. ?
Если в восстановленном изображении наблюдаются «звоны», наведенные дискрет-
дискретным преобразованием Фурье, то справиться с ними позволяет функция edge taper
(см. § 5.7), которую следует применить до вызова deconvreg.
Рис. 5.9. а) Изображение из а) б)
рис. 5.7, г)у восстановленное сгла-
сглаживающим фильтром с пара-
параметром NOISEPOWER = 4. б) То
же восстановленное изображе-
изображения при NOISEPOWER = 0.4 и с
диапазоном RANGE = [1е-7 1е7]
5.9. Алгоритм Люси-Ричардсона итерационного
нелинейного восстановления
Методы восстановления изображений, которые обсуждались в трех предыдущих
параграфах, являются линейными. Кроме того, они являются «прямыми» в том
смысле, что, как только соответствующий фильтр построен, решение задачи вос-
восстановления находится однократным применением этого фильтра. Эта простота
реализации вкупе со скромными требованиями к вычислительным ресурсам, а
также хорошо развитая теоретическая база, сделали линейные методы основны-
основными инструментами восстановления изображений на многие годы.
В последние два десятилетия нелинейные итерационные технологии стали за-
завоевывать популярность в области восстановления изображений, приводя часто к
более лучшим результатам по сравнению с традиционными линейными методами.
Основными недостатками нелинейных методов являются недостаточная предска-
предсказуемость их поведения, а также использование значительных вычислительных
Глава 5. Восстановление изображений
ресурсов. Первый недостаток часто теряет свою актуальность, поскольку пока-
показано, что нелинейные методы превосходят линейные по широкому спектру прило-
приложений (см. [Jansson, 1997]). Второй недостаток также постепенно преодолевается
в виду впечатляющего роста производительности вычислительной техники за по-
последние 10 лет. Нелинейные методы восстановления изображений, имеющиеся в
пакете IPT, разработаны независимо в [Richardson, 1972] и [Lucy, 1974]. В пакете
этот подход называется алгоритмом Люси-Ричардсона (L-R), однако в литера-
литературе он также называется алгоритмом Ричардсона-Люси.
Алгоритм L-R формулируется в терминах метода максимального правдоподо-
правдоподобия (см. § 5.10), в котором изображение моделируется в виде статистик Пуассона.
Максимизация функции правдоподобия модели приводит к уравнению, которое
выполняется при условии сходимости следующих итераций
где, как обычно, «*» обозначает свертку, / — это приближение неиспорченного
изображения, а обе функции / и д определены в § 5.1. Алгоритм, очевидно,
является итерационным, а его нелинейность происходит из-за деления на / в
правой части уравнения.
Как и в любом нелинейном методе, здесь трудно в общем виде ответить на
вопрос: когда следует остановить алгоритм L-R? В конкретных приложениях этот
подход часто сопровождается выводом на экран промежуточных результатов, и
алгоритм останавливается при достижении приемлемых изображений.
Алгоритм L-R реализован в IPT функцией deconvlucy, которая имеет следу-
следующий синтаксис:
fr = deconvlucy(g, PSF, NUMIT, DAMPAR, WEIGHT),
где f r — это восстановленное изображение, g — искаженное изображение, PSF —
функция разброса точек, NUMIT - число итераций (по умолчанию 10), а величины
DAMPAR и WEIGHT определяются следующим образом.
DAMPAR — это скаляр, который определяет порог отклонения полученного
изображения от g. Итерации останавливаются для пикселов, отклонение значе-
значений которых от исходных не превосходит этого порога. Это предотвращает обра-
образование шума в таких пикселах, сохраняя необходимые детали изображения. По
умолчанию DAMPAR = 0 (нет порога остановки).
WEIGHT — это массив размера, как у g, который каждому пикселу присваивает
некоторый вес, отражающий его качество. Например, «плохие» пикселы, кото-
которые получились из дефектных областей на изображения, можно исключить из
рассмотрения, присвоив им нулевой вес. Другое полезное применение этого мас-
массива состоит в подгонке весов пикселов для коррекции однородных областей при
наличии дополнительной информации. При моделировании смазывания конкрет-
конкретным PSF (см. пример 5.7) параметр WEIGHT молено использовать для исключения
из вычислений пикселов, которые расположены на границах изображения и ко-
которые размываются функцией PSF. Если PSF имеет размеры пхп, то в WEIGHT
5.9. Алгоритм Люси-Ричардсона итерационного нелинейного восстановления 191
используется обрамление из нулей ширины ceil(n/2). По умолчанию WEIGHT
состоит из одних единиц и имеет размеры, как у изображения g.
Рис. 5.10. а) Исходное а) б)
изображение, б) Изобра-
Изображение, размытое и ис-
испорченное гауссовым шу-
шумом. в)-е) Изображения,
восстановленные по алго-
алгоритму L-R, соответствен-
соответственно, после 5, 10, 20 и 100
итераций
в) г)
д) е)
Если в восстановленном изображении наблюдаются «звоны», производимые
дискретным преобразованием Фурье, то подавить их можно функцией edgetaper
(см. § 5.7), которую надо применять до вызова deconvlucy.
Пример 5.10. Использование функции deconvlucy при восстановлении смазан-
смазанного и зашумленного изображения.
На рис. 5.10, а) показано изображение, построенное командой
>> f = checkerboard^) ;
и имеющее размеры 64x64 пикселов. Как и раньше, его размеры были увели-
увеличены до 512x512 функцией pixeldup для лучшего визуального восприятия:
Глава 5. Восстановление изображений
imshow(pixeldup(f, 8));
Следующая команда создала гауссову PSF размера 7x7 со стандартным от-
отклонением 10:
>> PSF = fspeciaK'gaussian', 7, 10);
Затем мы размыли изображение f с помощью функции PSF и прибавили к
нему случайный гауссов шум с нулевым средним и стандартным отклонением
0.01:
>> SD = 0.01;
>> g = imnoise(imfilter(f, PSF), 'gaussian', 0, SD~2);
На рис. 5.10, б) дан результат.
Остальная часть примера относится к восстановлению изображения g с помо-
помощью функции deconvlucy. Зададим параметр DAMPAR:
>> DAMPAR = 10*SD;
Массив WEIGHT строится по описанной выше схеме:
>> LIM = ceil (size (PSF), l)/2);
>> WEIGHT = zeros (size (g) );
» WEIGHT(LIM + l:end - LIM, LIM + l:end - LIM) = 1;
Размеры массива WEIGHT равны 64x64. На его границах располагается бордюр
нулевых пикселов ширины 4, а все остальные пикселы равны 1.
Остался неопределенным параметр NUMIT, который обозначает число итера-
итераций. На рис. 5.10, в) приведен результат выполнения команд
>> NUMIT = 5;
» fr = deconvlucy(g, PSF, NUMIT, DAMPAR, WEIGHT);
>> imshow(pixeldup(fr, 8))
Изображение немного улучшилось, но осталось достаточно размытым. Рис. 5.10, г)
и д) представляют результаты, полученные при NUMIT = 10 и 20. Последний из
них можно смело считать восстановлением исходного смазанного и зашумлен-
ного изображения. На самом деле, дальнейшее увеличение числа итераций не
приводит к значительным улучшениям. Например, рис. 5.10, е) получен после
100 итераций. Это изображение лишь чуть-чуть точнее и ярче результата после
20 итераций. Тонкий черный бордюр на всех восстановленных изображениях по-
получился потому, что в массиве WEIGHT на соответствующих местах стоят нули. ?
5.10. Слепая деконволюция
Одна из самых сложных проблем, возникающая при восстановлении изображе-
изображений, состоит в получении подходящих приближений функции PSF для исполь-
использования в алгоритмах восстановления, которые обсуждались в предыдущих па-
параграфах. Как уже отмечалось ранее, методы восстановления изображений, в
5.10. Слепая деконволюция
которых не используется информация, характеризующая функцию PSF, называ-
называются алгоритмами слепой деконволюции.
Метод слепой деконволюции, к которому было обращено внимание исследова-
исследователей последние двадцать лет, основан на приближении по максимуму правдопо-
правдоподобия (MLE, Maximum-Likelihood Estimation) — стратегии оптимизации при по-
построении приближений величин, искаженных случайным шумом. Вкратце можно
сказать, что в интерпретации MLE изображение считается случайно выбранным
с некоторой определенной вероятностью из семейства других возможных случай-
случайных величин. Функция правдоподобия выражается через функции д(х, у), /(х, у)
и h(x,y) (см. § 5.1), и задача заключается в нахождении максимума функции
правдоподобия. При слепой деконволюции задача оптимизации решается итера-
итеративно при выполнении соответствующих ограничений и при условии сходимости
всей процедуры. Максимизирующая пара функций / (х, у) и h(x, у) считается вос-
восстановленным изображением и соответствующей функцией PSF.
Вывод алгоритма слепой деконволюции выходит за рамки нашего обсужде-
обсуждения, но читатель может найти основательное изложение этого материала в следу-
следующей литературе: основы приближений по максимуму правдоподобия изложены
в классической книге [Van Trees, 1968]. Обзор многих интересных работ по об-
обработке изображений в этой области имеется в [Dempster et al., 1977], а также в
более позднем расширении этой работы в [Holmes, 1992]. Хорошим справочником
по деконволюции является книга [Jansson, 1997]. Подробные примеры по исполь-
использованию деконволюции в микроскопии и астрономии приведены, соответственно,
в работе [Holmes et al., 1995] и в [Hanisch et al., 1997].
В пакете слепая деконволюция представлена функцией deconvblind, которая
имеет синтаксис
[fr, PSFe] = deconvblind(g, INITPSF),
где g — искаженное изображение, INITPSF — первое приближение функции PSF,
PSFe — конечное вычисленное приближение этой функции, a f r — восстановлен-
восстановленное изображение на основе найденной функции PSF. Функция использует при
вычислениях итеративный алгоритм L-R, описанный выше. Приближение PSF
сильно зависит от размера начальной оценки и, в меньшей степени, от ее значе-
значений (массив из одних единиц является разумной начальной оценкой).
В этой форме функции число итераций равно 10 (принято по молчанию).
Дополнительные параметры, которые можно включить в аргументы функции
deconvblind контролируют число итераций и другие особенности процесса вос-
восстановления:
[fr, PSFe] = deconvblind(g, INITPSF, NUMIT, DAMPAR, WEIGHT).
Параметры NUMIT, DAMPAR и WEIGHT объяснялись при описании алгоритма L-R в
предыдущем параграфе.
Если в восстановленном изображении имеются «звоны» от дискретного пре-
преобразования Фурье, то подавить их поможет функция edge taper (см. § 5.7), ко-
которую надо вызвать до применения deconvblind.
Глава 5. Восстановление изображений
Пример 5.11. Использование функции deconvblind при построении прибли-
приближения PSF.
На рис. 5.11, а) изображена функция PSF, которая использовалась при построе-
построении искаженного изображения на рис. 5.10, б):
» PSF = fspeciaH'gaussian5, 7, 10);
>> imshow(pixeldup(PSF, 73), [ ]);
Как и в примере 5.10, искаженное изображение, которое будет изучаться, полу-
получено командами
>> SD = 0.01;
>> g = imnoise(imfilter(f, PSF), 'gaussian', 0, SD~2);
В данном примере нас интересует использование функции deconvblind для по-
построения приближения PSF, если известно только искаженное изображение g. На
рис. 5.11, б) приведен результат следующих команд:
>> INITPSF = ones (size (PSF));
>> NUMIT = 5;
>> [fr, PSFe] = deconvblind(g, INITPSF, NUMIT, DAMPAR, WEIGHT);
>> imshow(pixeldup(PSFe, 73), [ ]);
где значения DAMPAR и WEIGHT были взяты из примера 5.10.
а) б)
в) г)
Рис. 5.11. а) Исходная функция PSF. б)-г) Приближения PSF, соответственно, после 5,
10 и 20 итераций функции deconvblind
5.11. Геометрические преобразования и регистрация изображений
Рис. 5.11, в) и г) показывают функции PSFe, построенные теми же командами,
но после выполнения, соответственно, 10 и 20 итераций. Последний результат
весьма близок к исходной PSF из рис. 5.11, а). ?
5.11. Геометрические преобразования и регистрация
изображений
В завершении этой главы мы рассмотрим геометрические преобразования, кото-
которые используются при восстановлении изображений. Геометрические преобразо-
преобразования изменяют пространственные соотношения между пикселами изображения.
Их иногда называют преобразованиями куска резины, поскольку их можно себе
представить, если нанести изображение на кусок резины, а затем растягивать его
в соответствии с предписанными правилами.
Геометрические преобразования часто используются при регистрации изоб-
изображений. В этом процессе участвуют два изображения на одной сцене, которые
необходимо наложить друг на друга с целью визуализации или количественного
сравнения. В следующих подпараграфах обсуждаются:
A) пространственные преобразования и способы их визуализации в MATLAB;
B) применение пространственных преобразований к конкретным изображениям;
C) задание пространственных преобразований для регистрации изображений.
5.11.1. Пространственные преобразования
Пусть изображение /, заданное в координатной система (w,z), подвергается гео-
геометрической деформации, в результате которой получается изображение д в ко-
координатной системе (ж, у). Это (координатное) преобразование можно записать
в виде формулы
Например, если (ж, у) = T{(w,z)} = (w/2, z/2), то «искажение» сводится к двой-
двойному сжатию по обеим пространственным измерениям, как показано на рис. 5.12.
Чаще всего используется класс геометрических преобразований, представи-
представители которого называются аффинными преобразованиями (см. [Wolberg, 1990]).
Аффинное преобразование можно записать в матричной форме
ху
l] = [w z 1]1
" = [w zl]
til
t31
tl2
^22
^32
0
0
1
Такой формулой можно задать сжатие, поворот, перенос или сдвиг, соответствую-
соответствующим образом определяя элементы матрицы Т. В табл. 5.3 показано, как выбирать
эти величины для совершения различных преобразований.
Глава 5. Восстановление изображений
Г{E,2)} B.5,1)
Рис. 5.12. Простое простран-
пространственное преобразование. (За-
(Заметим, что оси ху на рисун-
рисунке не соответствуют коорди-
координатной системе изображения,
заданной в § 2.1.1. Там же об-
обращалось внимание на то, что
IPT использует т. н. простран-
пространственную координатную систе-
систему, в которой у обозначает
строки, а х — столбцы. Далее
в этом параграфе используется
именно эта система для совме-
совместимости с документацией IPT
по части геометрических пре-
преобразований.)
Таблица 5.3. Типы аффинных преобразований
Тип
Аффинная
матрица Т
Координатное
уравнения
Диаграмма
Тождество
Растяжение
Поворот
Сдвиг
(горизонтальный)
Сдвиг
(вертикальный)
Перенос
1 О О
О 1 О
0 0 1
sx О О
О sy О
0 0 1
О О
а 1
О О
1
О 1
о о
/5 О
О
1
cos в sin 0 О
cos0 О
О 0 1
х = w
y = z
х = sxw
y = syz
х = w cos в — z sin 9
у = w sin в + z cos в
X =
У =
х =
У =
х =
w + az
z
w
/3w + z
w + Ex
В пакете IPT пространственное преобразование задается в виде т. н. tform-
структуры1. Один путь определения структуры состоит в использовании функ-
. §§ 2.10.6 и 11.1.1, где обсуждались структуры.
5.11. Геометрические преобразования и регистрация изобраснсений
ции makef orm, вызов которой имеет вид
tform = maketform(transform_type, transform_parameters).
Первый входной аргумент transf orm_type может принимать значения ' af f ine',
'projective', 'box', 'composite', или 'custom'. Эти типы преобразований объ-
объяснены в табл. 5.4 в § 5.11.3. Остальные аргументы зависят от выбранного типа
преобразования, и они разъясняются на справочной странице функции makef orm.
Рассмотрим некоторые аффинные преобразования. Например, можно опре-
определить аффинную tform-структуру, прямо описав ее матрицу Т следующим спо-
способом:
>> Т = [2 0 0; 0 3 0; 0 0 1] ;
>> tform = maketformCaffine' , Т)
tform =
ndims_in:2
ndims.out:2
forward.f en:@fwd_aff ine
inverse_fcn:@inv_affine
tdata:[lxl struct]
Хотя пользователю не потребуется напрямую обращаться к полям структуры
tform, сообщим, что информация о матрице Т и о ее обратной Т хранится в
поле tdata:
>> tform.
ans =
Т:3 х
Tinv:3 x
>> tform.
ans =
200
030
001
tdata
3 double
3 double
tdata.T
>> tform. tdata. Tinv
ans =
0.5000 0 0
00.3333 0
0 01.0000
В пакете IPT имеются две функции, с помощью которых пространствен-
пространственное преобразование применяется к точкам: tformfwd вычисляет прямое преоб-
преобразование T{(w, z)}, а функция tforminv вычисляет обратное преобразование
Т~1{(х, у)}. Форма вызова tf ormfwd имеет вид XY = tformfwd(WZ, tform). Здесь
WZ — матрица Рх2, в каждой строке которой стоят пары w и z координат од-
одной точки из. Р. Аналогично, XY — это матрица, столбцы которой содержат х-
и ^/-координаты Р преобразованных точек. Например, следующие команды вы-
вычисляют прямое преобразование пары точек, после чего вычисляется обратное
преобразование для проверки, получаются ли исходные данные:
Глава 5. Восстановление изображений
» WZ = [1 1; 3 2] ;
>> XY = tformfwd(WZ, tform)
XY
2 3
6 б
>> WZ2 = tforminv(XY, tform)
WZ2
1 1
3 2
Чтобы лучше почувствовать то или иное пространственное преобразование,
полезно посмотреть на то, как оно действует на изображение, содержащее ко-
координатную сетку. Следующая М-функция vistf ormfwd строит координатную
сетку, преобразует ее с помощью tformfwd, а затем размещает рядом графики
этой сетки и ее преобразования для удобства сравнения. Обратите внимание на
совместное употребление функций meshgrid (§ 2.10.4) и linspace (§ 2.8.1) при
построении сетки. Следующий программный код также иллюстрирует использо-
использование некоторых других функций, описанных ранее.
function vistformfwd(tform, wdata, zdata, N)
°/oVISTFORMFWD Visualize forward geometric transform.
°/o VISTFORMFWD(TFORM, WRANGE, ZRANGE, N) shows two plots: an N-by-N
% grid in the W-Z coordinate system, and the spatially transformed
% grid in the X-Y coordinate system. WRANGE and ZRANGE are
% two-element vectors specifying the desired range for the grid. N
°/o can be omitted, in which case the default value is 10.
if nargin < 4
N = 10;
end
% Create the w-z grid and transform it.
[w, z] = meshgrid(linspace(wdata(l), zdataB), N), ...
linspace(wdataA), zdataB), N));
wz = [w(:) z(:)];
xy = tformfwd([w(:) z(:)], tform);
°/o Calculate the minimum and maximum values of w and x,
°/o as well as z and y. These are used so the two plots can be
% displayed using the same scale.
x = reshape(xy(: , 1), size(w)); °/0 reshape is discussed in Sec. 8.2.2.
у = reshape(xy(:, 2), size(z));
wx = [w(:); x(:)];
wxlimits = [min(wx) max(wx)];
zy = [z(:); y(:)];
zylimits = [min(zy) max(zy)];
°/o Create the w-z plot.
subplotA,2,1) % See Section 7.2.1 for a discussion of this function.
plot(w, z, JbJ), axis equal, axis ij
hold on
5.11. Геометрические преобразования и регистрация изображений 199
plot(w', z\ 'Ъ')
hold off
xlim(wxlimits)
ylim(zylimits)
vistformfwd
Пример 5.12. Визуализация некоторых аффинных преобразований функцией
vistformfwd.
В этом примере мы проиллюстрируем действие некоторых аффинных преобра-
преобразований с помощью функции vistf ormfwd. Кроме того, для создания аффинной
tf orm мы воспользуемся еще одним подходом использования функции maketf orm.
Начнем с аффинного преобразования, которое растягивает изображение в 3 раза
по горизонтали и в 2 раза по вертикали:
>> Т1 = [3 0 0; 0 2 0; 0 0 1] ;
>> tforml = maketformOaffine', Tl) ;
>> vistformfwd(tforal, [0 100], [0 100]);
На рис. 5.13, а) и б) даны результаты.
Эффекты сдвига наблюдаются, если элементы ?21 и t\2 в аффинной матрице
Т являются ненулевыми:
>> Т2 = [1 0 0; .2 1 0; 0 0 1] ;
>> tform2 = maketformC'affine' , T2) ;
>> vistf ormfwd (tform2, [0 100], [0 100]);
На рис. 5.13, в) и г) показаны эффекты сдвига применительно к координатной
сетке.
Важное свойство аффинных преобразований состоит в том, что любая их ком-
комбинация снова является аффинным преобразованием. Математически матрица Т
этого аффинного преобразования получается перемножением соответствующих
аффинных матриц. Следующий блок команд генерирует и отображает аффин-
аффинное преобразование, которое получается комбинацией растяжения, поворота и
сдвига.
>> Tscale = [1.5 0 0; 0 2 0; 0 0 1];
>> Trotation = [cos(pi/4) sin(pi/4) 0;
-sin(pi/4) cos(pi/4) 0; 0 0 1];
>> Tshear = [1 0 0; .2 1 0; 0 0 1] ;
>> T3 = Tscale*Trotation*Tshear;
>> tform3 = maketform('affine', T3) ;
>> vistf ormfwd (tform3, [0 100], [0 100]);
На рис. 5.13, д) и е) приведен результат. D
200 Глава 5. Восстановление изображений
а)
0
50
N 100
150
200
в)
О
20
40
60
80
100
О
100
200
б)
300
—
-
-
1
50
100
150
200
-
-
_
100
200
30
-
-
_
О 20 40 60 80 100 120
г)
-
-
1
1
1
1
1
1
1
1
-
о
20
40
60
80
100
О 20 40 60 80 100 120
\ \'\ \'\
\\\\\
\\\\
-\\\\
\\\\
-\\\\
\\\\
' \\\
\ \ \
\\\\
\\\
\\\\
\\\\
\\\\
\\\\
\ \\
\\\\
\\\,\
1 \
\\ -
\ \
\\-
\ \
\ \ \"
\\ V
\\ \
\.\ \
д)
и
50
100
150
200
100 50 (
i i
i i
)
w
5С
1
100
i
-
-
е)
0
50
100
150
200
100 50
i i
0
1
Л/
Y
i \/
50
/
100
1
V
1
Рис. 5.13. Визуализация аффинных преобразований с помощью сетки, а) Сетка 1. б) Сет-
Сетка 1, преобразованная с помощью tforml. в) Сетка 2. г) Сетка 2, преобразо-
преобразованная с помощью tf orm2. д) Сетка 3. е) Сетка 3, преобразованная с помощью
tform3
5.11.2. Применение пространственных преобразований
к изображениям
Большинство вычислительных методов пространственного преобразования изоб-
изображений можно разделить на две категории: методы, использующие прямое отоб-
5.11. Геометрические преобразования и регистрация изобраэюепий
ражение, и методы, основанные на обратном отображении. Методы прямого
отображения берут каждый пиксел и копируют его в место на выходном изоб-
изображении, координаты которого вычисляются по формуле T{(w,z)}. При этом
возникает проблема: что делать с двумя или большим числом входных пикселов,
которые преобразуются в один и тот же пиксел, т. е. как скомбинировать крат-
кратные величины входных пикселов для получения одного-единственного выходного
пиксела. Другая потенциальная сложность состоит в том, что на выходном изоб-
изображении могут оказаться точки, на которые не отобразился ни один входной пик-
пиксел. В более изощренной форме прямого отображения четыре вершины входного
пиксела отображаются в вершины неправильного четырехугольника на выход-
выходном изображении. Входные пикселы распределяются среди выходных пикселов
в соответствии с тем, сколько раз накрывается каждый пиксел относительно пло-
площади каждого выходного пиксела. Такая форма прямого отображения является
более точной, однако она будет существенно сложнее и потребует больших вы-
вычислительных средств при реализации.
Функция IPT imtransf orm, напротив, использует обратное отображение. Про-
Процедура обратного отображения берет поочередно пикселы выходного изображе-
изображения и вычисляет координаты соответствующих точек — прообразов входного
изображения по формуле Т-1{(х,2/)}, а затем делает интерполяцию по ближай-
ближайшим пикселам входного изображения для определения величины выходного пик-
пиксела. Обратное преобразование бывает проще реализовать, чем прямое.
Основная форма вызова функции imtransf orm имеет вид
g = imtransform(f, tform, interp),
где interp — это строка символов, которая определяет метод интерполяции ближай-
ближайших пикселов для вычисления значения выходного пиксела. Переменная interp
имеет три возможных значения: 'nearest', 'bilinear' и 'bicubic'. Если interp
опущена, то по умолчанию используется 'bilinear'. Как и в предыдущих при-
примерах, в качестве тестового изображения при экспериментировании с простран-
пространственными преобразованиями будет использоваться шахматная доска.
Пример 5.13. Пространственное преобразование изображений.
Мы воспользуемся функциями checkerboard и imtransf orm для исследования
некоторых аспектов преобразования изображений. Линейное конформное преоб-
преобразование является частным случаем аффинного преобразования, при котором
сохраняются формы и углы. Линейное конформное преобразование задается ко-
коэффициентом растяжения/сжатия, углом поворота и вектором переноса. В этом
случае аффинная матрица имеет вид
SCOsO
—ssm6
sx
ssinQ
SCOS0
Sy
0 "
0
1
Следующая последовательность команд строит линейное конформное преобра-
преобразование и применяет его к тестовому изображению:
>> f = checkerboardE0);
>> s = 0.8;
Глава 5. Восстановление изображений
» theta = pi/6;
>> Т = [s*cos(theta) s*sin(theta) 0;
-s*sin(theta) s*cos(theta) 0;
0 0 1];
>> tform = maketform('affine', T) ;
>> g = imtransf orm (f , tform);
На рис. 5.14, а) и б), показаны исходное и преобразованное изображения шахмат-
шахматной доски. Завершающий вызов функции imtransf orm использовал по умолча-
умолчанию метод интерполяции 'bilinear'. Как уже отмечалось, имеется возможность
выбрать другой метод интерполяции, например, по ближайшему соседу, который
задается явно при вызове функции imtransf orm:
>> g2 = imtransform(f, tform, 'nearest');
На рис. 5.14, в) показан результат этой команды. Интерполяция по ближай-
ближайшему соседу выполняется быстрее, чем билинейная интерполяция, поэтому она
может оказаться более предпочтительной в определенных ситуациях, однако ре-
результат бывает хуже по качеству, чем при билинейной интерполяции.
а)
д)
Рис. 5.14. Аффинные преобразования шахматной доски, а) Исходное изображение, б) Ли-
Линейное конформное преобразование с использованием (по умолчанию) билиней-
билинейной интерполяции, в) Интерполяция по ближайшему соседу, г) Задание аль-
альтернативного цвета для внешнего заполнения, д) Контролирование выходного
пространства для сохранения переносов
5.11. Геометрические преобразования и регистрация изобраэюений
Функция imtransf orm имеет несколько опционных параметров, которые мо-
могут быть полезны. Например, параметр Fill Value контролирует цвет, который
функция использует для пикселов, которые находятся вне входного изображения:
>> g3 = imtransform(f, tform, 'FillValue', 0.5);
Из рис. 5.14, в) видно, что внешняя часть изображения окрашена теперь в серый
цвет, а не в черный.
Другие дополнительные параметры помогают разрешить иной источник недо-
недоразумений, связанных с переносом изображений с помощью imtransf orm. Напри-
Например, следующие команды совершают обычный параллельный перенос:
>> Т2 = [1 0 0; 0 1 0; 50 50 1] ;
>> tform2 = maketformOaffine' , Т2) ;
>> g4 = imtransf orm(f, tf orm2) ;
Однако результат будет идентичен исходному изображению на рис. 5.14, а). В этом
проявляется эффект функции imtransf orm, заложенный по умолчанию. А имен-
именно: функция imtransf orm определяет ограничивающий прямоугольник (см. опре-
определение этого понятия в § 11.4.1) выходного изображения в выходной системе
координат, и по умолчанию обратное преобразование совершается только для
пикселов этого прямоугольника. При этом отменяются переносы. Задав пара-
параметры XData и YData, можно точно указать функции imtransf orm, где именно
в выходном пространстве следует вычислять результат. XData — это вектор из
двух компонент, который обозначает координаты верхнего левого угла выходного
изображения, a YData содержит координаты нижнего правого угла. Следующая
команда совершает вычисления в выходной области, расположенной между точ-
точками (ж,у) = A,1) и (ж,у) = D00,400).
>> g5 = imtransform(f, tform2, 'XData5, [1 400], 'YData', [1 400], ...
'FillValue', 0.5);
На рис. 5.14, д) приведен результат.
Другие настройки функции imtransf orm и связанные с ними функции IPT
обеспечивают дополнительные возможности воздействия на результат простран-
пространственного преобразования, в частности, на совершение интерполяции. Относящу-
Относящуюся к этому вопросу информацию можно взять со справочной страницы функций
imtransf orm и makeresampler. ?
5.11.3. Регистрация изображений
Методы регистрации изображений делают пригонку разных изображений од-
одной и той же сцены. Например, эти изображения могли быть получены пример-
примерно в одно и то же время, но разными регистрирующими устройствами, напри-
например, сканированием магнитно-резонансным методом и одновременно позитронно-
эмиссионной томографией. Или, возможно, изображения были сняты одним и
тем же устройством, но в разные моменты времени. Например, фотоснимки со
спутника, сфотографированные через несколько дней, месяцев или лет. В лю-
любом случае, комбинирование изображений, количественный анализ и сравнение
требует компенсации геометрических аберраций, происходящих от разных углов
Глава 5. Восстановление изображений
наклона фотокамеры, разницы расстояния и особенностей ориентации объектов
съемки, а также из-за различия разрешения регистрирующих устройств, переме-
перемещения объектов и влияния других факторов.
В пакете поддерживается метод регистрации изображений на основе кон-
контрольных точек, иногда называемых точками привязки. Контрольные точки
образуют подмножество пикселов, координаты которых на обоих изображениях
известны или могут быть выбраны интерактивно. На рис. 5.15 проиллюстрирова-
проиллюстрирована идея контрольных точек на тестовом изображении и на измененном тестовом
изображении, подвергнутом проективному искажению. Если выбрано достаточ-
достаточное количество контрольных точек, функция cp2tf orm из IPT подбирает под-
подходящее преобразование предписанного типа по этим контрольным точкам (при
этом используется метод наименьших квадратов). Типы пространственных пре-
преобразований, которые распознаются функцией cp2tf orm, перечислены в табл. 5.4.
а) б) в)
Рис. 5.15. Регистрация изображений с помощью контрольных точек, а) Исходное изобра-
изображение с контрольными точками (маленькие квадратики, наложенные на изоб-
изображение), б) Геометрически искаженное изображение с контрольными точка-
точками, в) Скорректированное изображение с помощью проективного преобразо-
преобразования, построенного по контрольным точкам
Пусть, к примеру, f обозначает изображение на рис. 5.15, a), a g — это изоб-
изображение на рис. 5.15, б). Координаты контрольных точек на изображении f:
(83,81), D50,56), D3,293), B49,392) и D36,442). Соответствующие контрольные
точки на изображении g имеют координаты F8,66), C75,47), D2, 286), B75,434),
и E23, 532). Тогда команда по пригонке изображений f и g имеет вид:
>> basepoints = [83 81; 450 56; 43 293; 249 392; 436 442];
>> inputpoints = [68 66; 375 47; 42 286; 275 434; 523 532];
>> tform = cp2tform(inputpoints, basepoints, 'projective');
>> gp = imtransform(g, tform, 'XData' , [1 502], 'YData', [1 502]);
На рис. 5.15, в) показано преобразованное изображение.
В пакете IPT также предусмотрен графический пользовательский интерфейс
для ручного выбора контрольных точек на паре изображений. Рис. 5.16 пред-
представляет собой снимок с дисплея компьютера окна этого инструмента, который
вызывается командой cpselect.
Выводы 205
Таблица 5.4. Типы преобразований, которые поддерживают функции cp2tform
и maketform
Тип
преобразования
Описание
Функции
Affine Композиция растяжения/ сжатия, поворота, сдвига и перено- maketf orm
са. Прямые линии остаются прямыми, параллельные линии cp2tf orm
остаются параллельными.
Box Независимое растяжение/сжатие и перенос по любой раз- maketf orm
мерности; подмножество аффинных преобразований.
Composite Семейство пространственных преобразований, которые при- maketf orm
меняются последовательно.
Custom Пространственное преобразование, заданное пользователем, maketf orm
который определяет функции для вычисления Т и Т-1.
Linear conformal Растяжение/сжатие (одинаковое по обеим размерностям), cp2tform
поворот и перенос; подмножество аффинных преобразований.
LWM Локальное взвешенное среднее; локально варьируемое про- cp2tform
странственное преобразование.
Piecewise linear Локально варьируемое пространственное преобразование. cp2tf orm
Polynomial Входные пространственные координаты выражаются в виде cp2tf orm
полиномиальных функций входных координат.
Projective Как и при аффинных преобразованиях, прямые линии оста- maketf orm
ются прямыми, однако параллельные переходят в непарал- cp2tf orm
лельные с удаленной точкой пересечения.
Выводы
Материал этой главы является хорошим
примером того, как функции MATLAB
и IPT могут быть использованы при вос-
восстановлении изображений, а также то-
того, как на их основе можно строить мо-
модели, позволяющие описывать процес-
процессы искажения, которым подвергаются
изображения. Возможности пакета IPT
при генерации шума были существен-
существенно расширены с помощью разработан-
разработанных в этой главе функций imnoise2 и
imnoise3. Кроме того, пространствен-
пространственные фильтры, получаемые функцией
spf ilt [особенно нелинейные фильтры]
сильно расширяют возможности пакета
в этой сфере приложений. Эти функ-
функции являются замечательными приме-
примерами того, как относительно простыми приемами можно внедрять функции
MATLAB и IPT в новый программный код для построения приложений, кото-
которые усиливают возможности существующего арсенала инструментов и средств
для обработки цифровых изображений.
Рис. 5.16. Интерактивный интерфейс для
выбора контрольных точек
ГЛАВА 6
ОБРАБОТКА
ЦВЕТНЫХ
ИЗОБРАЖЕНИЙ
Введение
В этой главе обсуждаются основы цифровой обработки цветных изображений
средствами пакета IPT, а также приводится ряд новых инструментов, расширя-
расширяющих функциональные возможности пакета. В этой главе предполагается, что
читатель знаком с базовыми принципами и с основной терминологией обработки
цветных изображений хотя бы на начальном уровне.
6.1. Представление цветных изображений в MATLAB
Как отмечалось в § 2.6, в пакете IPT цветные изображения представимы в двух
видах: в виде индексированных изображений или в виде RGB (Red, Green, Blue)
изображений. В этом параграфе подробно рассматриваются эти два типа изоб-
изображений.
6.1.1. RGB изображения
Цветным RGB изображением называется массив MxiVx3, состоящий из цвет-
цветных пикселов, причем каждый такой пиксел является триплетом, элементы кото-
которого соответствуют трем цветовым компонентам: красному, зеленому и синему.
Расположение этих пикселов на цветном RGB изображении показано на рис. 6.1
(стр. 224). RGB изображение можно представлять себе в виде «стека» трех моно-
монохромных изображений с градацией серого цвета, которые подаются на красный,
зеленый и синий входы цветного монитора, в результате чего формируется цвет-
цветное изображение на экране. Принято называть три монохромных изображения,
формирующих единое RGB изображение, красной, зеленой и синей составля-
составляющей (компонентой) изображения. Класс компонент изображения определяет
область их значений. Если класс данных цветовой компоненты есть double, то
область значений — интервал [0,1]. Аналогично, области значений [0,255] или
[0,65535], соответственно, у RGB изображений класса uint8 и uintl6. Число
битов, используемых для представления величины цветного пиксела по всем со-
составляющим RGB, называется глубиной цвета изображения. Например, если
каждая компонента является 8-ми битовым изображением, то соответствующее
RGB изображение имеет глубину 24 бита. Обычно, составляющие имеют оди-
одинаковое число битов. В этом случае число возможных цветов в палитре RGB
6.1. Представление цветных изображений в MATLAB
равно 236, где b — это число бит каждой цветной компоненты. В 8-ми битном
представлении всего имеется 16 777 216 цветов.
Пусть f R, f G и f В обозначают три составляющие RGB изображения. Соот-
Соответствующее им цветное GRB изображение строится с помощью оператора cat
(concatenation, соединение, сцепление):
rgb_image = cat(fR, fG, fB).
Порядок расположения цветовых составляющих в этой формуле весьма важен.
В общем случае, оператор cat (dim, Al, А2, . . .) связывает массивы вдоль раз-
размерности, обозначенной в переменной dim. Например, если dim = 1, то массивы
располагаются по вертикали, если dim = 2, то — по горизонтали, а если dim = 3,
то они укладываются по третьему измерению в виде «стека», как показано на
рис. 6.1.
Если все три составляющие изображения идентичны, то в результате полу-
получается изображение в шкале градации (оттенков) серого цвета. Пусть rgb_ image
обозначает некоторое RGB изображение. Следующие три команды извлекают
цветовые составляющие:
>> fR = rgb_image(:, : , 1) ;
>> fG = rgb_image(: , : , 2) ;
>> fB = rgb_image(:, : , 3);
Цветовое пространство RGB принято изображать графически в виде цветового
куба, как дано на рис. 6.2 (стр. 225). Вершины куба бывают первичными (крас-
(красная, зеленая и синяя) и вторичными (голубая, пурпурная и желтая) цветами
яркости.
Иногда бывает необходимо рассмотреть цветовой куб с разных сторон. Для
этого используется функция rgbcube со следующим синтаксисом:
rgbcube(vx, vy, vz).
Набрав после приглашения MATLAB команду rgbcube (vx, vy, vz), можно уви-
увидеть на экране цветовой куб RGB из точки с координатами (vx, vy, vz). По-
Полученное изображение можно сохранить на диске с помощью команды print,
которая обсуждалась в § 2.4. Далее приводится программный код этой функции,
который сам себя объясняет1.
function rgbcube(vx, vy, vz)
7,RGBCUBE Displays an RGB cube on the MATLAB desktop.
У. RGBCUBE (VX, VY, VZ) displays an RGB color cube, viewed from point
У. (VX, VY, VZ). With no input arguments, RGBCUBE uses A0, 10, 4)
°/o as the default viewing coordinates. To view individual color
°/0 planes, use the following viewing coordinates, where the first
°/, color in the sequence is the closest to the viewing axis, and the
% other colors are as seen from that axis, proceeding to the right
1 Функция patch строит закрашенный многоугольник на плоскости, пользуясь заданными вели-
величинами/парами. См. дополнительную информацию об этой функции на справочной странице.
208 Глава 6. Обработка цветных изображений
^/
% right (or above), and then moving clockwise.
°/, COLOR PLANE ( vx, vy, vz)
7, Blue-Magenta-White-Cyan ( 0, 0, 10)
°/o Red-Yellow-White-Magenta ( 10, 0, 0)
% Green-Cyan-White-Yellow ( 0, 10, 0)
7, Black-Red-Magenta-Blue ( 0, -10, 0)
У. Black-Blue-Cyan-Green (-10, 0, 0)
У. Black-Red-Yellow-Green ( 0, 0, -10)
7o Set up parameters for function patch.
vertices.matrix =[0 0 0;0 0 l;0 1 0;0 1 1;1 0 0;l 0 1;1 1 0;l 1 1];
faces.matrix = [1 5 6 2;1 3 7 5;1 2 4 3;2 4 8 6;3 7 8 4;5 6 8 7] ;
colors = vertices_matrix;
7o The order of the cube vertices was selected to be the same as
% the order of the (R,G,B) colors (e.g., @,0,0) corresponds to
7o black, A,1,1) corresponds to white, and so on.)
% Generate RGB cube using function patch.
patch('Vertices', vertices_matrix, 'Faces', faces.matrix, ...
'FaceVertexCData', colors, 'FaceColor', 'interp', ...
'EdgeAlpha', 0)
7o Set up viewing point,
if nargin == 0
vx = 10; vy = 10; vz = 4;
elseif nargin ~= 3
error('Wrong number of inputs.')
end
axis off
view([vx, vy, vz])
axis square
6.1.2. Индексированные изображения
Индексированное изображение имеет две компоненты: числовую матрицу дан-
данных X и матрицу цветовой карты тар. Матрица тар представляет собой массив
размеров тхЗ класса double, в котором записаны вещественные числа с плаваю-
плавающей запятой из интервала [0,1]. Длина т цветовой карты равна числу различных
цветов на данном изображении. Каждая строка матрицы тар2 обозначает крас-
красную, зеленую и синюю компоненту одного цвета. Индексированное изображение
использует «прямое отображение» величин яркости (насыщенности, цветного то-
тона) пикселов в значения цветовой карты. Цвет каждого пиксела определяется с
2Если все три столбца тар равны между собой, то цветовая карта превращается в карту града-
градаций серого цвета.
6.1. Представление цветных изобраэюений в MATLAB
помощью соответствующего числа, стоящего в матрице X, которое использует-
используется в виде указателя на тар. Если X имеет класс double, то все его компонен-
компоненты с величинами, меньшими или равными 1, указывают на первую строку тар,
все компоненты с величинами между 1 и 2 включительно указывают на вторую
строку и т.д. Если X принадлежит классу uint8 или uintl6, то все его компо-
компоненты, равные 0, указывают на первую строку тар, все компоненты, равные 1,
указывают на вторую строку тар и т. д. Этот метод определения цвета пикселов
проиллюстрирован на рис. 6.3 (стр. 225).
Для отображения на дисплее индексированного изображения следует выпол-
выполнить команду
>> imshow(X, map);
или, что эквивалентно,
>> image (X)
>> colormap(map)
Цветовая карта хранится вместе с индексированным изображением, и она авто-
автоматически загружается, когда функция imread считывает изображение.
Иногда бывает необходимо аппроксимировать индексированное изображение
другим изображением с меньшим набором цветов. Для этой цели используется
функция imapprox, вызов которой имеет вид
[Y, newmap] = imapprox(X, map, n).
Эта функция возвращает массив Y с цветовой картой newmap, который имеет не
более п цветов. Входной массив может принадлежать классу uint8, uintl6 или
double. Выход Y принадлежит классу uint8, если п не превосходит 256. Если п
больше 256, то Y принадлежит классу double.
Когда число строк матрицы тар меньше числа различных значений X, «лиш-
«лишние» значения в X отображаются с помощью одного и того же цвета в тар. На-
Например, пусть X состоит из четырех вертикальных полос одинаковой ширины со
значениями 1, 64, 128 и 256. Если мы определим цветовую карту
тар = [0 0 0; 1 1 1],
то все элементы X со значениями 1 будут указывать на первую строку тар (чер-
(черный цвет), а все остальные значения X будут указывать на вторую строку тар
(белый цвет). Таким образом, команда imshow(X, map) покажет изображение, на
котором за черной полосой следуют три белые полоски. На самом деле, это так и
будет до тех пор, пока длина карты не станет равна 65, в этот момент на дисплее
будет отображена черная полоска, затем серая полоска, за которыми следуют две
белые. В результате подобных действий на экране может появиться весьма стран-
странное изображение, если длина карты превосходит допустимый диапазон значений
элементов X.
Имеется несколько способов задания цветовой карты. Первый способ состоит
в применении команды
>> map(k, :) = [r(k) g(k) b(k)] ;
Глава 6. Обработка цветных изображений
где [г (к) g(k) b(k)] — это RGB значения, которые определяют строку карты
с номером к. Карта будет заполняться при изменении параметра к.
В табл. 6.1 перечислены RGB значения некоторых основных цветов. Любой из
трех форматов, приведенных в таблице, может использоваться для обозначения
цвета. Например, цвет фона на изображении можно поменять на зеленый любой
из следующих трех команд:
>> whitebg('g')
>> whitebgO green')
>> whitebg([0 1 0])
Таблица 6.1. RGB значения некоторых основных цветов. Длинное или короткое имя (за-
(заключенное в кавычки) может использоваться в приложениях наравне с чис-
числовым триплетом при обозначении RGB цвета
Длинное имя
Black
Blue
Green
Cyan
Red
Magenta
Yellow
White
Короткое имя
k
b
g
с
r
m
У
w
RGB значения
[0 0 0]
[0 0 1]
CO 1 0]
[0 1 1]
[1 0 0]
[1 0 1]
Cl l 0]
Cl l l]
Для обозначения цветов, не представленных в табл. 6.1, используются дроб-
дробные числа. Например, [.5 .5 .5] — серый цвет, [.5 0 0] — темно-красный,
а [.49 1 .83] —аквамариновый.
В MATLAB имеется несколько стандартных цветовых карт, которые можно
загрузить командой
>> colormap(map_name);
В результате матрица цветовой карты становится равной map.name. Например,
>> colormap(copper);
где copper — одна из цветовых карт, имеющихся в MATLAB. Цвета в этой карте
гладко меняются от черного до светло-бронзового. Если последнее изображение,
выведенное на экран, было индексированным, то после этой команды цветовая
карта поменяется на copper. Кроме того, изображение с нужной картой можно
непосредственно вывести на экран командой
>> imshow(X, copper);
В табл. 6.2 перечислены некоторые цветовые карты MATLAB. Длины (число
цветов) этих карт можно ограничить, поставив в круглых скобках соответству-
соответствующее число. Например, gray A6) задает цветовую карту из 16 оттенков серого
цвета.
6.1. Представление цветных изображений в MATLAB
<ь=4М
6.1.3. Функции IPT для обращения с RGB и
индексированными изображениями
В табл. 6.3 приведены функции IPT, которые совершают взаимную конверта-
конвертацию RGB индексированных и монохромных изображений. Для ясности в этом
параграфе rgb_image обозначает RGB изображение, gray.image — монохромное
изображение, bw — черно-белое изображение, а X — матрицу данных индексиро-
индексированного изображения. Напомним, что индексированное изображение состоит из
матрицы данных и матрицы цветовой карты.
Таблица 6.2. Некоторые стандартные цветовые карты MATLAB
Имя Описание
autumn Плавный переход от красного, через оранжевый к желтому.
bone Шкала градации серого с усилением синей компоненты. Эта шкала придает
дополнительный «электронный» вид полутоновым изображениям.
colorcube Содержит столько регулярно разделенных цветов в RGB цветовом про-
пространстве, сколько возможно, но обеспечивает дополнительные шаги серо-
серого, чисто красного, чисто зеленого и чисто голубого.
cool Состоит из оттенков голубого и пурпурного. Плавный переход от голубого
к пурпурному.
copper Плавный переход черного к ярко бронзовому.
flag Состоит из красного, белого, синего и черного. Цвет меняется скачкообраз-
скачкообразно при увеличении индекса на один шаг.
gray Возвращает линейную серую шкалу.
hot Плавный переход от черного, через оттенки красного, оранжевого и жел-
желтого к белому.
hsv Цветонасыщенная цветовая модель. Цвет начинается с красного, переходит
в желтый, зеленый, голубой, синий, пурпурный и возвращается снова в
красный. Карта приспособлена для отображения периодических функций.
jet Простирается от синего до красного, проходит через голубой, желтый и
оранжевый.
lines Строит цветовую карту, которая используется в функции ColorOrder (см.
справочную страницу этой функции).
pink Состоит из пастельных тонов розового. Эта карта отображает тоны сепии,
расцвечивающие полутоновые фотографии.
prism Повторяет шесть цветов: красный, оранжевый, желтый, зеленый, синий и
фиолетовый.
spring Состоит из оттенков пурпурного и желтого.
summer Состоит из оттенков зеленого и желтого.
white Полностью белая монохромная карта.
winter Состоит из оттенков синего и зеленого.
Функцию dither (дрожать) молено применять как к монохромным, так и к
цветным изображениям. Этот процесс дрожания используется в печатном деле
для имитации градации серого цвета при печати черными точками. Для моно-
монохромных изображений функция dither пытается передать градации серого цве-
цвета с помощью бинарной маски из черных точек на белом фоне (или наоборот).
Плотность точек уменьшается на ярких областях и увеличивается на более тем-
темных областях. Алгоритм, применяемый при дрожании, основан на компромиссе
между «точностью» зрительного восприятия и вычислительной сложностью. Ме-
Метод дрожания, который заложен в IPT, использует алгоритм Флойда-Стейнберга
Глава 6. Обработка цветных изображений
(см. [Floyd, Steinberg, 1975]) и [Ulichney, 1987]). Синтаксис функции dither при
работе с монохромными изображениями имеет вид
bw = dither(gray_image) ,
где gr ay __ image — это, как и раньше, монохромное изображение, a bw — результат
дрожания (двоичное изображение).
Таблица 6.3. Функции IPT для преобразования RGB, индексированных и полутоновых
изображений друг в друга
Функция Назначение
dither Строит индексированное изображение из RGB изображения методом дрожания,
grayscale Строит индексированное изображение из полутонового с помощью пороговых
величин.
gray2ind Строит индексированное изображение из полутонового.
ind2gray Строит полутоновое изображение из индексированного.
rgb2ind Строит индексированное изображение из RGB.
rgb2gray Строит полутоновое изображение из RGB.
При работе с цветными изображениями функция dither используется в соче-
сочетании с функцией rgb2ind, которая сокращает число цветов изображения. Эта
функция будет рассматриваться позже в этом параграфе.
Функция grayslice имеет синтаксис
X = grayslice(gray_image, n).
Эта функция строит индексированное изображение с уменьшенным числом цве-
цветов, которое определяется с помощью пороговых величин
12 п-1
п п п
Как уже отмечалось, полученное индексированное изображение можно увидеть
на экране после выполнения команды imshow(X, map) с использованием карты
подходящей длины (например, jetA6)). Другая форма этой команды выгля-
выглядит так:
X = grayslice(gray_image, v),
где v — это вектор, компоненты которого используются в качестве пороговых зна-
значений при разделении цветов в gray .image. В сочетании с цветовыми картами,
функция grayslice является основным инструментом при обработке псевдоцвет-
псевдоцветных изображений, когда специальная шкала оттенков серого цвета используется
для обозначения цветов. Входное изображение может быть класса uint8, uintl6
или double. Пороговые величины вектора v должны лежать в интервале от О
до 1, даже если изображение имеет класс uint8 или uintl6. При этом функция
grayslice автоматически выполняет необходимую процедуру масштабирования.
Функция gray2ind, имеющая синтаксис
[X, map] = gray2ind(gray.image, n),
6.1. Представление цветных изображений в MATLAB
масштабирует, а затем округляет изображение gray .image для получения индек-
индексированного изображения X с цветовой картой gray (n). Если параметр п опущен,
то по умолчанию п = 64. Входное изображение может быть класса uint8, uintl6
или double. Выходное изображение X принадлежит классу uint8, если п меньше
256, а если п больше этого числа, то оно имеет класс uintl6.
Функция ind2gray с синтаксисом
gray_image = ind2gray(X, map)
преобразует индексированное изображение, состоящее из пары матриц X и тар, в
монохромное. Массив X может иметь класс uint8, uintl6 или double. Выходное
изображение имеет класс double.
В этом параграфе нас также интересует функция rgb2ind, вызов которой
имеет вид
[X, map] = rgb2ind(gray_image, n, dither.option),
где п определяет длину (или число цветов) карты тар, а символьный параметр
dither_opt ion может иметь одно из двух значений: 'dither' (по умолчанию), ес-
если необходимо получить лучшее цветовое разрешение за счет пространственного;
и, наоборот, 'nodither', тогда каждый цвет исходного изображения отобража-
отображается в ближайший цвет новой карты (зависящий от величины п). В этом случае
дрожание не делается. Входное изображение может иметь класс uint8, uintl6
или double. Выходное изображение X принадлежит классу uint8, если п мень-
меньше 256, а если п больше 256, то X принадлежит классу uintl6. В примере 6.1
показано действие эффекта дрожания при сокращении цветовой палитры.
Функция
rgb.image = ind2rgb(X, map)
преобразует матрицу X и соответствующую цветовую карту тар в формат RGB;
X может быть класса uint8, uintl6 или double. Выходное RGB изображение
является массивом MxiVx3 класса double.
Наконец, функция rgb2gray, имеющая синтаксис
gray.image = rgb2gray(rgb_image),
преобразует RGB изображение в монохромное. Входное изображение может при-
принадлежать классу uint8, uintl6 или double, а выходное изображение принадле-
принадлежит классу входного изображения.
Пример 6.1. Иллюстрации некоторых функций из табл. 6.3.
Функция rgb2ind бывает полезной, если необходимо уменьшить число цветов,
используемых в RGB изображении. В качестве такого действия функции rgb2ind,
при котором проявляется также преимущество метода дрожания, рассмотрим
рис. 6.4, а) (стр. 225), на котором дано RGB изображение i с глубиной цвета 24.
На рис. 6.4, б) и в), даны результаты следующих команд:
>> [XI, mapl] = rgb2ind(f, 8, 'nodither');
>> imshow(Xl, mapl)
Глава 6. Обработка цветных изображений
>> [Х2, map2] = rgb2ind(f, 8, 'dither');
imshow(X2, map2)
Оба изображения имеют всего 8 цветов, т. е. было совершено значительное сокра-
сокращение числа возможных цветов в f, которое для 24-битового RGB изображения,
как уже отмечалось, превосходит 16 миллионов цветов. На рис. 6.4, б) заметны
ложные контуры, особенно в центре большого цветка. Изображение, построенное
с дрожанием, лучше передает цветовые оттенки; на нем имеется меньше ложных
контуров. В этом проявляется эффект «хаотичности», который вносится при дро-
дрожании. Изображение выглядит слегка размытым, однако для глаза оно будет
казаться более точным, чем рис. 6.4, б).
Эффект дрожания можно лучше проиллюстрировать на монохромных изоб-
изображениях. Рис. 6.4, г) и д) были получены командами
>> g = rgb2ind(f) ;
>> gl = dither(g);
>> figure, imshow(g);figure, imshow(gl).
Изображение на рис. 6.4, д) является двоичным, что опять-таки означает суще-
существенное сокращение объема данных. При взгляде на рис. 6.4, в) и д) становится
понятным, почему метод дрожания так важен в издательском и печатном деле
(особенно при выпуске газет), когда качество бумаги и разрешение печати может
быть достаточно низким. ?
6.2. Преобразования в другие цветовые пространства
Как было объяснено в предыдущем параграфе, пакет IPT представляет цвета или
явно в виде RGB изображений, или косвенно в виде индексированных изображе-
изображений, в которых цветовая карта также хранится в формате RGB. Однако имеет-
имеется много других цветовых пространств (которые также называются цветовыми
моделями), использование которых может оказаться более предпочтительным
и/или удобным в некоторых приложениях. Речь идет о цветовых пространствах
NTSC, YCbCr, HSV, CMY, CMYK и HSL В пакете имеются функции для пря-
прямого и обратного преобразования их RGB в пространства NTSC, YCbCr, HSV
и CMY. Далее будет также построена функция для преобразования в формат HSI.
6.2.1. Цветовое пространство NTSC
Цветовая система NTSC используется в телевидении США. Основное преиму-
преимущество данного формата заключается в том, что в нем информация о яркости
(насыщенности), эквивалентная шкале серого цвета в черно-белом телевидении,
отделена от самих цветовых данных, что позволяет использовать один и тот же
сигнал в цветных и черно-белых телевизионных приемниках. В формате NTSC
пиксел представлен тремя компонентами: светлота (Y), цветовой топ (I) и на-
насыщенность (Q), где выбор букв YIQ является общепринятым. Светлота содер-
содержит информацию о яркости в шкале градаций серого, а две другие компоненты
6.2. Преобразования в другие цветовые пространства
несут информацию о цвете в телевизионном сигнале. Компоненты YIQ получа-
получаются из тройки RGB с помощью следующего преобразования:
Y
I
Q
0.299 0.587 0.114
0.596 -0.274 -0.322
0.211 -0.523 0.312
R
G
В
0.621
-0.647
1.703
Y
I
Q
Отметим, что сумма элементов первой строки матрицы, стоящей справа от знака
равенства, равна 1, а сумма элементов по остальным двум строкам равна 0. Это
легко понять, так как яркости всех трех компонент RGB монохромного изобра-
изображения должны быть одинаковы, а значит, для такого изображения компоненты
/ и Q равны нулю. Функция rgb2ntsc совершает это преобразование:
yiq_ image = rgb2ntsc(rgb_image),
где входное RGB изображение может быть класса uint8, uintl6 или double. Вы-
Выходом служит массив MxNx3 класса double. Компонента светлота получается
командой yiq_image (: , : , 1), цветовой тон — yiq_image ( : , : , 2), а насыщен-
насыщенность — yiq_image(:, :, 3).
Аналогично, компоненты RGB получаются из YIQ с помощью обратного пре-
преобразования
~ R 1 Г 1.000 0.956
G = 1.000 -0.272
В \ [ 1.000 -1.106
которое в IPT реализовано в виде функции
rgb_ image = ntsc2rgb(yiq_image).
Здесь и входное, и выходное изображения имеют класс double.
6.2.2. Цветовое пространство YCbCr
Цветовая модель YCbCr широко используется в цифровом видео. В этом формате
компонента светлота представлена единственной компонентой Y, а цвет хранится
в виде двух разностных цветовых компонент СЬ и Сг. Величина СЬ — это раз-
разность между голубой компонентой В и светлотой Y, а Сг — это разность между R
(красная компонента) и Y ([Polynton, 1996]). При конвертации из RGB в YCbCr
используются уравнения
65.481 128.553 24.966 1 Г R
-37.797 -74.203 112.000 G
112.000 -93.786 -18.214 J [ В
Функция преобразования имеет вид
ycbcr_image = rgb2ycbcr(rgb_ image).
Входное RGB изображение может быть класса uint8, uintl6 или double. Выход-
Выходное изображение имеет тот же класс, что и входное. Обратное преобразование1
1 Чтобы получить матрицу преобразования из YCbCr в RGB, наберите команду
>> edit ycbcr2rgb.
" Y
СЬ
Сг
—
16 "
128
128
+
Глава 6. Обработка цветных изображений
выполняется функцией
rgb_image = ycbcr2rgb(ycbcr_image).
Входное YCbCr изображение может быть класса uint8, uintl6 или double, a
класс выходного изображения совпадает с классом входного.
6.2.3. Цветовое пространство HSV
Цветовая система HSV (Hue, Saturation, Value: цветовой тон, насыщенность, ве-
величина) представляет собой одно из цветовых пространств, в которых выбор
цвета похож: на обращение с палитрой или гаммой цветов при работе художника
с красками или чернилами. Эта цветовая система стоит гораздо ближе к описа-
описанию и восприятию цвета человеком, чем формат RGB. Пользуясь терминологи-
терминологией художников, термины цветовой тон, насыщенность и величина соответствуют
приблизительно таким словам, как окраска, оттенок и сила тона.
Цветовое пространство HSV можно увидеть, если посмотреть на цветовой куб
RGB вдоль его серой оси (которая соединяет черную и белую вершины). В резуль-
результате наблюдается цветовая палитра в форме шестиугольника, которая изображе-
изображена на рис. 6.5, а) (стр. 226). По мере движения вдоль серой оси на рис. 6.5, б),
размер шестиугольника в перпендикулярном сечении соответствует величине V
на рисунке. Цветовой фон Н выражается углом на цветовом шестиугольнике,
причем принято отсчитывать этот угол от луча, соединяющего центр и красную
вершину. Величина (V) измеряется вдоль оси конуса, вершина которого соответ-
соответствует величине V = 0. Конец оси соответствует величине V = 1 (белый цвет),
и соответствующая точка располагается в центре полноцветного шестиугольни-
шестиугольника на рис. 6.5, а). Таким образом, на этой оси располагаются все оттенки серого
цвета. Насыщенность (чистота) 5 цвета измеряется расстоянием до оси V.
Цветовая система HSV основана на цилиндрических координатах. Поэтому
преобразование из RGB в HSV осуществляется по стандартным формулам пе-
пересчета из прямоугольных в цилиндрические координаты. Эти уравнения мож-
можно найти в большинстве учебников по компьютерной графике (см., например,
[Rogers, 1997]), поэтому мы их здесь не приводим.
Функция MATLAB для преобразования их RGB в HSV имеет вид
hsv_image = rgb2hsv(rgb_image).
Входное RGB изображение может иметь класс uint8, uintl6 или double, а вы-
выходное имеет класс double. Преобразование из HSV в RGB совершается функ-
функцией
rgb_ image = hsv2rgb(hsv_ image).
Входное изображение должно принадлежать классу double, а выходное имеет
класс double.
6.2.4. Цветовые пространства CMY и CMYK
Голубой, пурпурный и желтый являются вторичными основными цветами све-
световых источников или, альтернативно, первичными цветами красителей. Напри-
Например, при освещении белым светом поверхности, покрашенной голубой краской,
6.2. Преобразования в другие цветовые пространства
красный цвет от нее не отражается. Значит, голубой краситель вычитает крас-
красную компоненту из отражаемого белого цвета, который состоит из равных частей
красного, зеленого и синего.
Большинство аппаратов для нанесения цветных красителей на бумагу, вроде
цветных принтеров и устройств копирования в цвете, либо требуют представ-
представления цветных данных в формате CMY, или автоматически совершают преоб-
преобразование из RGB в CMY. Это преобразование совершается по очень простым
правилам
" с
м
Y
—
' 1 '
1
1
—
" R '
G
В
где предполагается, что все цветовые компоненты нормированы в диапазоне [0,1].
Эти уравнения демонстрируют эффект неотражения красного цвета от поверх-
поверхности, покрытой чисто голубой краской (из уравнений имеем С — 1 — К). Анало-
Аналогично, чисто пурпурный цвет не отражает зеленый, а чисто желтый не отражает
синий. Из этих уравнений следует, что для получения RGB компонент из CMY
достаточно вычесть каждую из них из 1.
В теории равные количества первичных красителей голубого, пурпурного и
желтого должны давать черный цвет. На практике, при смешении этих цветов
на печати получается черный, который выглядит более осветленным, чем ори-
оригинальный черный цвет. Поэтому, чтобы получить истинный черный цвет (кото-
(который часто доминирует при цветной печати), цветовая модель CMY расширяется
до модели CMYK четвертым цветовым компонентом — черным цветом. Таким
образом, когда издатели говорят о четырехцветной печати, они имеют в виду
трехцветную модель CMY плюс черный цвет.
Функцию imcomplement, введенную в § 3.2.1, можно использовать для преоб-
преобразования из RGB в пространство CMY:
cmy_image = imcomplement (r gb_ image).
Эту же функцию можно использовать для обратного преобразования:
rgb_image = imcomplement (cmy_ image).
6.2.5. Цветовое пространство HSI
Если не брать HSV, все рассмотренные ранее цветовые модели плохо приспо-
приспособлены к описанию цветов, свойственному для человека. Например, говоря о
цвете автомобиля, человек никогда не скажет о процентном соотношении в нем
красного, зеленого и синего.
Описывая объект, мы скажем о его цвете (цветовом тоне), насыщенности
и светлости (светлоте). Цветовой тон сообщает собственно цвет и его чисто-
чистоту (чисто красный, оранжевый, желтый и т.п.), насыщенность дает меру того,
насколько чистый цвет разбавлен белым. Светлость или светлота является
характеристикой, которая практически не поддается точному измерению. Она
соответствует характеристике интенсивность (полутоновая яркость) в ахрома-
ахроматическом (бесцветном) случае и является одним из ключевых параметров при
Глава 6. Обработка цветных изображений
описании цветового восприятия. Как известно, яркость (уровень серого цвета)
является основной характеристикой монохромных (полутоновых) изображений.
Эту величину можно легко мерить и интерпретировать.
В цветовом пространстве HSI (Hue, Saturation, Intensity: цветовой тон, на-
насыщенность, интенсивность), которое мы собираемся рассматривать, яркостная
информация (интенсивность) отделена от цветовой информации (цветовой тон и
насыщенность) цветного изображения. В результате модель HSI является идеаль-
идеальным инструментом в алгоритмах обработки цветных изображений, поскольку в
ее основе лежит описание цвета, интуитивно понятное человеку, а ведь именно он
является и разработчиком, и пользователем всех этих алгоритмов. В этом смысле
цветовое пространство HSV похоже на HSI, но оно сфокусировано на представ-
представлении цветов в виде палитры художника, поэтому оно менее удобно в цифровых
приложениях.
Как уже говорилось в § 6.1.1, цветное RGB изображение состоит из трех моно-
монохромных изображений, поэтому неудивительно, что компоненту интенсивности
можно выделить из RGB изображения. Это станет особенно ясно, если взять цве-
цветовой куб из рис. 6.2 и поставить его так, чтобы «черная» его вершина @,0,0)
оказалась внизу, а «белая» A,1,1) — прямо над ней, как показано на рис. 6.6, а)
(стр. 226). Как отмечалось при обсуждении рис. 6.2, все оттенки серого цвета
расположены на отрезке, соединяющем черную и белую вершины. На рис. 6.2, б)
этот отрезок (ось интенсивности) расположен вертикально. Значит, для опреде-
определения интенсивности в некоторой цветной точке необходимо провести через эту
точку плоскость, перпендикулярную оси. Координата пересечения этой плоско-
плоскости с осью даст значение интенсивности (яркости) в диапазоне [0,1]. Немного
подумав, становится ясно, что насыщенность (чистота цвета) увеличивается с
возрастанием расстояния от выбранной точки до оси интенсивности. На самом
деле, насыщенность цвета для точек на этой оси равна нулю, поскольку все эти
точки являются серыми.
Чтобы определить цветовой тон для некоторой заданной RGB точки, рассмот-
рассмотрим рис. 6.6, б), на котором выделена плоскость, проходящая через три точки
(черную, белую и голубую). Поскольку эта плоскость содержит черную и белую
вершины, то и вся соединяющая их (серая) прямая принадлежит выделенной
плоскости. Кроме того, ясно, что все точки треугольника, определяемого осью
интенсивности и двумя отрезками пересечения плоскости с гранями куба, имеют
один и тот лее цветовой тон (в данном случае, голубой). Это объясняется тем,
что все цветовые точки этого треугольника являются всевозможными комбина-
комбинациями или смешениями трех цветов вершин построенного треугольника. В самом
деле, если две точки являются белой и черной, а третья — цветной, то первые две
не могут изменить тон любой цветной точки треугольника, которая получается
при смешивании трех указанных цветов. Черная и белая точки не вносят вклад
в цветной тон! (Однако они влияют на интенсивность и насыщенность цвета.)
Если теперь поворачивать выделенную плоскость вокруг вертикальной оси, то
будут получаться различные цветовые тона. Из этого умозрительного рассмот-
рассмотрения приходим к выводу, что значения цветового тона, насыщенности и интен-
интенсивности, необходимые для определения пространства HSI, можно получить из
цветовых координат модели RGB. Таким образом, точки RGB можно преобразо-
6.2. Преобразования в другие цветовые пространства
вывать в соответствующие точки HSI с помощью точных формул, описывающих
приведенные выше геометрические построения.
Из проведенных рассуждений следует, что пространство HSI состоит из вер-
вертикальной оси интенсивности и цветных точек, которые располагаются на плос-
плоскости, перпендикулярной этой оси. При перемещении этой плоскости вверх и
вниз вдоль оси ее пересечение с цветовым кубом имеет форму треугольника или
шестиугольника. Это легче себе представить, если смотреть на куб сверху вдоль
оси интенсивности, как показано на рис. 6.7, а) (стр. 226). На этом рисунке вид-
видно, что оси первичных цветов разделены углами в 120°. Оси вторичных цветов
расположены под углом 60° к первичным. Это означает, что вторичные цвета
также расположены под углом 120° друг к другу.
На рис. 6.7, б) изображена шестиугольная форма и некоторая цветная точка
(показанная черным цветом). Цветовой тон определяется углом между направле-
направлением из центра шестиугольника в данную точку и некоторым опорным направле-
направлением. Обычно (но не всегда) в качестве опорного выбирается направление крас-
красной оси, которое, по определению, имеет нулевой цветовой тон. Величина угла
цветового тона отсчитывается против часовой стрелки. Важными компонентами
пространства HSI являются: вертикальная ось интенсивности, длина вектора до
цветной точки и угол, который составляет этот вектор с красной осью. Поэтому
нет ничего необычного в том, что плоскость HSI может определяться с помощью
шестиугольника (как было выше), треугольника или даже круга, как это сдела-
сделано на рис. 6.7, в) и г). Выбор этой фигуры не столь важен, поскольку каждую
из них можно преобразовать в две другие с помощью простых геометрических
преобразований. На рис. 6.8 (стр. 227) даны модели HSI на основе цветового тре-
треугольника и цветового круга.
Преобразование цветов из RGB в HSI
В этом параграфе приводятся уравнения преобразования из системы RGB в си-
систему HSI без их вывода. Подробное обоснование этих формул молено найти на
вебсайте нашей книги (см. адрес в Интернете в § 1.5). Для заданного цветного
RGB изображения компонента Н каждого RGB пиксела получается из уравнения
\
в при В ^ G,
360 - в при В > G,
в котором
-( i к*-
«,
Компонента насыщенности вычисляется по формуле
5 1 [1(ДС
Наконец, компонента интенсивности получается из уравнения
Глава 6. Обработка цветных изображений
Эти формулы выписана в предположении, что величины RGB нормированы в
диапазоне [0,1], а угол в измеряется от красной оси пространства HSI, как пока-
показано на рис. 6.7. Цветовой тон можно нормировать, разделив его значения на 360.
Две другие компоненты HSI находятся в этом диапазоне, при условии, что GRB
величины уже были нормированы.
Преобразование цветов из HSI в RGB
Зная величины HSI в интервале [0,1], легко найти соответствующие значения
RGB в том же диапазоне. Применяемые уравнения зависят от величины Н. Име-
Имеются три сектора по 120°, разделенные первичными цветами (см. рис. 6.7), в ко-
которых применяются разные формулы. Сначала следует умножить Н на 360° для
приведения этой величины к исходному диапазону [0,360°].
Сектор RG @ ^ Н < 120°). Когда Н лежит в этом секторе, то RGB компоненты
вычисляются по формулам
B-H1-S), H=
Сектор GB A20° ^ Н < 240°). Если Н находится в этом секторе, то сначала
следует вычесть 120° из Н:
Н = Н - 120°.
После чего компоненты RGB вычисляются по формулам
Я.Д1-5), G _
Сектор BR B40° ^ Н ^ 360°). Наконец, если Н находится в этом секторе, то
сначала следует из Н вычесть 240°:
Я = Н - 240°.
Затем компоненты RGB вычисляются по формулам
Эти уравнения будут использоваться далее при обработке цветных изображений.
М-функция для преобразования из RGB в HSI
Функция
hsi = rgb2hsi(rgb)
реализует приведенные выше уравнения для конвертации из формата RGB в
формат HSI. Для простоты hsi и rgb обозначают, соответственно, HSI и RGB
изображения. Справочная документация детализирует синтаксические особенно-
особенности данной функции.
function hsi = rgb2hsi(rgb)
7oRGB2HSI Converts an RGB image to HSI.
6.2. Преобразования в другие цветовые пространства
У, HSI = RGB2HSKRGB) converts an RGB image to HSI. The input image
% is assumed to be of size M-by-N-by-3, where the third dimension
°/e accounts for three image planes: red, green, and blue, in that
У, order. If all RGB component images are equal, the HSI conversion
°/e is undefined. The input image can be of class double (with values
°/e in the range [0, 1]), uint8, or uintl6.
%
Уо The output image, HSI, is of class double, where:
°/, hsi(:, : , 1) = hue image normalized to the range [0, 1] by
Ус dividing all angle values by 2*pi.
°/e hsi(:, : , 2) = saturation image, in the range [0, 1].
У, hsi(:, : , 3) = intensity image, in the range [0, 1].
Ув Extract the individual component immages.
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);
°/e Implement the conversion equations.
num = 0.5*((r - g) + (r - b));
den = sqrt((r - g).~2 + (r - b).*(g - b));
theta = acos(num./(den + eps));
H = theta;
H(b > g) = 2*pi - H(b > g);
H = H/B*pi);
num = min(min(r, g), b);
den = r + g + b;
den(den == 0) = eps;
S = 1 - 3.* num./den;
H(S == 0) = 0;
I = (r + g + b)/3;
Ув Combine all three results into an hsi image.
hsi = catC, H, S, I);
М'функция для преобразования из HSI в RGB
Функция
rgb = hsi2rgb(hsi)
реализует обратное преобразование из HSI в RGB. Документация детализирует
входные и выходные аргументы данной функции.
function rgb = hsi2rgb(hsi)
°/0HSI2RGB Converts an HSI image to RGB.
У. RGB = HSI2RGB(HSI) converts an HSI image to RGB, where HSI
Уо is assumed to be of class double with:
У, hsi(:, : , 1) = hue image, assumed to be in the range
°/e [0, 1] by having been divided by 2*pi.
Ув hsi(:, : , 2) = saturation image, in the range [0, 1].
Глава 6. Обработка цветных изображений
°/в hsi(:, : , 3) = intensity image, in the range [0, 1].
°/.
°/e The components of the output image are:
°/, rgb(:, :, 1) = red.
% rgb(:, :, 2) = green.
°/, rgb(:, :, 3) = blue.
°/o Extract the individual HSI component images.
H = hsi(:, :, 1) * 2 * pi;
S = hsi(:, :, 2);
I = hsi(:, :, 3);
°/e Implement the conversion equations.
R = zeros(size(hsi, 1), size(hsi, 2));
G = zeros(size(hsi, 1), size(hsi, 2));
В = zeros(size(hsi, 1), size(hsi, 2));
°/e RG sector @ <= H < 2*pi/3) .
idx = find( @ <= H) & (H < 2*pi/3));
B(idx) = I(idx) .* A - S(idx));
R(idx) = I(idx) .* A + S(idx) .* cos(H(idx)) ./ ...
cos(pi/3 - H(idx)));
G(idx) = 3*I(idx) - (R(idx) + B(idx));
У. BG sector B*pi/3 <= H < 4*pi/3) .
idx = find( B*pi/3 <= H) & (H < 4*pi/3) );
R(idx) = I(idx) .* A - S(idx));
G(idx) = I(idx) .* A + S(idx) .* cos(H(idx) - 2*pi/3) ./ ...
cos (pi - H(idx)));
B(idx) = 3*I(idx) - (R(idx) + G(idx));
°/o BR sector.
idx = find( D*pi/3 <= H) & (H <= 2*pi));
G(idx) = I(idx) .* A - S(idx));
B(idx) = I(idx) .* A + S(idx) .* cos(H(idx) - 4*pi/3) ./ ...
cosE*pi/3 - H(idx)));
R(idx) = 3*I(idx) - (G(idx) + B(idx));
°/o Combine all three results into an RGB image. Clip to [0, 1] to
% compensate for floating-point arithmetic rounding effects,
rgb = catC, R, G, B);
rgb = max(min(rgb, 1), 0);
Пример 6.2. Преобразование из RGB в HSI.
На рис. 6.9 (стр. 227) приведены компоненты цветового тона, насыщенности и
интенсивности изображения RGB куба на белом фоне, аналогичного его изобра-
изображению на рис. 6.2, б). На рис. 6.9, а) дано изображение цветового тона. Самой
заметной деталью на этом изображении является разрыв величины вдоль ли-
линии под углом 45° на передней стороне (красной) плоскости куба. Чтобы понять
причину этого разрыва, обратимся к рис. 6.2, б), мысленно проведем прямую
линию, соединяющую красную и белую вершины куба, и выберем точку посе-
посередине этой линии. Начав с этой точки, нарисуем кривую, двигаясь вправо и
6.3. Основы обработки цветных изображений
обходя куб по кругу, пока не вернемся в исходную точку. Основными цветами,
расположенными на этой кривой, будут желтый, зеленый, голубой, синий, пур-
пурпурный и, наконец, красный. В соответствии с рис. 6.7, величина цветного тона
должна увеличиваться вдоль этого пути от 0° до 360° (т. е. от минимального до
максимального значения цветового тона). А это в точности то, что мы имеем на
рис. 6.9, а), поскольку минимальное значение представляется черным цветом, а
максимальное — белым.
Изображение насыщенности на рис. 6.9, б) демонстрирует прогрессирующее
потемнение значений в направлении белой вершины RGB куба, что отражает все
меньшую насыщенность любого цвета при приближении к белому. Наконец, каж-
каждый пиксел изображения интенсивности на рис. 6.9, в) является средним значе-
значением соответствующих RGB компонентов цветного пиксела на рис. 6.2, а). Заме-
Заметим, что фон на этом рисунке является белым, поскольку он был также белым на
исходном цветном изображении. А на двух предыдущих рисунках фон является
черным, так как цветовой тон и насыщенность белого цвета равны нулю. ?
6.3. Основы обработки цветных изображений
В этом параграфе мы приступим к изучению методов, используемых при обра-
обработке цветных изображений. Хотя набор этих средств не является исчерпываю-
исчерпывающим, эти методы являются хорошей иллюстрацией того, как следует обращаться
с цветными изображениями при решении широкого круга задач. Для удобства
изложения мы разделим подходы, используемые при обработке цветных изобра-
изображений, на три большие категории:
A) преобразования цветов (или отображения цветов);
B) раздельная пространственная обработка цветовых плоскостей; и
C) обработка цветовых векторов.
Первая категория обрабатывает пикселы каждой цветовой плоскости, основыва-
основываясь исключительно на значениях пикселов, без учета их пространственных коор-
координат. Эти подходы аналогичны методам, рассмотренным в § 3.2 при изучении
преобразований яркости монохромных изображений. Методы второй категории
основаны на пространственной (окрестностной) фильтрации отдельных цвето-
цветовых плоскостей, и они аналогичны материалам §§ 3.4 и 3.5 по пространственной
фильтрации.
К третьей категории относятся методы, которые совершают обработку компо-
компонент цветного изображения как единого целого. Поскольку полноцветные изобра-
изображения имеют по крайней мере три компоненты, цветные пикселы являются трех-
трехмерными векторами. Например, в системе RGB каждую цветовую точку можно
рассматривать как вектор, проведенный из начала координат в соответствующую
точку цветового пространства, (см. рис. 6.2).
Пусть с — это произвольный вектор в цветовом пространстве RGB:
с =
" CR "
CG
. °в _
=
" R "
G
В
Глава 6. Обработка цветных изобраэюепий
Эти выражения показывают, что компонентами вектора с являются RGB коор-
координаты точки в цветовом пространстве. Если принять во внимание тот факт, что
цветовые компоненты являются функциями пространственных координат (я, у),
то последние уравнения можно переписать в виде
R(x,y)
G(x,y)
В(х,у)
Для изображения с размером MxN имеется MN таких векторов с(х,у) при
х = 0,1,2,..., М - 1 и у = 0,1,2,..., N - 1.
В некоторых случаях можно получить эквивалентные результаты, если обра-
обрабатывать цветное изображение или по отдельным плоскостям, или в векторном
представлении. Однако это можно сделать не всегда, о чем подробно говорится
в § 6.6. Для того, чтобы процессы обработки изображений по отдельным плос-
плоскостям и в векторной форме давали одинаковые результаты, требуется выпол-
выполнение следующих условий: во-первых, процедура должна быть применима и к
векторам, и к скалярам, а во-вторых, операция над каждой компонентой век-
вектора должна быть независимой от остальных компонент. В качестве иллюстра-
иллюстрации, на рис. 6.10 (стр. 228) показана пространственная окрестностная обработ-
обработка монохромного и полноцветного изображения. Предположим, что процедура
заключается в окрестностном осреднении. На рис. 6.10, а) осреднение делается
суммированием всех полутоновых пикселов окрестности и делением полученной
суммы на общее число пикселов в окрестности, а на рис. 6.10, б) следует просум-
просуммировать все векторы окрестности и разделить каждую компоненту полученного
суммарного вектора на общее число векторов окрестности. Однако каждая ком-
компонента осредненного вектора равна сумме пикселов изображения, соответствую-
соответствующего данной компоненте, деленной на число пикселов окрестности, что совпадает
с результатом индивидуального окрестностного осреднения каждой компоненты
изображения, после чего можно строить цветной вектор.
R
G
В
Три цветовые
компоненты
цветного
пиксела
Синий компонент
Зеленый компонент
Красный компонент
Рис. 6.1. Схематически показан способ формирования цветного RGB пиксела из соответ-
соответствующих пикселов цветовых составляющих
6.3. Основы обработки цветных изобраснсений
СинийЩ^и) r - „
ПурпурныЙгг=гГ111_ г^Голубои
Белый
Черный ?
^ Серые
полутона
@,1,0)
Рис. 6.2. а) Схема цветового
куба RGB. Видны первичные
и вторичные вершины цветов
яркости. Точки на главной ди-
диагонали имеют оттенки серо-
серого цвета от черного в начале
координат до белого в точке
A,1,1). 5; Цветовой куб RGB
Двумерный
целочисленный
массив X
R
г\
п
п
1
и
#1
а
gL
В
b\
h
bk
Рис. 6.3. Элементы индексированного изображе-
изображения. Значения элементов числового массива X
определяют номер строки в цветовой карте. Каж-
Каждая строка карты содержит RGB триплет. L — это
общее число строк цветовой карты
— А>ая
строка
Значение (индекс) обведенного
элемента равно к
карта
а)
б)
е)
Рис. 6.4. a) RGB изображе-
изображение, б) Число цветов сокра-
сокращено до 8 без метода дрожа-
дрожания, в) Число цветов сокра-
сокращено до 8 с методом дрожа-
дрожания, г) Черно-белый вариант
изображения а), д) Он лее по
методу дрожания (это двоич-
двоичное изображение)
г)
д)
Глава 6. Обработка цветных изобрасисений
Рис. 6.5. а) Цветной ше-
шестиугольник HSV. б) Ше- а)
стигранный конус HSV
б)
"олубой
Белый
Пурпурный
0°
'Красный
Черный
Рис. 6.6. Соотно-
Соотношения между мо-
моделями RGB и HSI
Белый
Голубой
Синий
Пурпурный
Желтый
\| / ^Красный
ТгЗелень- У
Черный
Белый
Синий
Черный
Рис. 6.7. Цветовой тон и
насыщенность в модели HSI.
Черная точка обозначает
произвольный цвет. Угол
до красной оси определяет
цветовой тон, а длина век-
вектора — насыщенность. Ин-
Интенсивность любого цвета
на этих плоскостях опре-
определяется положением этих
плоскостей на вертикаль-
вертикальной оси интенсивности
а)
Зеленый
Голубой
Синий
Зеленый
Голубой
Синий
Пурпурный
г)
Синий
Зеленый
Красный
Пурпурный
6.3. Основы обработки цветных изобраэюений
Белый
0.75
Рис. 6.8. Цветовая модель
HSI, основанная на а) цвето-
цветовом треугольнике и б) цве-
цветовом круге. Треугольник и
круг расположены перпендику-
перпендикулярно вертикальной оси ин-
интенсивности
Красный
Черный
Белый
/=0.75
Красный
Черный
б)
Рис. 6.9. Компоненты HSI изображения цветового RGB куба, а) цветовой тон, б) насы-
насыщенность и в) интенсивность
228 Глава 6. Обработка цветных изображений
Рис. 6.10. Пространственные маски о,
для монохромного и цветного RGB
изображений
Пространственная-^
б)
Полутоновое изображение Цветное RGB изображение }
Z
Пространственная -I
О 0.25 0.5 0.75 1 0 0.25 °'5 0.75 1 0 0.25 °-5 0.75 1 0 0.25 0.5 0.75 1
Рис. 6.11. Задание функций отображения по контрольным точкам: а) и в) — линейная
интерполяция, б) и г) — кубическая сплайновая интерполяция
Рис. 6.12. Типичный вид открытых окон в ice. (Изображение предоставлено компанией
G.E. Medical Systems)
6.3. Основы обработки цветных изобраснсений
Рис. 6.13. а) Функция негатив-
негативного отображения; б) ее дей-
действие на монохромное изобра-
изображение
Рис. 6.14. а) Полноцветное изоб-
изображение; б) его негатив (допол-
(дополнительное изображение)
Рис. 6.15. Использование функции ice для улучшения контрастности монохромных и
полноцветных изображений: а) и г) — входные изображения с явлением вы-
вымывания; б) и д) — результаты обработки; в) и е) — окна интерфейса ice.
(Исходное полутоновое изображение предоставлено Агентством NASA)
Глава 6. Обработка цветных изображений
а) б)
"
Рис. 6.16. а) Рентгенограмма дефектного сварного шва; б) псевдоцветная версия снимка
сварного шва; в) и г) — функции отображений для зеленой и синей компонент.
(Исходное изображение предоставлено компанией Х-ТЕК Systems, Ltd.)
Рис. 6.17. Применение функции ice при балансировке цвета: а) исправляемое изображе-
изображение; б) исправленное изображение; в) функция отображения, использованная
при балансировке
6.3. Основы обработки цветных изобраоюений 23 I
а) б)
в) г)
Рис. 6.18. Гистограммная эквализация интенсивности и подгонка насыщенности в цве-
цветовом пространстве HSI: а) входное изображение; б) преобразованное изобра-
изображение; в) функция преобразования компоненты интенсивности с кумулятив-
кумулятивной функцией распределения; {г) функция преобразования компоненты насы-
насыщенности; д) гистограммы компонент исходного изображения; е) гистограммы
компонент преобразованного изображения
232 Глава 6. Обработка цветных изобраэюений
а) б)
г)
Рис. 6.19. a) RGB изображение; б), в) и г) — красная зеленая и синяя компоненты изоб-
изображения
а) б) в)
Рис. 6.20. Слева направо: цветовой тон, насыщенность и интенсивность изображения на
рис. 6.19, а)
6.3. Основы обработки цветных изобраснсений
Рис. 6.21. а) Сглаженное RGB изображение, полученное раздельным сглаживанием плос-
плоскостей R, G и В. б) Результат сглаживания одной компоненты интенсивности
того же изображения в пространстве HSI. в) Результат одинакового сглажива-
сглаживания всех трех компонент HSI
Рис. 6.22. а) Размытое изображение, б) Изображение, улучшенное с помощью лапласиа-
лапласиана; контрастность усилена функцией ice
а)
z\
zl
Z2
Z5
4
Z3
4
z9
6)
-1
0
1
-2
0
2
-1
0
1
-1
-2
-1
0
0
0
1
2
1
Рис. 6.23. а) Окрестность (маска), б) и в) Маски Собела, используемые при вычислении
частных производных, соответственно, по направлению х (вертикальному) и у
(горизонтальному) относительно центральной точки этой окрестности
234 Глава 6. Обработка цветных изображений
Рис. 6.24. а-в) Изображения RGB компонентов (черный цвет — 0, белый — 255). г) Соот-
Соответствующее цветное изображение, д) Градиент, вычисленный непосредственно
в векторном пространстве RGB. е) Составной градиент, вычисленный сложе-
сложением двумерных градиентов каждой компоненты RGB
Рис. 6.25. a) RGB изоб-
изображение, б) Градиент,
вычисленный в вектор-
векторном пространстве RGB.
в) Соответствующее цвет-
цветное изображение, г) Гра-
Градиент, вычисленный ана-
аналогично рис. 6.25, е).
д) Модуль разности изоб-
изображений б) и в), приве-
приведенный к интервалу [0,1]
6.3. Основы обработки цветных изображений 235
а)
б)
Рис. 6.26. Два подхода к окружению данных в векторном пространстве RGB в задачах
сегментации изображений
а)
б)
Рис. 6.27. а) Псевдоцветное изображение поверхности спутника Юпитера Ио. б) Инте-
Интересующая область, выделенная интерактивной функцией roipoly. (Исходное
изображение предоставлено Агентством NASA)
Рис. 6.28. а)~г) Сегментация рис. 6.27, а) с опцией 'euclidean' функции colorseg при
Т = 25,50,75,100
236 Глава 6. Обработка цветных изображений
Рис. 6.29. а)-г) Сегмен-
Сегментация рис. 6.27, а) с оп-
опцией 'mahalanobis' функ-
функции colorseg при Т = 25,
50, 75, 100. Сравните с
рис. 6.28
6.4. Цветовые преобразования
Методы и процедуры, рассматриваемые в этом параграфе, основаны на обра-
обработке компонент цветного изображения или компоненты яркости полутонового
изображения в рамках единой цветовой модели. Для цветных изображений мы
ограничимся преобразованиями вида
8г=Тг{гг), г = 1,2,...,п,
где Ti и Si — это цветовые компоненты входного и выходного изображений, п —
размерность (или число цветовых компонент) цветового пространства т^, а Т{
обозначает функции полноцветного преобразования (или отображения).
Если входное изображение является монохромным, то эти уравнения следует
писать в виде
где г обозначает полутоновые величины, Si,Ti — то же, что и раньше, an — число
цветовых компонент Si. Это уравнение описывает отображение полутоновых пик-
пикселов в цветные. Такой процесс принято называть псевдоцветным преобразова-
преобразованием или псевдоцветным отображением. Отметим, что первое уравнение можно
использовать для воспроизведения монохромных изображений в RGB простран-
пространстве, если положить г\ — г2 = гз = г. В любом случае, приведенные здесь урав-
уравнения являются прямым расширением уравнений для преобразования яркости,
приведенным в § 3.2. Как и в том параграфе, все п псевдо- или полноцветных
функций преобразования {7\,Т2,... ,ТП} не зависят от пространственных коор-
координат (х, у) изображения.
Некоторые М-функции преобразований полутоновых изображений, которые
рассматривались в гл. 3, например, функция imcomplement, вычисляющая допол-
дополнительное изображение, не зависят от содержимого полутонового изображения.
6.4- Цветовые преобразования
Другие, например, функция histeq, которая зависит от распределения серых
тонов, являются адаптивными, но само преобразование фиксируется, как толь-
только вычислены необходимые параметры этого преобразования. А еще имеются
преобразования, вроде imadjust, для которых требуется сделать выбор подхо-
подходящих параметров формы кривой, что лучше всего выполнить пользователю в
интерактивном режиме. Такая же ситуация возникает при работе с полноцвет-
полноцветными и псевдоцветными изображениями, особенно когда приходится прибегать к
субъективному оцениванию изображений (например, при цветовой балансировке).
В таких приложениях имеет смысл отбирать подходящую функцию преобразо-
преобразования с помощью прямого графического манипулирования с потенциальными
функциями и наблюдения (в реальном времени) действия их комбинаций на об-
обрабатываемое изображение.
На рис. 6.11 (стр. 228) иллюстрируется простой, но весьма эффективный ме-
метод задания функций отображения графическим путем. На рис. 6.11, а) пока-
показано преобразование, которое построено линейной интерполяцией по трем кон-
контрольным точкам (маленькие кружки на графике); рис. 6.11, б) показывает ре-
результат кубической сплайновой интерполяции по тем же трем точкам; наконец,
рис. 6.11, в) и г) дают примеры более сложный линейной и сплайновой интерпо-
интерполяции. Оба типа интерполяции реализованы в MATLAB. Линейная интерполя-
интерполяция совершается функцией
z = interplq(x, у, xi),
которая возвращает вектор-столбец, состоящий из значений одномерной функ-
функции z в точках xi. В векторах-столбцах х и у записаны координаты по горизон-
горизонтали и вертикали контрольных точек. Элементы вектора х должны монотонно
возрастать. Длина z должна быть равна длине xi. Так, например, команда
>> z = interplq([O 255]', [0 255]', [0: 255]');
строит взаимно однозначное отображение, состоящее из 256 элементов и соеди-
соединяющее контрольные точки @,0) и B55,255), т. е. z = [0123 ... 255].
Аналогичным образом кубическая сплайновая интерполяция задается функ-
функцией
z = spline(x, у, xi),
где переменные z, х, у и xi были объяснены при описании функции interplq.
Точки xi должны быть различными. Кроме того, если в массиве у число элемен-
элементов на 2 больше, чем в массиве х, то его первый и последний элементы должны
быть коэффициентами наклонов касательных кубического сплайна в концевых
точках. Например, на рис. 6.11, б) кубический сплайн был построен с нулевыми
наклонами концевых касательных.
Функцию преобразования можно описать в интерактивном графическом ре-
режиме, манипулируя контрольными точками, которые являются входными дан-
данными функций interplq и spline, и получая на экране в реальном времени ре-
результат преобразования данного изображения построенной функцией. Функция
ice (Interactive Color Editing, интерактивное цветное редактирование) совершает
Глава 6. Обработка цветных изображений
в точности эти действия. Она имеет следующий синтаксис:
g = ice('Property Name', 'Property Value', ...),
где переменные ' Property Name' и ' Property Value' должны образовывать па-
пары, а многоточие означает дальнейшее повторение соответствующих входных
пар. В табл. 6.4 перечислены все допустимые входные пары функции ice. Неко-
Некоторые примеры будут рассмотрены далее в этом параграфе.
Таблица 6.4. Допустимые входные аргументы функции ice
Property Name
Property Value
'image' RGB или монохромное изображение f, которое будет преобразовано отоб-
отображением, заданным интерактивно.
' space' Цветовое пространство изображение, которое будет модифицировано. До-
Допустимые значения: 'rgb', 'any', 'hsi', 'hsv', 'ntsc', (или 'yiq') и
'ycbcr'. По умолчанию принято 'rgb'.
'wait' Если 'on' (по умолчанию), то g — это преобразованное входное изобра-
изображение. Если 'off, то g — это манипулятор преобразованного входного
изображения.
Если первым аргументом пары стоит 'wait', за которым следует явный ар-
аргумент 'on' (или он же принят по умолчанию), то выходом служит обработан-
обработанное изображение g. В этом случае функция ice принимает на себя контроль за
процессом, включая перемещение курсора, т. е. данные нельзя будет вводить с
клавиатуры в командном окне до тех пор, пока эта функция не будет закрыта, и
результатом будет являться изображение g. Если же выбран параметр 'off, то
g является манипулятором1 обрабатываемого изображения, и управление сра-
сразу передается окну команд, т. е. можно исполнять новые команды при активной
функции ice. Чтобы узнать свойства изображения с манипулятором g, достаточ-
достаточно выполнить команду get
h = get(g),
которая возвращает все свойства и текущие величины графического объекта,
обозначенного манипулятором g. Свойства хранятся в виде структуры п, поэтому
за вызовом в командной строке h последует список всех свойств обрабатываемого
изображения (см. §§2.10.6 и 11.1.1, где объясняются структуры). Чтобы получить
конкретное свойство, надо набрать h.PropertyName.
Пусть f обозначает монохромное или RGB изображение. Вот примеры неко-
некоторых синтаксических форм функции ice:
>> ice
>> g = ice ('image', f) ;
% Показывает один графичес-
°/о кий интерфейс.
% Показывает и возвращает
% отображенное изображение g.
1При создании некоторого графического объекта MATLAB сопоставляет ему идентификатор,
называемый манипулятором, который обеспечивает доступ к свойствам этого графического
объекта. Графические манипуляторы полезны при изменении внешнего вида и оформления
графиков или при оформлении группы графических команд в виде отдельного М-файла, в
котором можно прямо создавать объекты и манипулировать ими.
6.4- Цветовые преобразования 239)))
>> g = ice('image', f, 'waite', 'off'); °/0 Показьюает g
°/0 и возвращает манипулятор.
>> g = ice('image', f, 'space', 'hsi'); °/0 Преобразует GGB
% изображение f в формат HSI.
Отметим, что при задании цветового пространства, отличного от RGB, входное
изображение конвертируется в это пространство до совершения преобразования.
После этого преобразованное изображение вновь конвертируется в RGB. Выхо-
Выходом функции ice всегда служит изображение RGB, а входом является моно-
монохромное или RGB изображение. Если набрать команду g = ice ('image', f),
то на рабочем столе MATLAB появится заданное изображение, а также окно
графического интерфейса пользователя (GUI, Graphical User Inerface), как это
показано на рис. 6.12 (стр. 228). В начале диалога кривая преобразования яв-
является прямой линией с двумя контрольными точками на концах. Контрольные
точки можно перемещать с помощью мыши в соответствии с правилами, приве-
приведенными в табл. 6.5. В табл. 6.6 перечислены функции других компонентов GUI.
В следующем примере рассматривается типичное применение функции ice.
Таблица 6.5.
Манипулирование контрольными точками посредством мыши
Действие мыши
Левая кнопка
Левая кнопка +
Левая кнопка +
Shift
Ctrl
Результат
Перемещение контрольной точки при удержании
кнопки и перетаскивании объекта.
Создание новой контрольной точки. Ее положение молено изменять,
перетаскивая мышью (при нажатой клавише Shift).
Удаление контрольной точки.
Пример 6.3. Обратное (негативное) преобразование монохромного изображе-
изображения и цветовых компонентов цветного.
На рис. 6.13, а) (стр. 229) приведен интерфейс ice после того, как заданная по
умолчанию кривая на рис. 6.12 была модифицирована и приведена к графику
функции обратного или негативного преобразования. Для этого контрольная точ-
точка @, 0) была перемещена (с помощью удержания левой клавиши мыши) в верх-
верхний левый конец, а контрольная точка A,1) была передвинута в точку с коорди-
координатами A.0). Обратите внимание на то, что координаты курсора отображаются
красным цветом в полях Input/Output. Изменяется только RGB отображение, а
отображения индивидуальных компонент R, G и В остаются в исходном состоя-
состоянии, принятом по умолчанию2 (см. элемент Component в табл. 6.6). Если входное
изображение было монохромным, то это гарантирует сохранение монохромно-
сти на выходе. На рис. 6.13, б) приведено негативно монохромное изображение,
которое получается при обратном преобразовании. Заметим, что оно идентично
рис. 3.3, б), который был получен с помощью функции imcomplement. Псевдо-
Псевдоцветная полоса Pseudo-color Bar на рис. 6.13, а) является «негативной фотогра-
фотографией» исходной полутоновой шкалы из рис. 6.12.
2Отображения, принятые по умолчанию, в большинстве примеров не показываются.
Глава 6. Обработка цветных изображений
Функция обратного (негативного) отображения также полезна при обработке
цвета. Как можно увидеть на рис. 6.14, а) и б) (стр. 229), результат этого пре-
преобразования похож на обычный негатив цветной фотопленки. Например, крас-
красный мелок в нижнем ряду на рис. 6.14, а) стал голубым на рис. 6.14, б) (голубой
цвет дополнителен красному). Дополнением первичного цвета служит смешание
двух других первичных цветов (т.е. голубой — это синий плюс зеленый). Как
и в монохромном случае, цветное дополнение удобно при усилении деталей на
темных цветовых участках, особенно если эти области превалируют на изобра-
изображении. Заметьте, что цветная полоса Full-color Bar на рис. 6.13, а) состоит из
дополнительных цветов исходной Full-color Bar из рис. 6.12. ?
Таблица 6.6. Функции кнопок и окошек отметок в GUI ice
Элемент GUI Функция
Smooth Если отмечено, то используется кубическая сплайновая (гладкая) интерполя-
интерполяция. Если отметка снята, то используется кусочно линейная интерполяция.
Clamp Ends Отметка означает начало и конец сплайновой кривой с нулевым наклоном.
При линейной интерполяции не действует.
Show PDF Показывать функции плотности вероятностей (т. е. гистограммы) компо-
компонент изображений, подвергнутых преобразованию.
Show CDF Показывать функции распределения вероятностей вместо PDF. (Одновре-
(Одновременно увидеть CDF и PDF нельзя.)
Map Image Если отмечено, то разрешено отображение изображения, иначе — нет.
Map Bars Если отмечено, то разрешено отображение псевдо- и полноцветных полос
цветового тона; иначе отображаются не преобразованные полосы.
Reset Инициализация последней отображенной функции преобразования и снятие
всех отмеченных элементов.
Reset All Инициализация всех функций преобразований.
Input/Output Показывают координаты выбранной контрольной точки на кривой преоб-
преобразования. Input отвечает горизонтальной оси, a Output — вертикальной.
Component Выбор функции отображения для интерактивного манипулирования. В прост-
пространстве RGB возможен выбор R, G, В или RGB (которая отображает все
три цветные компоненты). В пространстве HSI доступны опции Н, S, I или
HSI, и т. д.
Пример 6.4. Улучшение монохромной и цветной контрастности.
Теперь рассмотрим использование функции ice при улучшении монохромной и
цветной контрастности. На рис. 6.15 (стр. 229) с а) по в) продемонстрирована
эффективность этой функции при работе с монохромными изображениями. На
рис. 6.15 с г) по е) показан такой же хороший результат при работе с цветным
входом. Как и в предыдущем примере, непоказанные функции отображения со-
сохраняют свои установки по умолчанию. На обеих сериях иллюстраций отмечены
опции Show PDF. Поэтому гистограмма аэрофотоснимка (рис. 6.15, а)) приведе-
приведена под функцией гамма-формы отображения на рис. 6.15, в) (см. § 3.2.1), а на
рис. 6.15, е) построено сразу три гистограммы рис. 6.15, г) — по одной на каждую
из цветных компонент. Несмотря на то, что S-образная функция преобразования,
приведенная на рис. 6.15, е), улучшает контрастность изображения 6.15, д) по
сравнению с рис. 6.15, г), оно также слегка действует и на компоненту цветного
тона. На рис. 6.15, д) небольшое изменение цвета почти не заметно глазу, но его
6.4- Цветовые преобразования
можно обнаружить на соответствующей полноцветной полосе рис. 6.15, е). На-
Напомним, что в предыдущем примере было продемонстрировано, что одинаковое
изменение цветных компонент может весьма существенно отразиться на цветах
RGB изображения (см. функцию дополнения цветов на рис. 6.14). ?
Красная, зеленая и синяя компоненты входного изображения из примеров 6.3
и 6.4 отображались одинаково, т. е. с использованием одной и той же функции
преобразования. Чтобы избежать задания трех одинаковых функций, функция
ice позволяет определить функцию «для всех компонент» (кривую RGB при ра-
работе в RGB пространстве), которая одинаково отображает все компоненты вход-
входного изображения. В остальных примерах демонстрируются преобразования, ко-
которые по-разному действуют на разные цветовые компоненты.
Пример 6.5. Псевдоцветные отображения.
Как уже отмечалось ранее, когда монохромное изображение представлено в цве-
цветовом пространстве RGB и цветовые компоненты преобразуются независимо друг
от друга, результат такого преобразования называется псевдоцветным изобра-
изображением, в котором входные полутоновые уровни заменены некоторыми цветами.
Такие преобразования могут быть полезными, т. к. глаз человека способен раз-
различать миллионы цветов, но он отличает лишь относительно малое число оттен-
оттенков серого тона. Поэтому псевдоцветные отображения часто используются при
желании сделать малые колебания яркости монохромного изображения более за-
заметными и различимыми для глаза и для выделения важных областей на полу-
полутоновых изображениях. На самом деле, основное применение псевдоцвета — это
зрительная визуализация, т. е. интерпретация черно-белых событий на изобра-
изображениях или последовательности изображений с помощью монохромно-цветного
преобразования.
На рис. 6.16, а) (стр. 230) дана рентгенограмма сварного шва (горизонталь-
(горизонтальная темная область), в котором имеются щели и раковины (яркие белые чер-
черточки по середине изображения). Псевдоцветная версия этого изображения при-
приведена на рис. 6.16, б), которая была построена отображением зеленой и синей
компонент входного RGB-преобразованного изображения с помощью функции
из рис. 6.16, в) и г). Обратите внимание на существенное визуальное отличие
этих двух изображений. Псевдоцветная полоса в окне GUI дает представление
о составном цветовом отображении. Из рис. 6.16, в) и г) видно, что выбранная
интерактивно функция отображает черно-белую шкалу серого тона в цветную по-
полосу между синим и красным цветом, причем желтый зарезервирован за белым
цветом. Конечно, желтый цвет соответствует трещинам и раковинам, которые
являются главными характеристиками в данном примере. ?
Пример 6.6. Балансировка цвета.
На рис. 6.17 (стр. 230) показано приложение с полноцветным изображением, в ко-
котором выгодно преобразовывать цветовые компоненты независимо друг от друга.
Отображения такого типа принято называть цветовой балансировкой или цвето-
цветовой коррекцией. Раньше для выполнения таких действий требовались высокока-
высококачественные цветовоспроизводящие системы, а теперь их можно совершить почти
на любом персональном компьютере. Эта процедура используется при улучшении
242 Глава 6. Обработка цветных изображений
цветных фотографий. Хотя разбалансировку цвета можно установить объектив-
объективно анализируя (с помощью цветного спектрометра) некоторый известный цвет на
изображении, аккуратное визуальное оценивание также возможно, если на изоб-
изображении имеются белые области, где RGB или CMY компоненты должны быть
равны между собой. Кроме того, как видно на рис. 6.17, оттенки человеческой
кожи могут служить отличным образцами для визуального оценивания, так как
человеческий глаз весьма восприимчив даже к малым отклонениям от истинного
цвета на этих участках.
На рис. 6.17, а) показано отсканированное CMY изображение матери с ребен-
ребенком с избытком пурпурного цвета (помните, что MATLAB может отображать
лишь RGB версии изображений). Для простоты и для совместимости с системой
MATLAB функция ice также допускает лишь RGB (и монохромные) изобра-
изображения, однако она может обрабатывать входы различных цветовых форматов,
указанных в табл. 6.4. Например, чтобы интерактивно модифицировать CMY
компоненты RGB изображения f 1, следует вызвать функцию ice в следующем
виде:
>> f2 = ice('image', fl, 'space', 'CMY');
Из рис. 6.17 видно, что небольшое уменьшение пурпурной компоненты произво-
производит ощутимое воздействие на цвет изображения. ?
Пример 6.7. Отображения на основе гистограмм.
Гистограммная эквализация является процессом преобразования полутоновых
изображений, при котором получается монохромное изображение с гистограммой
яркости, близкой к гистограмме равномерного распределения. Как обсуждалось
в § 3.3.2, требуемая функция отображения является функцией распределения
уровней серых тонов входного изображения. Поскольку цветные изображения
состоят из нескольких компонент, монохромную процедуру необходимо приспо-
приспособить к обработке более одной компоненты и ассоциированной гистограммы.
Однако эти преобразования не следует делать независимо друг от друга, иначе
можно получить ложные цвета. Правильный подход заключается в приближении
к равномерному распределению для компоненты интенсивностей, оставляя сами
цвета (компоненты цветового тона) неизменными.
На рис. 6.18, а) (стр. 231) изображена вращающаяся стойка для специй и при-
приправ. Преобразованное изображение на рис. 6.18, б) было получено HSI преоб-
преобразованием, приведенном на рис. 6.18, в) и г). Оно выглядит значительно ярче
исходного. Теперь стали хорошо различимы форма и текстура деревянного сто-
стола, на котором расположена стойка для специй. Компонента интенсивности была
преобразована функцией на рис. 6.18, в), которая хорошо аппроксимирует функ-
функцию CDF этой компоненты (которая также построена на этом графике). Функция
отображения насыщенности на рис. 6.18, г) была выбрана так, чтобы улучшить
общее цветовое восприятие результата эквализации компоненты интенсивности.
Отметим, что гистограммы входных и выходных данных всех трех цветовых
компонент: цветового тона, насыщенности и интенсивности, приведены, соответ-
соответственно, на рис. 6.18, д) и е). Компоненты цветовых тонов остались неизменны-
неизменными (как объяснялось выше), а компоненты насыщенности и интенсивности были
6.5. Пространственная фильтрация цветных изображений
исправлены. Осталось заметить, что для обработки RGB изображения в цвето-
цветовом пространстве HSI мы добавили в аргументы команды ice пару аргументов
'space' и 'hsi'. ?
Выходные изображения, построенные в предыдущих примерах этого парагра-
параграфа, имеют тип RGB и принадлежат классу uint8. Для монохромных результа-
результатов, как в примере 6.3, все три RGB компоненты идентичны. Более компактную
форму представления таких изображений можно получить, применив функцию
rgb2gray из табл. 6.3, или воспользовавшись командой
>> f3 = f2(:, : ,1);
где f2 — это RGB изображение, построенное в ice, a f3 — стандартное моно-
монохромное изображение в MATLAB.
6.5. Пространственная фильтрация цветных изображений
В § 6.4 рассматривались преобразования цветных изображений, которые приме-
применяются к отдельным пикселам каждой цветовой плоскости (компоненты). Следу-
Следующий уровень сложности соответствует обработке пространственных окрестно-
окрестностей, которая также совершается на каждой цветовой плоскости. Для монохром-
монохромных изображений этот переходный момент уже обсуждался при рассмотрении
преобразований яркости в § 3.2 и при исследовании пространственной фильтра-
фильтрации в§§3.4и3.5. Мы будем исследовать пространственную фильтрацию цветных
изображений в основном в пространстве RGB, однако базовая схема применима
к любой цветовой модели. Мы будем иллюстрировать методы пространственной
обработки цветных изображений на двух примерах процедур линейной фильтра-
фильтрации: сглаживание изображений и повышение резкости изображений.
6.5.1. Сглаживание цветных изображений
Если обратиться к рис. 6.10, а) и к §§ 3.4 и 3.5, то сглаживание (пространствен-
(пространственная фильтрация) монохромных изображений осуществляется умножением значе-
значений всех пикселов в пространственной маске на соответствующие коэффициен-
коэффициенты, суммированием и делением суммы на общее число элементов маски. Процесс
сглаживания полноцветных изображений с помощью пространственной маски по-
показан на рис. 6.19, б) (стр. 232). Этот процесс (например, в пространстве RGB)
определяется так же, как и при работе с монохромными изображениями, с той
лишь разницей, что вместо одиночных, скалярных пикселов приходится работать
с векторными величинами в представлении, изложенном в § 6.3.
Пусть Sxy обозначает множество точек окрестности (маски) с центром в точке
(ж, у) некоторого цветного изображения. Среднее RGB векторов этой окрестности
задается формулой
ё(х,у) = —
(s,t)esxy
где К — это число пикселов окрестности. Из свойства сложения векторов (см. § 6.3)
244 Глава 6. Обработка цветных изображений
следует, что
~к
Видно, что каждая компонента этого вектора получается при окрестностном
осреднении каждой отдельной цветовой компоненты, которую можно выполнять
по схеме стандартного осреднения монохромных изображений. Значит, сглажи-
сглаживание пространственным осреднением можно выполнять независимо на покомпо-
покомпонентной основе. Результат будет совпадать с осреднением в цветовом векторном
пространстве.
Как уже объяснялось в § 3.5.1, линейные пространственные фильтры для
сглаживания изображений строятся функцией f special, которая имеет три воз-
возможные опции: 'average', 'disk' и 'gaussian' (см. табл. 3.4). После того, как
фильтр сгенерирован, процедура фильтрации совершается функцией imf ilter,
которая вводилась в § 3.4.1.
В идейном плане сглаживание цветных RGB изображений, скажем, f с линей-
линейным пространственным фильтром, состоит из следующих шагов.
1. Выделить три компоненты изображения:
» fR = fc(:, : ,1); fG = fc(:, : ,2); fB = fc(:, : ,3);
2. Отфильтровать отдельно каждую компоненту. Например, пусть w обознача-
обозначает сглаживающий фильтр, построенный командой f special, тогда красная
компонента сглаживается следующим образом:
» fR.filtered = imfilter(fR, w);
и аналогично обрабатываются остальные компоненты изображения.
3. Реконструировать отфильтрованное RGB изображение:
>> fc_filtered = catC, fR_filtered, fG.filtered, fB_filtered);
Однако мы можем совершать линейную фильтрацию прямо RGB изображений
MATLAB с помощью того же синтаксиса, что и при обработке монохромных
изображений, что позволяет объединить описанные выше три шага в один:
>> fc_filtered = imfilter(fc, w) ;
Пример 6.8. Сглаживание цветных изображений.
На рис. 6.19, а) (стр. 232) дано RGB изображение размерами 1197x1197, а на
рис. 6.19 с б) по г) — компоненты RGB этого изображения, извлеченные с помо-
помощью описанной выше процедуры. На рис. 6.20 (стр. 232) с а) по в приведены три
компоненты HSI изображения на рис. 6.19, а), построенные с помощью функции
rgb2hsi.
Рис. 6.20, а) представляет результат сглаживания рис. 6.19, а) с помощью
функции imf ilter с опцией 'replicae' и фильтром 'average' размерами 25x25.
6.5. Пространственная фильтрация цветных изображений
Усредняющий фильтр является достаточно большим для достижения заметного
эффекта размытия. Такой размер фильтра был выбран для того, чтобы проде-
продемонстрировать разницу между сглаживанием в пространстве RGB и попыткой
достигнуть аналогичный результат, используя только компоненту интенсивно-
интенсивности, которая получается после конвертации изображения в цветовое пространство
HSI. Рис. 6.21, б) (стр. 233) был получен с помощью команд:
>> h = rg2hsi(fc);
>> Н = h(:, : ,1); S = h(:, : ,2); I = h(:, : ,3);
>> w = fspecial('average', 25);
>> I_filtered = imfilterd, w, 'replicae');
>> h = catC, H, S, I_filtered) ;
>> f = hsi2rgb(h) ;
>> f = min(f, 1); °/0 RGB images must have values in the range [0, 1] .
>> imshow(f)
Ясно, что результаты фильтрации существенно различаются. Например, кро-
кроме меньшего размытия, можно заметить на изображении б) зеленые обводы по
верхним границам лепестков, чего нет на рис. а). Причина этого явления заклю-
заключается в том, что компоненты цветового тона и насыщенности не изменялись, в
то время как перепады компоненты интенсивности были существенно сглажены.
Может показаться правильным сделать сглаживание по всем трем компонентам
с помощью одного и того же фильтра. Однако в такой процедуре существенно
изменятся соотношения между величинами цветового тона и насыщенности, что
дает ложные цвета, как это видно на рис. 6.21, в).
Общее правило таково: чем больше размер маски, тем больше разница меж-
между результатами фильтрации компонент RGB и компоненты интенсивности HSI
эквивалентного изображения. ?
6.5.2. Повышение резкости цветных изображений
Повышение резкости цветных RGB изображений с помощью линейного простран-
пространственного фильтра выполняется теми же процедурами, что и в предыдущем пара-
параграфе, но с использованием фильтра, повышающего резкость. В данном парагра-
параграфе этот метод демонстрируется на примере лапласиана (см. § 5.5.1). Из векторно-
векторного анализа известно, что лапласиан вектора определяется как вектор, компонен-
компоненты которого равны лапласиану от соответствующих скалярных компонент вход-
входного вектора. В цветовом пространстве RGB лапласиан от вектора с (см. § 6.3)
равен
V2[R(x,y)}
V2[c(x,y)} =
V2[G(x,y)\
V2[B(x,y)}
Как и в предыдущем параграфе, эта формула означает, что лапласиан от цветно-
цветного изображения можно находить с помощью вычисления лапласиана от каждой
отдельной цветовой компоненты.
Глава 6. Обработка цветных изображений
Пример 6.9. Повышение резкости цветных изображений.
На рис. 6.22, а) (стр. 233) приведен слегка размытый вариант bf изображения на
рис. 6.19, а), полученного усредняющим фильтром размерами 5x5. Чтобы повы-
повысить резкость этого изображения, можно воспользоваться маской фильтра Ла-
Лапласа
>> lapmask = [1 1 1; 1 -8 1; 1 1 1] ;
Затем, как и в примере 3.9, улучшенное изображение вычисляется и отобража-
отображается на дисплее командами
>> fen = imsubtract(fb, imfilter(fb, lapmask, 'replicate'));
>> imshow(fen)
Здесь два необходимых шага обработки выполнены в одной команде. Как и в
предыдущем параграфе, RGB изображение обрабатывалось как монохромное
изображение (т.е. с той лее формой вызова) при исполнении команды imfilter.
На рис. 6.22, б) показан результат. Обратите внимание на заметный эффект по-
повышения резкости отдельных деталей, например, капелек воды, прожилок ли-
листьев, желтого центра цветка и зеленой травы на заднем плане. ?
6.6. Обработка в векторном пространстве RGB
напрямую
Как отмечалось в § 6.3, имеются случаи, когда раздельная обработка цветовых
плоскостей не эквивалентна прямой работе в векторном пространстве RGB. Это
демонстрируется в данном параграфе на примере двух важных приложений: об-
обнаружение контуров на цветных изображениях и сегментация областей.
6.6.1. Обнаружение контуров на цветных
изображениях с помощью градиента
Градиентом двумерной функции f{x,y) называется следующий вектор:
Модуль (длина) этого вектора равен
= mag(V/) = [G2X + G2]1'2 = [(df/дхJ + (df/дуJ]1'2.
Часто эту величину можно аппроксимировать с помощью суммы абсолютных
величин
Такое приближение позволяет избежать возведения в квадрат и извлечения квад-
квадратного корня, но при этом оно ведет себя как производная (т. е. оно равно ну-
нулю на областях с постоянным цветом пикселов, и его величина пропорциональна
степени изменения цвета на неоднородных областях). Общепринято называть мо-
модуль градиента просто «градиентом».
6.6. Обработка в векторном пространстве RGB напрямую
Основное свойство вектора-градиента состоит в том, что он направлен в сторо-
сторону максимального роста / в точке с координатами (х, у). Угол этого направления
равен
а(х,у) =arctg —-
Производные принято аппроксимировать разностями значений пикселов в ма-
малой окрестности изображения. На рис. 6.23, а) (стр. 233) показана окрестность
размерами 3x3, где буквы z обозначают значения пикселов. Приближение част-
частной производной в (вертикальном) направлении х по отношению к центральной
точке окрестности (т.е. z$) определяется разностной формулой
Gx = (z7 + 2z8 + z9) - B1 + 2z2 4- 23).
Аналогично, частная производная по направлению у приближается разностным
выражением
Gy = (z3 + 2z6 + z9) - (z! + 2z4 + z7).
Обе эти величины легко вычисляются во всех точках изображения с помощью
свертки (функция imf ilter) изображения с двумя масками, приведенными на
рис. 6.23, б) и в). После этого приближение градиентного изображения получа-
получается сложением абсолютных величин двух фильтрованных изображений. Указан-
Указанные выше маски являются масками Собела, приведенными в табл. 3.4, которые
строятся с помощью функции f special.
Описанный выше метод вычисления градиента часто используется в задачах
обнаружениях контуров на полутоновых изображениях, которые будут подробно
разбираться в гл. 10. В данный момент мы интересуемся вычислением градиента
в цветовом RGB пространстве. Однако приведенный метод применим только для
двумерных пространств, и его нельзя распространить на большие размерности.
Остается только подход, основанный на вычислении градиента для каждой цве-
цветовой компоненты изображения и сложении этих градиентов. К сожалению, как
скоро будет видно, такой путь не всегда приводит к решению задачи обнаруже-
обнаружения контуров на цветных RGB изображениях.
Итак, проблема прежде всего заключается в том, чтобы определить градиент
(модуль и направление) вектора с, заданного в § 6.3. Приведем далее некоторый
вариант распространения понятия градиента на вектор-функции. Напомним, что
для скалярной функции f(x,y) вектор градиента указывает в направлении мак-
максимального роста функции / в точке с координатами (ж, у).
Пусть г, g и b — единичные векторы, направленные вдоль осей R, G и В
цветового пространства RGB (см. рис. 6.2). Зададим векторы
8R 3G дВ^
и= -^-г+ ^-g+ -?-b
OR dG <9Я
ду ^ ду*^ ду
Глава 6. Обработка цветных изображений
Пусть следующие величины дхх, дуу и дху задаются с помощью скалярных про-
произведений этих векторов:
дхх = и • u = uTu =
dR
dx
dR
dy
2
+
dG
dx
dG
dy
2
+
dB
dx
dB
dy
T _ORdR dG_dG_ dB_dB^
gxy - u • v - u v - g^ ду + дх ду + дх ду-
Следует помнить, что величины i?, G и Б, а, следовательно, и все g являют-
являются функциями от х и у. С помощью введенных обозначений можно показать
(см. [Di Zenzo, 1986]), что угол направления максимального изменения (роста и
убывания) вектора с(х, у) как функции (ж, у) удовлетворяет уравнению
^9ху
' (9хх-9ууУ
а величина скорости изменения (т. е. модуль градиента) в направлении этого угла
в задается выражением
Fe(x, у) = 1 - [{дхх + дуу) + (дхх - дуу) cos20 + 2дху sin 26] >
1/2
Напомним, что в(х, у) и F$(x1 у) являются изображениями, размеры которых сов-
совпадают с размерами входного изображения. Элементами 6(х,у) являются углы
градиентов в каждой точке исходного изображения, a Fe(x,y) — модуль этого
градиента.
Заметим, что tg(a) = tg(a ± тг), поэтому если во является решением урав-
уравнения с tg, то и величина во + тг/2 также является его решением. Кроме того,
Fg(x,y) = Fo+n(x,y), т.е. функцию F$, достаточно вычислять лишь для тех ве-
величин 0, которые расположены в полуоткрытом интервале [О,тг). Тот факт, что
уравнения для в имеет два решения, которые различаются на 90°, означает, что
с каждой точкой (х,у) изображения связаны два направления, расположенные
ортогонально друг к другу. Вдоль одного из этих направлений скорость измене-
изменения функции F максимальна, а вдоль другого — минимальна, поэтому оконча-
окончательный результат получается выбором максимума из этих двух чисел в каждой
точке изображения. Вывод этих формул занимает много места, но мало добавля-
добавляет к пониманию основных целей рассматриваемого предмета. Заинтересованный
читатель может найти весьма подробное изложение этого материала в работе
[Di Zenzo, 1986]. Частные производные, необходимые при решении приведенных
выше уравнений, можно вычислять, например, с помощью операторов Собела,
которые упоминались выше.
Следующая функция реализует вычисление градиента цветного RGB изобра-
изображения (см. программный код в приложении В):
[VG, A, PPG] = colorgrad(f, Т) ,
6.6. Обработка в векторном пространстве RGB напрямую
где f — это RGB изображение, Т — порог (необязательный параметр) в интер-
интервале [0,1] (по умолчанию равен 0); VG — модуль RGB градиента Fo(x,y); A —
это матрица углов 9{х,у) в радианах; a PPG — это градиент, полученный сложе-
сложением двумерных градиентов отдельных цветовых плоскостей (вычисляется для
сравнения результатов). Эти последние градиенты равны, Vi?(x,y), VG(x, у) и
—т(ж,у), где оператор V определялся ранее в этом параграфе. Все используемые
частные производные вычисляются функцией colorgrad с помощью операторов
Собела. Выходы VG и PPG нормированы в интервале [0,1], и, кроме того, функция
colorgrad осуществляет срезание больших значений VG в соответствии с поро-
пороговым значением Т: VG(x, у) = 0 там, где вычисленное значение больше Т. Эти
же действия выполняются для выхода PPG.
Пример 6.10. Обнаружение контуров на цветных изображениях с помощью
функции colorgrad.
На рис. 6.24 (стр. 234) с а) по в) приведены три простых монохромных изобра-
изображения, которые при использовании их в качестве RGB плоскостей дадут цветное
изображение, показанное на рис. 6.24, г). Целями этого примера являются:
A) демонстрация функции colorgrad,
B) иллюстрация того факта, что вычисление градиента цветного изображения
путем сложения градиентов отдельных цветовых плоскостей отличается от
результата нахождения градиента непосредственно в цветовом векторном
пространстве RGB с помощью описанного выше метода.
Пусть f обозначает RGB изображение на рис. 6.24, г). Команда
>> [VG, A, PPG] = colorgrad(f);
строит изображения VG и PPG, которые приведены на рис. 6.24, д) и е). Самое
главное различие между этими двумя результатами заключается в том, что го-
горизонтальный контур на рис. 6.24, е) существенно слабее соответствующего кон-
контура на рис. 6.24, д). Причина очень проста: градиенты красной (R) и зеленой (G)
плоскостей (рис. 6.24, а) и б)) дают два вертикальных контура, а из градиента
синей плоскости выявляется всего один горизонтальный контур. При сложении
этих трех градиентов получается, что вертикальный контур имеет в два раза
большую интенсивность, чем горизонтальный.
С другой стороны, при вычислении градиента цветного изображения непо-
непосредственно в векторном пространстве (рис. 6.24, д)) отношение значений на вер-
вертикальном и горизонтальном краях равно \/2, а не 2. Причина опять проста:
при обращении к цветовому кубу на рис. 6.2, а) и к рис. 6.24, г) видно, что вер-
вертикальный контур на цветном изображении расположен между синим и белым
квадратами, а также между черным и желтым. Расстояние между этими цветами
на цветовом кубе равно \/2, а расстояние между черным и синим, а также между
желтым и белым (горизонтальный контур) равно 1. Поэтому отношение верти-
вертикального и горизонтального контура равно у/2. Если в конкретном приложении
важное значение имеет точность обнаружения контуров, особенно при использо-
использовании срезающих порогов, то разница между результатами этих двух подходов
может быть неприемлемо большой. Например, если использовать порог 0.6, то
горизонтальная линия на рис. 6.24, е) просто исчезнет.
Глава 6. Обработка цветных изображений
На практике, если задача заключается в грубом определении контуров, то
оба подхода дают вполне сравнимые результаты. Например, рис. 6.25, б) и в)
(стр. 234) аналогичны рис. 6.24, д) и е). Они получены применением функции
colorgrad к изображению 6.25, а). На рис. 6.25, г) приведена разность этих двух
изображений, приведенная к шкале [0,1]. Максимальное значение модуля разно-
разности изображений равно 0.2, что соответствует 51 уровню градации серого цвета
на обычных 8-ми битовых изображениях. Однако при визуальном оценивании
эти два изображения выглядят весьма близкими, и лишь в некоторых местах
изображение на рис. 6.23, б) кажется более ярким (по причинам, разъясненным
в предыдущих абзацах). Значит, для грубого и субъективного анализа вполне
годится более простой метод вычисления градиента, основанный на сложении
градиентов отдельных плоскостей. В других случаях (например, при автомати-
автоматическом контроле расхождения цветов после окраски промышленной продукции)
может понадобиться более аккуратный векторный метод исследования. ?
6.6.2. Сегментация в векторном пространстве RGB
Сегментацией называется процесс разделения изображения на области. Несмотря
на то, что этой теме посвящена гл. 10, мы кратко рассмотрим в этом параграфе
цветовую сегментацию, чтобы не прерывать логику изложения. У читателя не
должно возникнуть сложностей при ознакомлении с этим материалом.
Цветовая сегментация в векторном пространстве RGB заключается в следу-
следующем. Предположим, что наша цель состоит в выделении объектов на изобра-
изображении RGB, цвет которых лежит в определенном диапазоне. Имея некоторую
репрезентативную выборку векторов, имеющих интересующий нас цвет, мы полу-
получаем оценку «среднего» цвета, который необходимо выделить. Пусть этот сред-
средний цвет обозначен RGB вектором-столбцом т. Задача сегментации состоит в
том, чтобы классифицировать каждый RGB пиксел изображения и определить,
принадлежит он выделенному «среднему» цветовому классу или нет. Чтобы вы-
выполнять такое сопоставление, необходимо иметь некоторую меру сходства цветов.
Простейшей такой мерой может служить евклидово расстояние. Пусть z — про-
произвольная точка пространства RGB. Мы скажем, что точка z схожа по цвету с
т, если расстояние между этими точками не превосходит некоторого порогового
значения Т. Евклидово расстояние между гит вычисляется по формуле1
D(z, m) = ||z - m|| = [(z - m)T(z -
= [(zR - mRJ + (zG - mGJ + (zB - mBJ]1/2,
где || • || обозначает норму аргумента, а нижние индексы Д, G и В используются
для обозначения RGB компонентов векторов гит. Геометрическое место точек,
для которых D(z, m) ^ Т является шаром радиуса Т, который изображен на
рис. 6.26, а) (стр. 235). По определению, точки, лежащие внутри шара или на
его сферической поверхности, удовлетворяют заданному цветовому критерию,
1 Следуя общепринятым правилам, мы используем верхний индекс Т для обозначения операции
транспонирования матриц и векторов, а вне индексных полей буква Т обозначает пороговую
величину. При некоторой аккуратности такое совмещение обозначений не должно приводить к
ошибкам.
6.6. Обработка в векторном пространстве RGB напрямую
а точки, лежащие вне этого шара и его граничной сферы — не удовлетворяют.
Если присваивать двум соответствующим множествам изображения значения,
скажем, 1 (белое) и 0 (черное), то получится двоичное изображение, которое
является результатом сегментации изображения.
Полезным обобщением евклидова расстояния является расстояние, задавае-
задаваемое выражением
D(z, m) = [(z - m)TC-1(z - m)]1/2,
где С — это ковариационная матрица2 репрезентативной выборки векторов по от-
отношению к цвету, который необходимо сегментировать. Это расстояние принято
называть расстоянием Махаланобиса^. Геометрическое место точек, для кото-
которых /}(z,m) ^ Т представляет собой трехмерный эллипсоид (см. рис. 6.26, б),
который имеет следующее важное свойство: направления его главных осей сов-
совпадают с направлениями наибольшего разброса данных выборки. Если ковариа-
ковариационная матрица С является единичной, то расстояние Махаланобиса совпадает
с обычным евклидовым расстоянием. Процедура сегментации делается так же,
как описано в предыдущем абзаце, только данные теперь окружаются не шаром,
а эллипсоидом.
Сегментация по описанным выше правилам реализована в IPT функцией
colorseg (см. ее код в приложении В), которая имеет синтаксис
S = colorseg(method, f, Т, parameters),
где method — это или 'euclidean', или 'mahalanobis', f — разделяемое RGB
изображение, а Т — пороговое значение, о котором говорилось выше. Входные
параметры — это либо вектор т, если method = 'euclidean', либо т и С, если
method = 'mahalanobis'. Здесь т — это в точности вектор т, введенный выше,
который может быть вектором-строкой или вектором-столбцом, а С обозначает
ковариационную матрицу 3x3. Выходом функции служит двоичное изображение
S, размеры которого совпадают с размерами исходного изображения. В изобра-
изображении S нули стоят там, где пороговый критерий нарушается, а единицы — на
тех местах, где этот критерий выполняется. Единицы определяют область, сег-
сегментированную по заданному цветовому признаку.
Пример 6.11. Сегментация цветного RGB изобрасисения.
На рис. 6.27, а) (стр. 235) приведено псевдоцветное изображение некоторой об-
области на поверхности спутника Юпитера Ио. На этом изображении красноватые
цвета выдают новые геологические образования, исторгнутые из недр действу-
действующего вулкана, которые окружены более древними осадочными сульфидными
породами. В этом примере иллюстрируется выделение красноватой области с
помощью обоих методов, заложенных в функцию colorseg.
Сначала необходимо получить репрезентативную выборку диапазона цветов,
по которым мы будем делать сегментацию. Простой способ выделения интере-
интересующей области ROI (Region Of Interest) заключается в использовании функ-
2 Вычисление ковариационной матрицы по заданному множеству векторов детально рассмат-
рассматривается в § 11.5.
3В § 12.2 рассматриваются эффективные методы вычисления расстояний Евклида и Махаланобиса.
Глава 6. Обработка цветных изображений
ции roipoly, которая вводилась в § 5.2.4. Эта функция выдает двоичную мас-
маску многоугольной области, вершины которой выбираются в интерактивном ре-
режиме. Пусть f обозначает цветное изображение на рис. 6.27, а), а область на
рис. 6.27, б) была построена с помощью следующих команд:
>> mask = roipoly(f); °/0 Select region interactively.
>> red = immultiply(mask, f(:, :, D);
>> green = immultiply(mask, f(:, :, 2));
>> blue = immultiply(mask, f(:, :, 3));
>> g = catC, red, green, blue);
>> figure, imshow(g),
где mask — это двоичное изображение (с теми же размерами, что и у f), в ко-
котором нули стоят на месте фона, а единицы соответствуют области, выбранной
интерактивно.
Теперь молено вычислять «средний» вектор и ковариационную матрицу точек
области ROI, но сначала необходимо получить координаты точек ROI.
» CM, N, К] = size(g);
>> I = reshape(g, M*N, 3); °/0 reshape is discussed in Sec.8.2.2.
>> idx = find (mask);
>> I = double (I (idx, 1:3);
>> [C, m] = covmatrix(I) ; °/e See Sec.11.5 for details on covmatrix.
Команда во второй строке организует цветные пикселы g в виде строк матрицы
I, а третья команда находит индексы строк, где расположены не черные пикселы.
Это будут все пикселы интересующей нас области ROI на рис. 6.27, б).
В конце предварительных вычислений необходимо установить величину по-
порога Т. Правильным решением будет присвоение Т значения, кратного стандарт-
стандартному отклонению одной из цветовых компонент. На главной диагонали матрицы
С расположены дисперсии RGB компонент, поэтому нам осталось лишь выбрать
эти элементы и извлечь из них квадратные корни:4
>> d = diag(C);
>> sd = sqrt(d) '
22.0643 24.2442 16.1806
Элементами вектора sd являются стандартные отклонения красной, зеленой и
синей компонент ROI.
Теперь приступим к сегментации изображения с использованием порогов Т,
равных кратным 25, поскольку это число приблизительно равно наибольшему
стандартному отклонению: Т = 25, 50, 75, 100. Выберем опцию 'euclidean' и
положим Т = 25. Команда
>> Е25 = colorsegOeuclidean' , f, 25, m) ;
даст результат, показанный на рис. 6.28, а) (стр. 235), а на рис. 6.28 с б) по г)
даны результаты с порогом Т = 50, 75, 100. Аналогично рис. 6.29 (стр. 236) с а)
4Функция d = diag(C) возвращает вектор d, состоящий из элементов главной диагонали мат-
матрицы С.
Выводы 253
по г) представляет результаты, полученные с опцией 'mahalanobis', при тех же
пороговых значениях.
Осмысленные результаты [зависящие от нашего выбора красноватой области
ROI на рис. 6.27, а)] получаются с опцией 'euclidean5 при Т = 25 и 50, а при
Т = 75 и 100 мы имеем явно лишние данные. С другой стороны, результаты
для опции 'mahalanobis' демонстрируют большую надежность при росте по-
порога Т. Это объясняется тем, что распределение трехмерных цветных данных в
ROI лучше отслеживается эллипсоидом, чем шаром. Заметьте, что для обоих ме-
методов при увеличении Т проявляются слабые следы красноватых тонов, которые
включаются в выделяемую область, что вполне объяснимо. ?
Выводы
Материал этой главы является введением в базовые концепции, которые исполь-
используются при обработке цветных изображений, а также описанием реализации этих
концепций средствами MATLAB, IPT и некоторыми новыми разработанными
функциями. Область цветных моделей сама по себя является очень широкой и
может служить предметом рассмотрения отдельной книги. Изученные нами мо-
модели были отобраны по причине их полезности при решении различных задач
обработки изображений, и они могут служить прочным фундаментом для даль-
дальнейшего углубленного изучения этой сферы цифровых технологий.
Методы обработки псевдоцветных и полноцветных изображений, совершае-
совершаемые на отдельных цветовых плоскостях, тесно связаны с техникой обращения
с монохромными изображениями, которая представлена в предыдущих главах.
Материал по векторной обработке отходит от подходов, изложенных в тех главах,
и обнаруживает определенные принципиальные различия между монохромными
и полноцветными изображениями и методами их обработке. В последнем пара-
параграфе этой главы рассмотрены некоторые векторные методы обработки полно-
полноцветных изображений, которые являются весьма характерными в этой области,
и к ним можно добавить медианную и другие порядковые фильтрации, адап-
адаптивную и морфологическую фильтрации, восстановление изображений, сжатие
изображений и многие другие методы обработки цветных изображений.
ГЛАВА 7
ВЕЙВЛЕТЫ
Введение
Если цифровые изображения необходимо обозревать или обрабатывать при раз-
различных увеличениях и разрешениях, то для этих целей чрезвычайно удобно
использовать дискретное вейвлетное преобразование DWT (Discrete Wawelet
Transform). Помимо того, что вейвлетное преобразование, будучи весьма эффек-
эффективным и интуитивно понятным инструментом для представления и хранения
кратномасштабных1 изображений, оно обеспечивает глубокое проникновение к
основным пространственным и частотным характеристикам изображений. Отме-
Отметим, что обычное преобразование Фурье выявляет лишь информацию о частот-
частотных характеристиках изображений.
В этой главе будут рассматриваться как вычислительные, так и пользователь-
пользовательские аспекты дискретного вейвлетного преобразования. Мы будем изучать пакет
Wavelet Toolbox, набор функций MathWork, разработанный для выполнения вей-
вейвлетного анализа, но не включенный в пакет Image Processing Toolbox (IPT) сис-
системы MATLAB. Кроме того, мы напишем ряд новых дополнительных программ,
которые позволят выполнять обработку изображений на основе вейвлетов с ис-
использованием лишь функций из пакета IPT, т. е. без привлечения пакета Wavelet
Toolbox. Эти новые функции в сочетании с функциями IPT обеспечат полный ар-
арсенал инструментов, необходимый для практической реализации всех концепций,
обсуждающихся в гл. 7 книги [Gonzalez, Woods, 2002]. Они применяются почти
так лее и с тем же диапазоном возможностей, что и функции fft2 и ifft2 для
совершения преобразования Фурье, изученные в гл. 2 настоящей книги.
7.1. Некоторые основы
Рассмотрим изображение f(x,y) размерами MxN, прямое дискретное преобра-
преобразование Т(и, v,...) которого можно выразить в общем виде следующим уравне-
уравнением:
Т(и, V,...) = ^ /(ж, y)gu,v,..Xxi 2/)>
Х,У
где х и у — это пространственные переменные, a и, v,... — переменные в преобра-
преобразованной области. Зная Т(и, г>,...), функцию /(х, у) можно построить с помощью
*В русскоязычной литературе принято переводить английский термин multiresolution (кратная
или множественная разрешимость) словом кратномасгитабностпь. Следует иметь ввиду, что
разные масштабы (разрешения) связаны между собой: они являются кратными друг друга,
причем соответствующий множитель обычно является степенью числа 2.
1.1. Некоторые основы 255
обобщенного обратного дискретного преобразования
f(x,y)= ]P T(u,v,...)hu,v,..Xx,y).
Члены gu,v,...{x, у) и hu,v,..Xxi У) в этих уравнениях называются прямым и обрат-
обратным ядрами преобразования. Ядра полностью определяют природу, вычисли-
вычислительную сложность и реальную практическую пользу этой пары преобразований.
Коэффициенты преобразования Т(и, v,...) молено представлять себе в виде коэф-
коэффициентов разложения функции / в ряд по {/iu,v,... {%, у)}- Значит, ядро обратного
преобразования определяет множество функций разложения для разложения в
ряды функций /.
Дискретное преобразование Фурье DFT, рассмотренное в гл. 4, хорошо впи-
вписывается в эту схему разложения в ряды1. В этом случае
и (Т ?Л _ п* (т 7Л _ j2n(ux/M+vy/N)
где j = \/—T, * обозначает оператор комплексного сопряжения, и = 0,1,... ,М — 1
иг> = 0,1,...,М — 1. Переменные в преобразованной области и и v представляют,
соответственно, горизонтальные и вертикальные частоты. Ядра являются разде-
разделимыми, т. е.
hu,v(x,y) = hu{x)hv(y),
где
hu(x) = * е'2™*/м и hv(y) = J
и ортогональными, т. е.
{fir,ris) = drs = < Q ^
|,иначе,
где (•, •) обозначает операцию скалярного произведения. Разделимость ядер упро-
упрощает вычисление двумерных преобразований, поскольку позволяет выполнять
соответствующие одномерные преобразования по строкам и по столбцам; орто-
ортогональность означает, что ядра прямого и обратного преобразования являются
комплексно сопряженными друг к другу (в частности, они совпадают, если яв-
являются чисто вещественными).
В отличие от преобразования Фурье, полностью определяемом парой простых
явных уравнений, и в котором все крутится вокруг описанных выше двух ядер,
термин дискретное вейвлетное преобразование обозначает целый класс преобра-
преобразований, которые различаются не только своими ядрами (а значит, и используе-
используемыми функциями разложения), но и самой природой этих функций (например,
будут ли они образовывать ортогональный или биортогональный базис), а также
тем способом, как их следует применять (например, сколько различных разреше-
разрешений требуется вычислять). Поскольку DWT включают множество родственных,
1При задании преобразования DFT в гл. 4 в уравнение для обратного преобразования Фурье
помещался множитель 1/MN. Этот член можно также поместить только в уравнение прямо-
прямого преобразования Фурье, или разделить, как это сделано здесь, между прямым и обратным
преобразованиями в виде множителя 1/%/MiV.
256 Глава 7. Вейвлеты
-шлл-
но различных преобразований, мы не мо-
можем выписать одно уравнение, которое
полностью задало бы все эти преобра-
преобразования. Вместо этого мы можем оха-
охарактеризовать каждое DWT с помощью
ядра преобразования или основываясь
на множестве параметров, которые од-
однозначно определяют пару ядер. Все эти
преобразования являются «родственны-
«родственными» в том смысле, что их функции раз-
разложения представляют собой «малень-
«маленькие волны» или «вейвлеты» (от англий-
английского слова wavelet), которые имеют пе-
переменную частоту колебаний и ограни-
ограниченную длительность (см. рис. 7.1, б)).
Далее в этой главе мы введем множе-
множество ядер этих самых «маленьких волн».
Каждое из них будет иметь следующие
общие свойства.
Свойство 1: Разделимость, масштабируемость и переносимость. Ядра можно
представить в виде трех разделимых двумерных вейвлетов
фн{х,у) = ф(х)<р(у), фУ(х,у) = (р(х)ф(у), Ф°(х,у) = 1р(х)ф(у),
где фн(х, у), фу(х,у) и фв(х,у) называются горизонтальным, вертикальным и
диагональным вейвлетами, а двумерная функция
<р(х,у) = <р(х)(р(у)
называется масштабирующей функцией. Каждая из этих двумерных функций
является произведением двух одномерных интегрируемых в квадрате масштаби-
масштабирующих вейвлетных функций
Рис. 7.1. а) Семейство функций разложе-
разложения Фурье является синусоидами с перемен-
переменной частотой и с бесконечной длительно-
длительностью, б) Функции разложения DWT пред-
представляют собой «маленькие волны» с пере-
переменной частотой и с конечной длительно-
длительностью
tpjik(x) =
х - /с),
х - к).
Параметры j и к являются целыми числами. Трансляция к определяет место-
местоположение этих одномерных функций на оси ж, масштаб j задает их ширину,
т. е. насколько они широки или узки вдоль оси я, а множитель 2J/2 контролирует
их высоту или амплитуду. Заметим, что ассоциированные функции разложения
являются масштабированными по степени числа 2 и сдвинутыми на целые интер-
интервалы функциями, которые получаются из материнского вейвлета ф(х) = фо}о(х)
и из материнской масштабирующей функции (р(х) = <ро,о(х).
Свойство 2: Кратномасштабная совместимость. Только что введенная мас-
масштабирующая функция должна удовлетворять следующему требованию кратно-
масштабного анализа:
(а) каждая функция щ^ {х) ортогональна любому своему целочисленному сдвигу.
7.2. Быстрое вейвлетное преобразование
(б) Множество функций, которые можно представить в виде рядов разложения
по (fj^(x) при малых масштабах или разрешения (т.е., когда j мало), при-
принадлежит множеству функций, представимых в более высоких масштабах.
(в) Имеется единственная функция, которую можно представить во всех мас-
масштабах, которая есть тождественный нуль.
(г) Каждую суммируемую функцию можно представить с произвольной точ-
точностью при j —> оо.
Если выполнены все эти свойства, то существует парный вейвлет гр(х), кото-
который вместе со всеми своими целочисленными сдвигами и масштабными преобра-
преобразованиями по всем степеням 2 охватывает (представляет в виде ряда) разность
между любыми двумя множествами функций, представимыми с помощью раз-
разложений по (fj^{x) соседними масштабами j и j + 1.
Свойство 3: Ортогональность. Функции разложения {(fj,k{x)} образуют орто-
ортогональный или биортогональный базис в пространстве одномерных измеримых,
суммируемых в квадрате функций. Базис обладает тем свойством, что каждая
представимая в этом базисе функция имеет единственный набор коэффициентов
разложения. Как уже отмечалось в этом параграфе, для вещественных ортого-
ортогональных ядер имеем равенство gu,v,... = hu,v,...- В биортогональном случае
—{I:
при г = s,
' r'gs' '" ' ",иначе,
и д называется двойственным ядром к h. Для биортогональных вейвлетных пре-
преобразований с масштабирующими функциями (/^(х) и вейвлетами ipj^(x) двой-
двойственные к ним функции обозначаются (f>j^(x) и ipj^{x).
72. Быстрое вейвлетное преобразование
Важным следствием из описанных выше свойств является возможность представ-
представления обеих функций <р(х) и ф(х) в виде линейной комбинации своих же копий
в масштабе с удвоенным разрешением, т. е. имеют место следующие разложения
в ряды:
x - п) >ф(х) = ^Г Нф(п)у/2фBх - п),
где h^n) и Н-ф{п) — это коэффициенты разложения, которые принято называть,
соответственно, масштабным и вейвлетным векторами. Они являются коэффи-
коэффициентами фильтрации при совершении быстрого вейвлетного преобразования
FWT (Fast Wavelet Transform). Итеративная процедура вычисления FWT по-
показана на рис. 7.2 в виде блок-схемы. На этом рисунке H^j, га, п) и {W^(j, га, п)
при г = H,V,D} являются коэффициентами DWT с масштабом j. Блоки, со-
содержащие перевернутые во времени масштабный и вейвлетный векторы h^{—n)
и h^{—га), представляют собой, соответственно, низкочастотный и высокоча-
высокочастотный фильтры декомпозиции. Блоки, содержащие 2 со стрелкой |, осуществ-
Глава 7. Вейвлеты
ляют прореживающую выборку, т. е. они выбирают каждый второй элемент по-
последовательности. Математически последовательность шагов фильтрации и про-
прореживания, используемых в этих вычислениях, можно записать в виде следую-
следующей формулы, например, для вычисления W$(j, га, п):
= кф(-т) *
-n) *
где * обозначает операцию свертки. Вычисление свертки для отрицательных
нечетных индексов эквивалентно фильтрации и прореживанию с шагом 2.
, rn, n)
, m, n)
I m, n)
, Q. m, n)
h^(-n)
2\
Столбцы
(поп)
2\
Столб
цы
\{-m)
\(-m)
Строки
(пот)
-> 1
z T
Строки
Строки
Лф(-т)
Строки
Рис. 7.2. Блок фильтров двумерного преобразования FWT. Каждый проход порождает
один масштаб DWT. При первой итерации W(p(J -f 1, т, п) = f(x,y)
Каждый проход через блок фильтров на рис. 7.2 разлагает входные дан-
данные на четыре компоненты меньшего диапазона (или масштаба). Коэффициенты
Wtp получаются двумя проходами низкочастотной фильтрации (т. е. с фильтром
h^), и поэтому они называются коэффициентами приближения; коэффициенты
{Wjjj при г = H,V,D} называются, соответственно, коэффициентами горизон-
горизонтальных, вертикальных и диагональных деталей. Поскольку само изображе-
изображение f(x,y) представлено в наивысшем разрешении, то оно становится входом
W,p{j +1, m, n) первой итерации процедуры. Обратите внимание на то, что в опе-
операциях на блок-схемы рис. 7.2 не используются ни вейвлетная, ни масштабная
функции, а только лишь ассоциированные с ними вейвлетный и масштабный век-
векторы. Кроме того, здесь имеется три переменные преобразованного пространства:
масштаб j, горизонтальная трансляция п и вертикальная трансляция т. Эти пе-
переменные соответствуют обозначениям it, г>,... в первых двух уравнениях § 7.1.
7.2.1. Преобразования FWT в пакете Wavelet Toolbox
В этом параграфе мы используем функции из пакета Wavelet Toolbox для вы-
вычисления преобразований FWT простого тестового изображения размера 4x4.
В следующем параграфе мы разработаем свою собственную функцию для вы-
выполнения этих преобразований, не прибегая к Wavelet Toolbox (используя лишь
пакет IPT). Материал этого параграфа послужит основой для написания нужной
функции.
Пакет Wavelet Toolbox строит фильтры декомпозиции для широкого клас-
класса быстрых вейв летных преобразований. Доступ к фильтрам, осуществляющим
1.2. Быстрое вейвлетное преобразование 259
специфические вейвлетные преобразования, обеспечивается функцией wf ilters,
которая имеет следующий синтаксис:
[Lo_D, Hi_D, Lo_R, Hi_R] = wfilters(wname).
Здесь входной параметр wname определяет возвращаемые коэффициенты фильт-
фильтра в соответствии с табл. 7.1; выходные данные Lo_D, Hi_D, Lo_R и Hi_R являются
вектор-строками, в которых записаны коэффициенты фильтров, осуществляю-
осуществляющих, соответственно, высокочастотную декомпозицию, низкочастотную деком-
декомпозицию, высокочастотную реконструкцию и низкочастотную реконструкцию.
(Фильтры реконструкции будут обсуждаться в § 7.4.) Соответствующие пары
фильтров можно также построить командой
[Fl, F2] = wfilters(wname, type),
где переменная type принимает значения 'd', 'r', '1' или 'п', что позволяет
получить пару фильтров декомпозиции, реконструкции, а также пару низкоча-
низкочастотных и высокочастотных фильтров соответственно. При такой форме синтак-
синтаксиса фильтр декомпозиции или низкочастотный фильтр записываются в пере-
переменную F1, а их парные фильтры помещаются в F2.
Таблица 7.1. Фильтры FWT из пакета Wavelet Toolbox и имена семейств фильтров
Wavelet
Нааг
Daubechies
Coiflets
Symlets
Discrete Meyer
Biorthogonal
wfamily
'haar'
>db'
'coif
'sym>
>dmey>
'bior'
'rbio'
wname
>haar>
'db2>, >db2
J',..., 'db45>
'coifl', Jcoif2',..., >coif5'
'sym2', 'sym3',..., 'sym45'
'dmey'
'biorl.l',
>bior2.8>,
'bior4.4',
'rbiorl.l'
'rbior2.6'
'rbior3.7>
>biorl.3', >biorl.5\
>Ь1ог3.1>, >bior3.3>,
>bior5.5', 'biore.8'
, 'rbiorl.3', 'rbiorl.
, >rbior2.8>, »rbior3.
, Jrbior3.9J, >rbior4.
>bior2.2>,
Jbior3.5',
5», »rbior2
1», 'rbior3
4J, 7rbior5
'bior2.4', 'bior2.6\
Jbior3.7J, Jbior3.9',
.2», Jrbior2.4»,
.3', >rbior3.5J,
.5», »rbior6.8J
В табл. 7.1 перечислены все FWT фильтры, имеющиеся в Wavelet Toolbox.
Свойства этих фильтров, а также другую полезную информацию относительно
их масштабирующих и вейвлетных функций можно узнать из многих книг по
цифровой фильтрации и по кратномасштабному анализу. Некоторые основные
свойства можно узнать из функций wave info и wave fun в самом пакете Wavelet
Toolbox. Чтобы получить описание семейства вейвлетов wfamily (см. табл. 7.1)
в окне команд MATLAB, следует набрать на клавиатуре
waveinfо(wfamily).
Чтобы получить численную аппроксимацию ортонормальных масштабирующих
и/или вейвлетных функций, воспользуйтесь командой
[phi, psi, xval] = wavefun(wname, iter),
260 Глава 7. Вейвлеты
которая выдаст аппроксимирующие векторы phi и psi, а также оценивающий
вектор xval. Целый положительный параметр iter контролирует точность при-
приближений, определяя число итераций, используемых при вычислениях этих век-
векторов. Для биортогональных преобразований синтаксис имеет вид
[phil, psil, phi2, psi2, xval] = wavefun(wname, iter),
где phil и psil — это функции декомпозиции, a phi2 и psi2 — функции рекон-
реконструкции.
Пример 7.1. Фильтры, масштабирующая и вейвлетная функции Хаара.
Самое известное и простое вейв летное преобразование основано на масштабиру-
масштабирующей и вейвлетной функциях Хаара. Фильтры декомпозиции и реконструкции
преобразования Хаара имеют длину 2, и их можно получить следующими командами:
>> [Lo_D, Hi_D, Lo_R, Hi_R] = wf iltersOhaar')
LoJ) =
0.7071 0.7071
Hi_D =
-0.7071 0.7071
Lo_R =
0.7071 0.7071
Hi_R =
0.7071 -0.7071
Узнать ключевые свойства и построить графики масштабирующей и вейвлет-
вейвлетной функций этого преобразования можно с помощью команд:
>> waveinfo('haar');
HAARINFO Information on Haar wavelet.
Haar Wavelet
General characteristics: Compactly supported
wavelet, the oldest and the simplest wavelet.
scaling function phi = 1 on [0 1] and 0
otherwise.
wavelet function psi = 1 on [0 0.5], = -1
on [0.5 1] and 0 otherwise.
Family Haar
Short name haar
Examples haar is the same as dbl
Orthogonal yes
Biorthogonal yes
Compact support yes
DWT possible
CWT possible
Support width 1
Filters length 2
Regularity haar is not continuous
7.2. Быстрое вейвлетное преобразование
Symmetry yes
Number of vanishing
moments for psi 1
Reference: I.Daubechies,
Ten lectures on wavelets,
CBMS, SIAM, 61, 1994, 194-202.
>> [phi, psi, xval] = wavefun( 'haar',
>> xaxis = zeros (size (xval));
>> subplotA21); plot(xval, phi, 'k',
>> axis([0 1 -1.5 1.5]); axis square;
>> title('Haar Scaling Function');
>> subplotA22); plot(xval, psi, >k',
>> axis([0 1 -1.5 1.5]); axis square;
>> titleOHaar Wavelet Function');
10);
xval, xaxis, '--k');
xval, xaxis, '--k');
На рис. 7.3 приведен результат команд в последних шести строках. Функции
title, axis и plot описаны в гл. 2 и 3. Функция subplot используется для пред-
представления окна графика в виде матрицы подграфиков, в которых можно строить
разные графики. Она имеет общий синтаксис
Н = subplot (m, n, р) или Н = subplot (mnp),
где тип — число строк и столбцов матрицы подокон. Оба числа тип должны
быть не меньше 1. Необязательный параметр Н является манипулятором под-
графика, выбираемого параметром р, который начинается с 1 (самый верхний
левый подграфик), а при увеличении на 1 обозначает следующий подграфик в
первой строке и т. д. до ее конца, потом первый подграфик во второй строке
и т.д. Таким образом, обращение subplotA22) из предыдущей последователь-
последовательности команд соответствует подграфику, расположенному в первой строке и во
втором столбце матрицы подграфиков 1x2, в котором и будет выполняться ко-
команда plot. Следующие за ней команды axisntitle будут выполняться только
в этом подокне.
Рис. 7.3. Масштабирующая
и вейвлетная функции Хаара
Масштабирующая функция Хаара Вейвлетная функция Хаара
1.5, , , 1.5
-1.5
0.5
Масштабирующая и вейвлетная функции Хаара, показанные на рис. 7.3, явля-
являются разрывными и имеют компактный носитель. Последнее свойство означает,
Глава 7. Вейвлеты
что они равны нулю вне некоторого конечного отрезка оси х, который называется
носителем. Для функций Хаара носителем служит отрезок [0,1]. Помимо всего
прочего, функция wave info сообщает, что функции разложения Хаара являют-
являются ортогональными, поэтому ядра прямого и обратного преобразования Хаара
совпадают. ?
Имея фильтры декомпозиции, образованные функцией wf ilters или получен-
полученные иным путем, пользователь может легко вычислять соответствующее вейвлет-
ное преобразование с помощью функции wavedec2 из пакета Wavelet Toolbox.
Она вызывается командой
[С, S3 = wavedec2(X, N, Lo_D, Hi_D),
где X — это изображение или матрица, N — число масштабов, которые следует
вычислить (т.е. количество проходов через блок фильтра DWT на рис. 7.2), а
Lo_D и Hi_D обозначают фильтры декомпозиции. Следующая форма обращения
к этой функции является немного более эффективной:
[С, S] = wavedec2(X, N, wname),
в которой wname обозначает название фильтра из табл. 7.1. Выходные данные
оформлены в виде структуры [С, S], состоящей из вектора-строки С (класса
doble), в который записываются коэффициенты вычисленного вейвлетного пре-
преобразования входного изображения, и из вспомогательной управляющей матри-
матрицы S (также класса doble), которая определяет организацию коэффициентов век-
вектора С. Связь между С и S станет понятной после изучения следующего примера,
а более подробная информация дается в § 7.3.
Пример 7.2. Простое преобразование DWT с помощью фильтров Хаара.
Рассмотрим одномасштабное вейвлетное преобразование Хаара:
magicD)
f =
16
5
9
4
[cl,
2
11
7
14
si]
3
10
6
15
13
8
12
1
= wavedec2(f, 1, 'haar')
cl =
Columns 1 through 9
17.0000 17.0000
-1.0000 -1.0000
Columns 10 through 16
-4.0000 -4.0000
-6.0000 -10.0000
17.0000
1.0000
17.0000
4.0000
4.0000 10.0000
1.0000
6.0000
si
2
2
4
2
2
4
7.2. Быстрое вейвлетное преобразование
Здесь магический квадрат f размерами 4x4 преобразуется в вектор вейвлет-
ной декомпозиции cl размерами 1x16 с образованием управляющей матрицы
si размерами 3x2. Вейвлетное преобразование вычисляется за одну итерацию
(с использованием входа f) с помощью операций, изложенных в § 7.2. При этом
образуется четыре выходные матрицы размерами 2x2, а именно: одно прорежен-
прореженное приближение и три направленные (горизонтальная, вертикальная и диаго-
диагональная) матрицы деталей. Точнее, с cl(l) по с 1D) записаны коэффициенты
приближения И^,A,0,0),И^,A,1,0),И^,A,0,1) и И^,A,1,1) из рис. 7.2, причем
исходный масштаб изображения f взяли равным 2; элементы с clE) no cl(8)
совпадают с коэффициентами W^(l,0,0), WgA,1,0), W^(l,0,1) и W^(l,l,l).
Например, матрица горизонтальных деталей равна
1
-1
-1,
1.
В управляющей матрице si записаны размеры вычисленных матриц, которые
столбец за столбцом помещены в вектор cl плюс размер исходного изображе-
изображения f [записанный в векторе si (end, :)]. Векторы sl(l, :) и slB, :) содер-
содержат, соответственно, размеры матрицы приближения и трех матриц деталей.
В первом элементе каждого из этих векторов записано число строк матрицы
приближения или матрицы деталей, а второй элемент — число столбцов этих
матрицы.
Чтобы построить следующий, нулевой масштаб, необходимо выполнить ко-
команду
[с2, s2] = wavedec2(f, 2, 'haar')
cl
si
Columns 1 through 9
34.0000 0
-1.0000 -1.0000
Columns 10 through 16
1
1
2
4
-4.0000 -4.0000
-6.0000 -10.0000
1
1
2
4
0
1.0000
4.0000
0
4
10
.0000
.0000
.0000
1.0000
6.0000
Заметьте, что с2E:16) = clE:16). Элементы cl(l:4), которые являются ко-
коэффициентами приближения преобразования первого масштаба, были помещены
во вход блока фильтров рис. 7.2, что породило четыре выхода размерами 1x1:
№%@,0,0), W^@,0,0), W^@,0,0) и W$@,0,0). Эти выходы были присоединены
по столбцам (они являются здесь матрицами 1x1) в том же порядке, что и при
вычислении первого масштаба, и подставлены на место коэффициентов прибли-
приближения, по которым они вычислялись. Управляющая матрица s2 была обновлена,
чтобы в ней отражался тот факт, что единственная матрица приближения 2x2
в cl была заменена четырьмя матрицами 1x1: матрицей приближения и тремя
Глава 7. Вейвлеты
матрицами деталей в с2. Итак, s2(end, :) — опять размер исходного изображе-
изображения, s2C, :) — размер трех матриц деталей масштаба 1, s2B, :) — размер
трех матриц деталей масштаба 0, a s2(l, :) — размер конечной матрицы при-
приближения. ?
В заключение этого параграфа стоит заметить, что поскольку преобразова-
преобразования DWT основаны на технике цифровой фильтрации и свертки, на выходе
преобразования могут проявиться граничные искажения. Чтобы минимизиро-
минимизировать эти артефакты, границы изображений следует обрабатывать отдельно от
остальных его частей. Если элементы фильтра выходят за пределы изображе-
изображения в процессе свертки, необходимо присваивать некоторые значения областям,
лежащим вне обрабатываемого изображения. Многие функции пакета Wavelet
Toolbox осуществляют это расширение изображений с помощью глобального па-
параметра dwtmode. Чтобы узнать текущую моду расширения, наберите команду
dwtmode (' status') или просто dwtmode после системного приглашения MATLAB
(т.е., >> dwtmode). Чтобы иметь текущую моду STATUS, выполните команду
dwtmode (STATUS). Поддерживаемые моды расширения и соответствующие зна-
значения переменной STATUS перечислены в табл. 7.2.
Таблица 7.2. Моды пакета Wavelet Toolbox для расширения изображений
STATUS Описание
'sym' Изображение расширяется симметричным отражением относительно гра-
границ. Мода по умолчанию.
'zpd* Изображение расширяется сплошными нулями.
'spd', 'spl' Изображение расширяется экстраполяцией первой производной или ли-
линейным продолжением значений двух самых дальних границ.
'spO> Изображение расширяется экстраполяцией граничных значений, т.е. их
повторением.
'ppdJ Изображение расширяется периодическим способом.
'per' Изображение расширяется периодическим способом, после того, как оно
будет (при необходимости) расширено до нечетного размера с помощью
моды >spO\
7.2.2. Преобразования FWT без использования
Wavelet Toolbox
В этом параграфе мы построим две функции wavef ilter и wavef ast, которые
смогут заменить функции wf ilter и wavedec2 из пакета Wavelet Toolbox, рас-
рассмотренные в предыдущем параграфе. Наша цель состоит также в дополнитель-
дополнительном рассмотрении алгоритма вычисления DWT, а также в разработке отдельного
пакета для обработки изображений на базе вейвлетного анализа без привлечения
пакета Wavelet Toolbox. Эта программа будет завершена в §§ 7.3 и 7.4, и полный
набор функций будет задействован в примерах § 7.5.
Прежде всего, необходимо написать функцию для построения фильтров вей-
влетной декомпозиции и реконструкции. Следующая функция, которую мы назо-
назовем wavef ilter, использует стандартную конструкцию switch вместе с операто-
операторами case и otherwise и совершает эти действия. Несмотря на то, что функция
wavef ilter строит фильтры, разобранные в гл. 7 и 8 книги [Gonzalez, Woods, 2002],
7.2. Быстрое вейвлетное преобразование
другие вейвлетные фильтры декомпозиции и реконструкции могут быть легко
добавлены (с помощью новых операторов case) к нашей функции. Описание эти
вейвлетов можно найти в разных книгах по кратномасштабному анализу.
function [varargout] = wavefilter(wname, type)
'/.WAVEFILTER Create wavelet decomposition and reconstruction filters.
7o [VARARGOUT] = WAVEFILTER(WNAME, TYPE) returns the decomposition
7, and/or reconstruction filters used in the computation of the
7e forward and inverse FWT (fast wavelet transform) .
EXAMPLES:
[Id, hd, lr, hr] = wavefilter('haar') Get the low and highpass
decomposition (Id, hd)
and reconstruction
(lr, hr) filters for
wavelet 'haar'.
[Id, hd] = wavefilter('haar','d')
[lr, hr] = wavefilter('haar','r')
Get decomposition filters
Id and hd.
Get reconstruction
filters lr and hr.
INPUTS:
WNAME
Wavelet Name
'd'
'r'
Haar
4th order Daubechies
4th order Symlets
Cohen-Daubechies-Feauveau biorthogonal
Antonini-Barlaud-Mathieu-Daubechies
Filter Type
Decomposition filters
Reconstruction filters
7. 'haar' or 'dbl'
7. 'db4'
7. 5sym4'
7. 'bior6.8'
7, 'jpeg9.7'
7.
7. TYPE
7.
7,
7,
7.
7, See also WAVEFAST and WAVEBACK.
7o Check the input and output arguments.
error(nargchk(l, 2, nargin));
if (nargin == 1 & nargout ~= 4) | (nargin == 2 & nargout ~= 2)
error('Invalid number of output arguments.');
end
if nargin == 1 & ~ischar(wname)
error('WNAME must be a string.');
end
if nargin == 2 & ~ischar(type)
error('TYPE must be a string.');
end
Глава 7. Вейвлеты
% Create filters for the requested wavelet,
switch lower(wname)
case {'haar', 'dbl'}
Id = [1 l]/sqrtB); hd = [-1 l]/sqrtB);
lr = Id; hr = -hd;
case Jdb4'
Id = [-1.0597401784997286-002 3.2883011666982956-002 ...
3.084138183598697e-002 -1.870348117188811e-001 ...
-2.798376941698385e-002 6.308807679295904e-001 ...
7.148465705525415e-001 2.303778133088552e-001] ;
t = @:7);
hd = Id; hd(end:-l:l) = cos(pi * t) .* Id;
lr = Id; lr(end:-1:1) = Id;
hr = cos(pi * t) .* Id;
case 'sym4'
Id = [-7.576571478927333e-002 -2.963552764599851e-002 ...
4.976186676320155e-001 8.037387518059161e-001 ...
2.978577956052774e-001 -9.921954357684722e-002 ...
-1.260396726203783e-002 3.222310060404270e-002];
t = @:7);
hd = Id; hd(end:-l:l) = cos(pi * t) .* Id;
lr = Id; lr(end:-l:l) = Id;
hr = cos(pi * t) .* Id;
case 'bior6.8'
Id = [0 1.908831736481291e-003 -1.914286129088767e-003 ...
-1.699063986760234e-002 1.193456527972926e-002 ...
4.973290349094079e-002 -7.726317316720414e-002 ...
-9.405920349573646e-002 4.207962846098268e-001 ...
8.259229974584023e-001 4.207962846098268e-001 ...
-9.405920349573646e-002 -7.726317316720414e-002 ...
4.973290349094079e-002 1.193456527972926e-002 ...
-1.6990639867602346-002 -1.914286129088767e-003 ...
1.9088317364812916-003];
hd = [0 0 0 1.442628250562444e-002 -1.446750489679015e-002
-7.872200106262882e-002 4.036797903033992e-002 ...
4.178491091502746e-001 -7.589077294536542e-001 ...
4.1784910915027466-001 4.0367979030339926-002 ...
-7.8722001062628826-002 -1.4467504896790156-002 ...
1.4426282505624446-002 0 0 0 0];
t = @:17);
lr = cos(pi * (t + 1)) .* hd;
hr = cos(pi * t) .* Id;
case >jpeg9.7'
Id = [0 0.02674875741080976 -0.01686411844287495 ...
-0.07822326652898785 0.2668641184428723 ...
0.6029490182363579 0.2668641184428723 ...
7.2. Быстрое вейвлетное преобразование
-0.07822326652898785 -0.01686411844287495 ...
0.02674875741080976];
hd = [0 -0.09127176311424948 0.05754352622849957 ...
0.5912717631142470 -1.115087052456994 ...
0.5912717631142470 0.05754352622849957 ...
-0.09127176311424948 0 0] ;
t = @:9);
lr = cos(pi * (t + 1)) .* hd;
hr = cos(pi * t) .* Id;
otherwise
error('Unrecognizable wavelet name (WNAME).');
end
7, Output the requested filters,
if (nargin ==1)
varargoutA:4) = {Id, hd, lr, hr};
else
switch lower(typeA))
case 'd'
varargout = {Id, hd};
case 'r'
varargout = {lr, hr};
otherwise
error('Unrecognizable filter TYPE.');
end
end
Заметим, что для каждого ортонормированного фильтра в wavefilter (т.е.
' haar', ' db4' и ' sym4') фильтр реконструкции получается из фильтра деком-
декомпозиции отражением по времени, а высокочастотный фильтр декомпозиции яв-
является модулированной версией своей низкочастотной пары. Следовательно, в
программном коде достаточно дать численные значения лишь коэффициентов
низкочастотного фильтра декомпозиции. Все остальные коэффициенты получа-
получаются из этих данных. В функции wavefilter обращение по времени осуществ-
осуществляется перенумерацией элементов векторов фильтров от последнего к первому
при выполнении команд вида lr(end:-l:l) = Id. Модулирование выполняется
умножением компонент известного фильтра на числа cos(pi*t), которые меня-
меняются в интервале от —1 до 1 при возрастании t от 0 на целые шаги. Для каждого
биортогонального фильтра в wavefilter (т.е. 'bior6.8' и 'jbeg9.7'), следует
численно задавать коэффициенты и высокочастотного, и низкочастотного филь-
фильтров, а фильтры реконструкции получаются из них модулированием. Наконец,
отметим, что все фильтры, генерируемые функцией wavefilter, имеют четную
длину. Кроме того, используется продолжение нулями, чтобы фильтры декомпо-
декомпозиции и реконструкции для каждого вейвлета имели одинаковую длину.
Имея пару фильтров декомпозиции, построенных функцией wavefilter , лег-
легко написать процедуру общего назначения для вычисления соответствующего
Глава 7. Вейвлеты
быстрого вейвлетного преобразования. Наша цель состоит в разработке эффек-
эффективного алгоритма на основе операций свертки и прореживания, изображенных
на рис. 7.2. Чтобы добиться совместимости с существующим пакетом Wavelet
Toolbox, мы воспользуемся той же структурой результата декомпозиции (т. е.
в виде [С, S], где С — это вектор декомпозиции, a S — управляющая матрица).
Следующая программа, которую мы назвали wavef ast, использует метод сим-
симметричного дополнения изображений при борьбе с граничными искажениями,
возникающими при выполнении FWT:1
function [с, s] = wavefast(x, n, varargin)
°/0WAVEFAST Perform multi-level 2-dimensional fast wavelet transform.
% [C, L] = WAVEFASKX, N, LP, HP) performs a 2D N-level FWT of
°/0 image (or matrix) X with respect to decomposition filters LP and
°/o HP.
У.
% [C, L] = WAVEFASKX, N, WNAME) performs the same operation but
°/0 fetches filters LP and HP for wavelet WNAME using WAVEFILTER.
°/,
% Scale parameter N must be less than or equal to Iog2 of the
°/0 maximum image dimension. Filters LP and HP must be even. To
% reduce border distortion, X is symmetrically extended. That is,
°/0 if X = [cl c2 c3 ... en] (in ID) , then its symmetric extension
°/0 would be [. . . c3 c2 cl cl c2 c3 ... en en cn-1 cn-2 . . .] .
°/o
У. OUTPUTS:
% Matrix С is a coefficient decomposition vector:
У.
°/0 С = [ a(n) h(n) v(n) d(n) h(n-l) ... v(l) d(l) ]
°/o
% where a, h, v, and d are columnwise vectors containing
% approximation, horizontal, vertical, and diagonal coefficient
% matrices, respectively. С has 3n + 1 sections where n is the
% number of wavelet decompositions.
°/o
% Matrix S is an (n+2) x 2 bookkeeping matrix:
°/,
У. S = [ sa(n, :); sd(n, :); sd(n-l, :); ...; sd(l, :); sx ]
7.
% where sa and sd are approximation and detail size entries.
°/o
°/0 See also WAVEBACK and WAVEFILTER.
% Check the input arguments for reasonableness.
error(nargchkC, 4, nargin));
if nargin == 3
1 Функция rem(X, Y) возвращает остаток от деления X на Y. Функция С = conv2(A, В) совер-
совершает двумерную свертку матриц А и В.
7.2. Быстрое вейвлетное преобразование
if ischar(varargin{l})
[lp, hp] = wavefilter(varargin{l}, 'd');
else
error('Missing wavelet name.');
end
else
lp = varargin{l}; hp = varargin{2};
end
fl = length(lp); sx = size(x);
if (ndims(x) ~= 2) | (min(sx) < 2) | ~isreal(x) | ~isnumeric(x)
error('X must be a real, numeric matrix.');
end
if (ndims(lp) ~= 2) | ~isreal(lp) | ~isnumeric(lp) ...
| (ndims(hp) ~= 2) | ~isreal(hp) | ~isnumeric(hp) ...
| (fl ~= length(hp)) | rem(fl, 2) ~= 0
error(['LP and HP must be even and equal length real, ' ...
'numeric filter vectors.']);
end
if ~isreal(n) | ~isnumeric(n) | (n < 1) | (n > Iog2(max(sx)))
error(['N must be a real scalar between 1 and ' ...
'log2(max(size((X))).']);
end
У, Init the starting output data structures and initial approximation,
с = [] ; s = sx; app = double(x);
Ув For each decomposition . . .
for i = l:n
У, Extend the approximation symmetrically.
[app, keep] = symextend(app, f1);
Ув Convolve rows with HP and downsample. Then convolve columns
У, with HP and LP to get the diagonal and vertical coefficients.
rows = symconv(app, hp, 'row', fl, keep);
coefs = symconv(rows, hp, 'col', fl, keep);
с = [coefs(:)' c]; s = [size(coefs); s] ;
coefs = symconv(rows, lp, 'col', fl, keep);
с = [coefs(:)' c] ;
°/e Convolve rows with LP and downsample. Then convolve columns
Ув with HP and LP to get the horizontal and next approximation
°/e coefficients.
rows = symconv(app, lp, 'row', fl, keep);
coefs = symconv(rows, hp, 'col', fl, keep);
с = [coefs( :) ' c];
app = symconv(rows, lp, 'col', fl, keep);
end
У, Append final approximation structures,
с = [app(:)' c]; s = [size(app); s] ;
•/, 1
Глава 7. Вейвлеты
function [у, keep] = symextend(x, fl)
°/o Compute the number of coefficients to keep after convolution
% and downsampling. Then extend x in both dimensions.
keep = floor((fl + size(x) - 1) / 2);
у = padarray(x, [(fl - 1) (fl - 1)], 'symmetric', 'both');
function у = symconv(x, h, type, fl, keep)
У, Convolve the rows or columns of x with h, downsample,
°/o and extract the center section since symmetrically extended.
if strcmp(type, 'row')
у = conv2(x, h);
у = y(:, l:2:end);
у = y(:, fl / 2 + l:fl / 2 + keepB));
else
у = conv2(x, h');
у = y(l:2:end, :);
у = y(fl / 2 + l:fl / 2 + keep(l), :);
end
Как видно из программного кода, в нем имеется всего один цикл for, кото-
который совершается по уровням (масштабам) декомпозиции при выполнении прямо-
прямого преобразования. При совершении каждого шага цикла текущее приближение
изображения арр, которое в начале приравнивается к х, расширяется по методу
симметричного отражения с помощью внешней функции symextend. Эта функ-
функция вызывает процедуру padarray, которая рассматривалась в § 3.4.2. Функция
padarray расширяет изображение арр по обоим измерениям зеркальным отра-
отражением через границы f 1-1 его элементов (т.е. длина фильтра декомпозиции
минус 1).
Функция symextend возвращает расширенную матрицу коэффициентов при-
приближения и число пикселов, которое необходимо извлечь из центра любого по-
последовательно свернутого и прореженного результата. Строки расширенного при-
приближения затем сворачиваются с высокочастотным фильтром декомпозиции hp
и прореживаются функцией symconv. Эта функция определяется в следующем
абзаце. Свернутый выход rows затем подается на symconv для свертки и про-
прореживания его столбцов с фильтрами hp и 1р для получения коэффициентов
диагональных и вертикальных деталей в соответствии с верхними двумя путя-
путями блок-схемы рис. 7.2. Эти результаты помещаются в вектор декомпозиции С
(от последнего элемента к первому). Далее весь процесс повторяется для вычис-
вычисления коэффициентов горизонтальных деталей и коэффициентов приближения
(нижние два пути на рис. 7.2).
Функция symconv использует функцию conv2 для выполнения основного объ-
объема вычислений при выполнении преобразования. Она совершает свертку филь-
фильтра h со строками или столбцами х (в зависимости от значения переменной type),
отбрасывает строки или столбцы с четными индексами (т. е. прореживает их с
шагом 2), а также извлекает центральные keep элементов из каждой строки или
столбца. Вызов функции conv2 с аргументами х (матрица) и вектором-строкой
7.2. Быстрое вейвлетное преобразование
фильтра h запускает вычисления строка за строкой, а использование вектора-
столбца п3 приводит к вычислению свертки по столбцам.
Пример 7.3. Сравнение времени вычислений функциями wavedec2 и wavefast.
Следующая тестовая программа использует функции tic и toe для сравнения
скорости вычислений функцией wavedec2 из пакета Wavelet Toolbox и построен-
построенной нами функцией wavefast.
function [ratio, maxdiff] = fwtcompare(f, n, wname)
e/,FWTCOMPARE Compare wavedec2 and wavefast.
% [RATIO, MAXDIFF] = FWTCOMPARE(F, N, WNAME) compares the operation
'/, of toolbox function WAVEDEC2 and custom function WAVEFAST.
e/. INPUTS:
% F Image to be transformed.
e/e N Number of scales to compute.
°/, WNAME Wavelet to use.
e/, OUTPUTS:
°/e RATIO Execution time ratio (custom/toolbox)
У. MAXDIFF Maximum coefficient difference.
У, Get transform and computation time for wavedec2.
tic;
[cl, si] = wavedec2(f, n, wname);
reftime = toe;
°/,Get transform and computation time for wavefast.
tic;
[c2, s2] = wavefast (f, n, wname);
t2 = toe;
e/e Compare the results.
ratio = t2 / (reftime + eps);
maxdiff = abs(max(cl - c2));
Для изображения 512x512 на рис. 7.4 и для пятого масштаба вейвлетного
преобразования Добеши порядка 4 функция f wt compare дает следующие резуль-
результаты:
>> f = imread ('Vase', 'tif');
>> [ratio, maxdifference] = fwtcompare(f, 5, Jdb4')
ratio =
0.5508
maxdifference =
3.2969e-012
Заметим, что функция wavefast выполнялась почти в два раза быстрее, чем
конкурирующая функция из пакета Wavelet Toolbox, выдавая при этом практи-
практически тождественный результат. ?
Глава 7. Вейвлеты
7.3. Работа со структурами вейвлетной декомпозиции
Функции вейвлетных преобразований из преды-
предыдущих параграфов порождают невоспроизводи-
невоспроизводимые на дисплее структуры данных вида {с, S},
где с — это вектор коэффициентов преобразо-
преобразования, a S — управляющая матрица, которая
определяет порядок расположения коэффици-
коэффициентов в векторе с. Чтобы обработать изображе-
изображение, мы должны уметь проверить и при необ-
необходимости изменить содержимое с. В этом па-
параграфе будет дано формальное определение
структуры {с, S}. Кроме того, мы рассмотрим
некоторые функции Wavelet Tools для обра-
обращения с этими данными, а также разработаем
ряд независимых собственных функций, кото-
Рис. 7.4. Изображение вазы разме- рые можно будет применять без использования
ром 512x512 ^ J1 *
пакета Wavelet lools. Эти функции будут по-
полезными при написании общих программ для
отображения с на экране дисплея. Схема представления данных, предложенная
в примере 7.2, интегрирует коэффициенты кратномасштабного двумерного вей-
влетного преобразования в едином одномерном векторе
с = [АлКО'НдК:)' • • • Hi(:)'Vi(:)'Di(:)' • • • V1(:)'D1(:)'],
где Адг — это матрица коэффициентов приближения iV-ro масштаба декомпо-
декомпозиции, а Н^, Vj и Dj при г = 1,2,...,7V — матрицы коэффициентов деталей по
горизонтали, вертикали и диагонали в масштабе г. Здесь, к примеру, Hj(:)' —
вектор-строка, которая формируется последовательным присоединением один за
другим транспонированных столбцов матрицы Н^. Следовательно, если
3 -2
1 6
то
3
_J и Нг(:)' =[31-26]
6
Поскольку уравнение для с предполагает N декомпозиций (или проходов через
блок фильтров на рис. 7.2), то вектор с состоит из 3iV + 1 секции: одной секции
коэффициентов приближения и N групп по три секции коэффициентов горизон-
горизонтальных, вертикальных и диагональных деталей. Заметим, что коэффициенты
наибольшего масштаба получаются при г = 1, а наименьший масштаб ассоции-
ассоциируется с г = N. Таким образом, коэффициенты в с упорядочены от наименьшего
к наибольшему масштабу.
7.3. Работа со структурами вейвлетной декомпозиции
Управляющая матрица S структуры декомпозиции представляет собой мас-
массив размерами (N + 2)х2 вида
S = [sa;v;sd7v;sdjv_i;- • sd;; • • -sdijsf],
где sa^v, sdj и sf — векторы 1x2, содержащие, соответственно, горизонтальные и
вертикальные размеры TV-го уровня матрицы аппроксимации Адг, размеры г-го
уровня матриц деталей (Н*, V* и D^ при г = 1,2,..., N) и размеры исходного
изображения F. Информация в S дает локализацию конкретных коэффициентов
приближения и деталей в векторе с. Обратите внимание на то, что использование
точки с запятой при разделении элементов матрицы S указывает на расположе-
расположение этих данных в виде вектора-столбца.
Пример 7.4. Функции из пакета Wavelet Tollbox для обращения с вектором
декомпозиции с.
В пакете Wavelet Tollbox имеется множество функций для нахождения, извле-
извлечения, форматирования и изменения коэффициентов приближения и деталей,
расположенных в векторе с, которые действуют на заданном уровне или мас-
масштабе. Мы приведем здесь эти функции для иллюстрации обсуждавшихся выше
понятий и для приготовления основы для написания альтернативных функций,
которые будут разрабатываться в следующем параграфе. Рассмотрим, к приме-
примеру, следующую последовательность команд:
>> f = magic (8) ;
>> [cl, si] = wavedec2(f, 3, 'haar');
>> size(cl)
ans =
1 64
>> si
si =
1 1
1 1
2 2
4 4
8 8
>> approx = appcoef2(cl, si, 'haar')
approx =
260.0000
>> horizdet2 = detcoef2('h', cl, si, 2)
horizdet2 =
1.0e-013 *
0 -0.2842
0 0
>> newel = wthcoef2('h', cl, si, 2);
>> newhorisdet2 = detcoef2('h', newel, si, 2)
newhorisdet2 =
0 0
0 0
Глава 7. Вейвлеты
Здесь совершается трехуровневая (трехмасштабная) декомпозиция вейвлетным
преобразованием Хаара над магическим квадратом 8x8 с помощью функции
wavedec2. Результат декомпозиции записывается в вектор cl размерами 1x64.
Поскольку si имеет размеры 5x2, то коэффициенты cl соответствуют (га - 2) =
= E — 2)=3 масштабам декомпозиции. Значит, в нем располагаются элементы,
необходимые для заполнения 3N + 1 = 3-3 + 1 = 10 подматриц приближения
и деталей. Основываясь на информации, содержащейся в si, приходим к вы-
выводу, что эти подматрицы суть: (а) одна подматрица приближения 1x1 и три
подматрицы деталей 1x1 масштаба 3 (см. sl(l, :) и siB,:)), (б) три подмат-
подматрицы деталей 2x2 масштаба 2 [см. slC,:)] и (в) три подматрицы деталей 4x4
масштаба 1 [см. si D,:)]. Пятая строка матрицы si содержит размер исходного
изображения f.
Матрица арргох = 260 извлекается из cl с помощью функции пакета appcoef 2,
которая имеет следующий синтаксис:
а = appcoef2(с, s, wname).
Здесь а — это возвращаемая матрица приближения, a wname — имя вейвлета из
табл. 7.1. К коэффициентам деталей масштаба 2 можно обратиться с помощью
функции detcoef 2, которая имеет похожий синтаксис
d = detcoef2(о, с, s, n),
где о принимает одно из значений ' h', ' v' или ' d', что соответствует деталям по
горизонтали, вертикали и диагонали, an — это нужный масштаб декомпозиции.
В этом примере возвращается 2x2 матрица horizdet2. Затем коэффициенты
в cl, соответствующие horizdet2, обнуляются с помощью функции wthcoef 2,
которая представляет собой вейвлетную срезающую функцию вида
nc = wthcoef2(type, с, s, n, t, sorh),
где type принимает одно из значений 'а' (приближение), 'h', 'v' или >d' (дета-
(детали). Вход п обозначает уровень (масштаб) декомпозиции, который будет срезать-
срезаться с помощью пороговых значений, предписанных вектором t, а переменная sorh
принимает одно из двух значений 's' или 'п', что соответствует мягкому (soft)
или жесткому (hard) решению при срезании. Если параметр t отсутствует, то все
коэффициенты, соответствующие значениям type и п, будут обнулены. Выход пс
представляет собой модифицированный (т. е. обрезанный) вектор декомпозиции.
Все три представленные функции пакета Wavelet Tollbox допускают и другие
синтаксические формы, о которых можно узнать, выполнив системный запрос
help. ?
7.3.1. Редактирование вейвлетных коэффициентов вне
пакета Wavelet Tollbox
Не имея функций Wavelet Tollbox, всю информацию о коэффициентах декомпо-
декомпозиции следует извлекать из управляющей матрицы S, которая поможет получить
доступ к конкретным коэффициентам приближения или деталей кратномасштаб-
ного вектора с. В этом параграфе мы разработаем несколько подпрограмм общего
7.3. Работа со структурами вейвлетной декомпозиции
применения для обработки вектора с с помощью информации, расположенной в
матрице S. Функция wavework является фундаментом всех этих подпрограмм,
которая является рутинной метафорой для действий при работе с современными
текстовыми процессорами типа «вырезать-скопировать-вставить».
function [varargout] = wavework(opcode, type, с, s, n, x)
'/oWAVEWORK is used to edit wavelet decomposition structures.
°/, [VARARGOUT] = WAVEWORK (OPCODE, TYPE, C, S, N, X) gets the
% coefficients specified by TYPE and N for access or modification
У, based on OPCODE.
У.
У, INPUTS:
У, OPCODE Operation to perform
I
°/o 'copy' [varargout] = Y = requested (via TYPE and N)
У, coefficient matrix
°/o 'cut' [varargout] = [NC, Y] = New decomposition vector
У, (with requested coefficient matrix zeroed) AND
°/o requested coefficient matrix
У, 'paste' [varargout] = [NC] = new decomposition vector with
Ув coefficient matrix replaced by X
У.
Уо TYPE Coefficient category
•/.
Ув 'a' Approximation coefficients
У, 'h' Horizontal details
% 'v' Vertical details
У, 'd' Diagonal details
У,
Ув [С, S] is a wavelet toolbox decomposition structure.
Ув N is a decomposition level (Ignored if TYPE = 'a').
°/0 X is a two-dimensional coefficient matrix for pasting.
У,
Ув See also WAVECUT, WAVECOPY, and WAVEPASTE.
error(nargchkD, 6, nargin));
if (ndims(c) ~= 2) | (size(c, 1) ~= 1)
error('C must be a row vector.');
end
if (ndims(s) ~= 2) | ~isreal(s) | ~isnumeric(s) | (size(s, 2) ~= 2)
error('S must be a real, numeric two-column array.');
end
elements = prod(s, 2); °/0 Coefficient matrix elements,
if (length(c) < elements(end)) | ...
~ (elements A) + 3 * sum(elementsB:end -!))>= elements (end))
error(['[C S] must form a standard wavelet decomposition ' ...
'structure.']);
end
if strcmp(lower(opcodeA:3)), 'pas') & nargin < 6
276 Глава 7. Вейвлеты
error('Not enough input arguments.');
end
if nargin < 5
n = 1; У, Default level is 1.
end
nmax = size(s, 1) - 2; % Maximum levels in [C, S] .
aflag = (lower(typeA)) == 'a');
if ~aflag & (n > nmax)
error('N exceeds the decompositions in [C, S].');
end
switch lower (type A)) p/e Make pointers into C.
case 'a'
nindex = 1;
start = 1; stop = elements(l); ntst = nmax;
case {'h', 'v', 'd'}
switch type
case 'h', offset = 0; e/e Offset to details.
case 'v', offset = 1;
case 'd', offset = 2;
end
nindex = size(s, 1) - n; e/0 Index to detail info.
start = elementsA) + 3 * sum(elementsB:nmax - n + 1)) +
offset * elements(nindex) + 1;
stop = start + elements(nindex) - 1;
ntst = n;
otherwise
error('TYPE must begin with >a>, >h>, >v>, or >d>.');
end
switch lower(opcode) % Do requested action,
case {'copy', 'cut'}
у = repmat@, s(nindex, :));
y(:) = с(start:stop); nc = c;
if strcmp(lower(opcode(l:3)), 'cut')
nc(start:stop) = 0; varargout = {nc, y};
else
varargout = {y};
end
case 'paste'
if prod(size(x)) ~= elements(end - ntst)
error('X is not sized for the requested paste.');
else
nc = c; nc (start: stop) = x(:); varargout = {nc};
end
otherwise
error('Unrecognized OPCODE.');
end
7.3. Работа со структурами вейвлетной декомпозиции
При проверке корректности своих входных аргументов функция wavework
определяет число элементов каждой подматрицы с с помощью функции elements =
= prod(s, 2). Напомним (см. § 3.4.2), что функция Y = prod(X, DIM) из сис-
системы MATLAB вычисляет произведение элементов матрицы X вдоль измерения
DIM. Затем первое предложение в команде switch начинается вычислением пары
указателей на коэффициенты, ассоциированные с входными параметрами type
и п. Для случая коэффициентов приближения (т.е. case 'а'), вычисления явля-
являются тривиальными, т. к. эти коэффициенты всегда расположены в начале век-
вектора с (т.е. начальный указатель start равен 1), а конечный индекс, указатель
stop, равен числу элементов матрицы приближений, т.е. elementsA). Если же
требуется найти коэффициенты деталей, то указатель start вычисляется сум-
суммированием числа элементов всех уровней декомпозиции до масштаба п и сло-
сложением ofiset*elements(nindex), где offset равен 0, 1 или 2, соответственно,
для коэффициентов деталей по горизонтали, вертикали и диагонали, a nindex —
указатель на строку в s, которая соответствует входному параметру п.
Второе предложение switch в функции wavework совершает операцию, за-
заданную в opcode. Для случаев 'cut' и 'сору' коэффициенты с, расположенные
между start и stop, копируются в матрицу у, которая была заранее описана
как двумерная матрица, размер которой задан в s. Это действие совершается
командой у = repmat@, s(nindex, :)), где задействована стандартная функ-
функция MATLAB «тиражирования матриц» с синтаксисом repmat(A, M, N), кото-
которая создает большую матрицу В, составленную из копий матрицы А, размещен-
размещенных в ячейках таблицы MxN. Для случая 'paste' элементы из х копируются
в вектор пс, который является копией с, на места между указателями start и
stop. Для обеих операций 'cut' и 'paste' функция возвращает новый вектор
декомпозиции пс.
Следующие три функции: wavecut, wavecopy и wavepaste используют в своих
манипуляциях с вектором с функцию wavework, но имеют более интуитивный
синтаксис.
function [пс, у] = wavecut(type, с, s, n)
VeWAVECUT Zeroes coefficients in a wavelet decomposition structure.
% ШС, Y] = WAVECUT(TYPE, C, S, N) returns a new decomposition
°/o vector whose detail or approximation coefficients (based on TYPE
°/o and N) have been zeroed. The coefficients that were zeroed are
°/o returned in Y.
°/o
°/, INPUTS:
°/, TYPE Coefficient category
•/.
°/o 'a' Approximation coefficients
°/o 'h' Horizontal details
7, 'v' Vertical details
°/o 'd' Diagonal details
°/,
°/o [C, S] is a wavelet data structure.
278 Глава 7. Вейвлеты
°/о N specifies a decomposition level (ignored if TYPE = 'a').
°/,
У. See also WAVEWORK, WAVECOPY, and WAVEPASTE.
error (nargchkO, 4, nargin));
if nargin == 4
[nc, y] = wavework('cut', type, c, s, n);
else
[nc, y] = wavework('cut', type, c, s);
end
function у = wavecopy(type, c, s, n)
VoWAVECOPY Fetches coefficients of a wavelet decomposition structure.
°/e Y = WAVECOPY (TYPE, C, S, N) returns a coefficient array based on
°/0 TYPE and N.
У.
% INPUTS:
°/o TYPE Coefficient category
•/.
°/o 'a' Approximation coefficients
°/o 'h' Horizontal details
°/o 'V Vertical details
% 'd' Diagonal details
°/o
°/o [C, S] is a wavelet data structure.
°/o N specifies a decomposition level (ignored if TYPE = 'a').
°/.
°/o See also WAVEWORK, WAVECUT, and WAVEPASTE.
error (nargchkO, 4, nargin));
if nargin == 4
у = wavework('copy', type, c, s, n);
else
у = wavework('copy', type, c, s);
end
function nc = wavepaste(type, c, s, n, x)
°/oWAVEPASTE Puts coefficients in a wavelet decomposition structure.
°/o NC = WAVEPASTE (TYPE, C, S, N, X) returns the new decomposition
% structure after pasting X into it based on TYPE and N.
У.
% INPUTS:
°/0 TYPE Coefficient category
%
°/e 'a' Approximation coefficients
У, 'h' Horizontal details
% 'V Vertical details
°/o 'd' Diagonal details
7.3. Работа со структурами вейвлетной декомпозиции
Уо [С, S] is a wavelet data structure.
°/0 N specifies a decomposition level (Ignored if TYPE = 'a').
°/0 X is a two-dimensional approximation or detail coefficient
°/o matrix whose dimensions are appropriate for decomposition
Уо level N.
°/o
Уо See also WAVEWORK, WAVECUT, and WAVECOPY.
error(nargchkE, 5, nargin))
nc = wavework('paste', type, c, s, n, x);
Пример 7.5. Манипулирование с вектором с посредством функций wavecut и
wavecopy.
Функции wavecut и wavecopy можно применять для воспроизведения результатов
примера 7.4, полученных с использованием пакета Wave Toolbox.
>> f = magic (8);
>> [cl, si] = wavedec2(f, 3, 'haar');
>> approx = wavecopy('h', cl, si, 2)
approx =
260.0000
>> horizdet2 = wavecopy('h', cl, si, 2)
horizdet2 =
1.0e-013 *
0 -0.2842
0 0
>> [newel, horizdet2] = wavecut Oh', cl, si, 2);
>> newhorisdet2 = wavecopyCh', newel, si, 2)
newhorisdet2 =
0 0
0 0
Заметьте, что все извлеченные подматрицы идентичны соответствующим под-
подматрицам, полученным в предыдущем примере. ?
7.3.2. Отображение коэффициентов декомпозиции
Как указывалось в начале § 7.3, коэффициенты, расположенные в одномерном
векторе с вейвлетной декомпозиции, на самом деле являются коэффициентами
двумерного выходного массива, который получается из блока фильтров рис. 7.2.
При каждой итерации порождается четыре массива коэффициентов четвертно-
четвертного размера от исходного (пренебрегая добавочным расширением, которое может
производиться при выполнении операции свертки). Их можно расположить в ви-
виде массива 2x2 подматриц на месте двумерного входного массива, из которого
они образованы. Функция wave2gray совершает эту подматричную композицию.
Она меняет масштаб коэффициентов для более лучшего выявления их различий
и добавляет линии для очерчивания границ подматриц приближения и деталей.
Глава 7. Вейвлеты
function w = wave2gray(c, s, scale, border)
7.WAVE2GRAY Display wavelet decomposition coefficients.
*/. W = WAVE2GRAYCC, S, SCALE, BORDER) displays and returns a
*/. wavelet coefficient image.
*/.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
7.
EXAMPLES:
wave2gray(c, s);
foo = wave2gray(c, s);
foo = wave2gray(c, s, 4);
foo = wave2gray(c, s, -4);
Display w/defaults.
Display and return.
Magnify the details.
Magnify absolute values.
foo = wave2gray(c, s, 1, 'append'); Keep border values.
INPUTS/OUTPUTS:
[C, S] is a wavelet decomposition vector and bookkeeping
matrix.
SCALE
Detail coefficient scaling
0 or 1 Maximum range (default)
2, 3... Magnify default by the scale factor
-1, -2... Magnify absolute values by abs(scale)
BORDER Border between wavelet decompositions
'absorb' Border replaces image (default)
'append' Border increases width of image
Image W: ---------------------
a(n) I h(n)
v(n) d(n)
h(n-l)
v(n-l)
d(n-l)
v(n-2)
h(n-2)
d(n-2)
Here, n denotes the decomposition step scale and a, h, v, d are
approximation, horizontal, vertical, and diagonal detail
coefficients, respectively.
7.3. Работа со структурами вейвлетной декомпозиции 281
7с Check input arguments for reasonableness.
error(nargchkB, 4, nargin));
if (ndims(c) ~= 2) | (size(c, 1) ~= 1)
error ОС must be a row vector.'); end
if (ndims(s) ~= 2) | ~isreal(s) | ~isnumeric(s) | (size(s, 2) ~= 2)
error OS must be a real, numeric two-column array.'); end
elements = prod(s, 2);
if (length(c) < elements(end)) | ...
~(elementsA) + 3 * sum(elementsB:end - 1)) >= elements(end))
error(['[C S] must be a standard wavelet ' ...
'decomposition structure.']);
end
if (nargin > 2) & (~isreal(scale) | ~isnumeric(scale))
error('SCALE must be a real, numeric scalar.');
end
if (nargin > 3) & (~ischar(border))
error('BORDER must be character string.');
end
if nargin == 2
scale = 1; % Default scale,
end
if nargin < 4
border = 'absorb'; % Default border,
end
e/. Scale coefficients and determine pad fill,
absflag = scale < 0;
scale = abs(scale);
if scale == 0
scale = 1;
end
[cd, w] = wavecut('a', c, s); w = mat2gray(w) ;
cdx = max(abs(cd(:))) / scale;
if absflag
cd = mat2gray(abs(cd), [0, cdx]); fill = 0;
else
cd = mat2gray(cd, [-cdx, cdx]); fill = 0.5;
end
7, Build gray image one decomposition at a time,
for i = size(s, 1) - 2:-l:l
ws = size(w);
h = wavecopyCh', cd, s, i) ;
pad = ws - size(h); frontporch = round (pad / 2);
h = padarray(h, frontporch, fill, 'pre');
h = padarray(h, pad - frontporch, fill, 'post');
v = wavecopy('v', cd, s, i);
pad = ws - size(v); frontporch = round(pad / 2);
v = padarray(v, frontporch, fill, 'pre');
Глава 7. Вейвлеты
v = padarray(v, pad - frontporch, fill, 'post');
d = wavecopy('d', cd, s, i);
pad = ws - size(d); frontporch = round(pad / 2);
d = padarray(d, frontporch, fill, 'pre');
d = padarray(d, pad - frontporch, fill, 'post');
°/e Add 1 pixel white border.
switch lower(border)
case 'append'
w = padarray(w, [1 1], 1, 'post');
h = padarray(h, [10], 1, 'post');
v = padarray(v, [0 1], 1, 'post');
case 'absorb'
w(:, end) = 1; w(end, :) = 1;
hCend, :) = 1; v(:, end) = 1;
otherwise
error('Unrecognized BORDER parameter.');
end
w = [w h; v d] ; °/e Concatenate coefs.
end
if nargout == 0
imshow(w) ; °/e Display result,
end
В справочном разделе функции wave2gray детализируется структура генери-
генерируемого выходного изображения w. Например, подизображение в верхнем левом
углу является матрицей приближения, которая получается при выполнении по-
последнего шага декомпозиции. Она окружена, если смотреть по часовой стрел-
стрелке, матрицами горизонтальных диагональных и вертикальных деталей, которые
строятся при этой финальной декомпозиции. Полученный 2x2 массив подматриц,
в свою очередь, окружен (по часовой стрелке) коэффициентами деталей деком-
декомпозиции предыдущего шага. Этот процесс, похожий на раскручивание спирали,
продолжается до тех пор, пока все коэффициенты одномерного вектора деком-
декомпозиции с не будут размещены в соответствующих ячейках двумерной матрицы w.
Описанная только что процедура совершается в wave2gray с помощью все-
всего одного цикла for. После проверки корректности входных данных, функция
wave cut вырезает данные коэффициентов приближения из вектора декомпози-
декомпозиции с. У этих коэффициентов меняется диапазон для дальнейшего отображения
на экране с помощью функции mat2gray. У модифицированного вектора деком-
декомпозиции cd (т. е. вектора с с обнуленной областью, относящейся к коэффициентам
приближения) диапазон также меняется. Если входной параметр scale больше
нуля, то диапазон коэффициентов деталей меняется таким образом, что величина
О отображается средним серым уровнем; все необходимые действия расширения
осуществляются со значением fill, равным 0.5. Если параметр scale меньше
нуля, то абсолютные значения коэффициентов деталей отображаются со значе-
значением 0, что соответствует черному цвету, а переменная заполнения fill устанав-
устанавливается в 0. После того, как у коэффициентов приближения и деталей изменяет-
изменяется диапазон, первая итерация цикла for извлекает из cd коэффициенты деталей
7.4- Быстрое обратное вейвлетное преобразование
последнего шага декомпозиции и добавляет их в w (после расширения, которое
совершается для подгонки размеров всех четырех подизображений, и добавления
белой каймы шириной в один пиксел) с помощью команды w = [w h; v d] . Этот
процесс повторяется для каждого масштаба в с. Обратите внимание на исполь-
использование функции wave с ору при извлечении различных блоков коэффициентов
деталей, необходимых для формирования изображения w.
Пример 7.6. Отображение на экране коэффициентов преобразования с помо-
помощью функции wave2gray.
Следующая последовательность команд вычисляет двухмасштабное DWT изоб-
изображение на рис. 7.4 с использованием вейвлета Добеши четвертого порядка и
отображает на экране дисплея полученные коэффициенты:
>> f = imread ('vase.tif);
>> [с, s] = wavefast(f, 2, Jdb4J);
>> wave2gray(c, s) ;
>> figure; wave2gray(c, s, 8);
>> figure; wave2gray(c, s, -8);
Изображения, которые получаются при выполнении последних трех командных
строк, показаны на рис. 7.5 с а) по в). Без дополнительной смены диапазона зна-
значений пикселов различия коэффициентов деталей на рис. 7.5, а) едва видны. На
рис. 7.5, б) эти различия усилены с помощью увеличения в 8 раз. Обратите вни-
внимание на добавление среднесерого цвета вдоль границ подизображений первого
уровня; это сделано для сглаживания вариаций размеров подматриц коэффици-
коэффициентов преобразования. На рис. 7.5, в) показан эффект отображения абсолютных
величин деталей. В этом случае расширение у границ делается черным цветом. ?
Рис. 7.5. Отображение двухмасштабного вейвлетного преобразования изображения на
рис. 7.4. а) Автоматический выбор диапазона, б) Дополнительное увеличение
диапазона в 8 раз. в) Взятие модуля и 8-ми кратное увеличение диапазона
7.4. Быстрое обратное вейвлетное преобразование
Как и соответствующее прямое преобразование, быстрое обратное вейвлетное
преобразование можно вычислять итеративным способом с использованием циф-
цифровых фильтров. На рис. 7.6 изображен необходимый блок фильтров синтеза
Глава 7. Вейвлеты
или реконструкции, который обращает процесс блока фильтров анализа или
декомпозиции на рис. 7.2. При каждой итерации к четырем подизображениям
приближения и деталей масштаба j применяется процедура сгущающей выборки
с шагом 2 (т.е. производится вставка нулей между элементами), а затем выпол-
выполняется свертка с двумя одномерными фильтрами: одна операция по столбцам
подизображения и одна — по строкам. После сложения результатов этих свер-
сверток получается приближение масштаба j• + 1, и весь процесс повторяется вплоть
до полной реконструкции исходного изображения. Фильтры, используемые при
свертке, являются функциями вейвлетов, применяемых при прямом преобразо-
преобразовании. Напомним, что их можно получить из функций wf ilters и wavef ilter,
описанных в § 7.2, с входным параметром type, который следует установить в 'г'
(reconstruction, реконструкция).
При работе с пакетом Wavelet Toolbox функция waverec2 используется для
вычисления обратного преобразования FWT для структуры вейвлетной деком-
декомпозиции [С, S] . Она вызывается следующим образом:
g = waverec2(C, S, wname),
где g — выходное реконструированное двумерное изображение (класса double).
Эта функция также имеет расширенный вариант синтаксиса
g = waverec2(C, S, Lo_R, Hi_R).
Следующую подпрограмму, которую мы назвали waveback, можно исполь-
использовать вместо waverec2, если пакет Wavelet Toolbox недоступен. Эта функция
завершает наш собственный пакет обработки изображений на базе вейвлетного
анализа в сочетании с функциями из IPT (и без использования Wavelet Toolbox).
ф(/ , т, п)
Рис. 7.6. Блок двумерного
обратного преобразования
DWT. Квадраты со стрел-
стрелкой вверх отвечают опера-
операциям сгущающей выборки,
jjpjj которой вставляются ну-
нули между элементами
строки
function [varargout] = waveback(c, s, varargin)
'/eWAVEBACK Performs a multi-level two-dimensional inverse FWT.
e/o [VARARGOUT] = WAVEBACK(C, S, VARARGIN) computes a 2D N-level
°/e partial or complete wavelet reconstruction of decomposition
У, structure [C, S] .
У. SYNTAX:
7o Y = WAVEBACK(C, S,
'WNAME'); Output inverse FWT matrix Y
7.4- Быстрое обратное вейвлетное преобразование 285
7, Y = WAVEBACK(C, S, LR, HR) ; using lowpass and highpass
Ус reconstruction filters (LR and
7e HR) or filters obtained by
У. calling WAVEFILTER with 'WNAME' .
7.
7. [NC, NS] = WAVEBACK(C, S, 'WNAME', N) ; Output new wavelet
7, [NC, NS] = WAVEBACK(C, S, LR, HR, N) ; decomposition structure
7. [NC, NS] after N step
7e reconstruction.
У.
У. See also WAVEFAST and WAVEFILTER.
7. Check the input and output arguments for reasonableness.
error(nargchkC, 5, nargin));
error(nargchk(l, 2, nargout));
if (ndims(c) ~= 2) | (size(c, 1) ~= 1)
errorEC must be a row vector.3);
end
if (ndims(s) ~= 2) | ~isreal(s) | ~isnumeric(s) | (size(s, 2) ~= 2)
errorOS must be a real, numeric two-column array.');
end
elements = prod(s, 2);
if (length(c) < elements(end)) | ...
~(elementsA) + 3 * sum(elementsB:end - D) >= elements(end))
error(['[C S] must be a standard wavelet ' ...
'decomposition structure.']);
end
7. Maximum levels in [C, S] .
nmax = size(s, 1) - 2;
7e Get third input parameter and init check flags,
wname = varargin{l}; filterchk = 0; nchk = 0;
switch nargin
case 3
if ischar(wname)
[lp, hp] = wavefilter(wname, 'r'); n = nmax;
else
error('Undefined filter.');
end
if nargout ~= 1
error('Wrong number of output arguments.');
end
case 4
if ischar(wname)
[lp, hp] = wavefilter(wname, 'r');
n = varargin{2}; nchk = 1;
else
lp = varargin{l}; hp = varargin{2};
286 Глава 7. Вейвлетпы
filterchk = 1; n = nmax;
if nargout ~= 1
error('Wrong number of output arguments.');
end
end
case 5
lp = varargin{l}; hp = varargin{2}; filterchk = 1;
n = varargin{3}; nchk = 1;
otherwise
error('Improper number of input arguments.');
end
fl = length(lp);
if filterchk e/0 Check filters.
if (ndims(lp) ~= 2) | ~isreal(lp) | ~isnumeric(lp) ...
| (ndims(hp) ~= 2) | ~isreal(hp) | ~isnumeric(hp) ...
| (fl ~= length (hp)) | rem(fl, 2) ~= 0
error(['LP and HP must be even and equal length real, '
'numeric filter vectors.']);
end
end
if nchk & (~isnumeric(n) | ~isreal(n)) °/, Check scale N.
error('N must be a real numeric.');
end
if (n > nmax) | (n < 1)
error('Invalid number (N) of reconstructions requested.');
end
if (n ~= nmax) & (nargout ~= 2)
error('Not enough output arguments.');
end
nc = c; ns = s; nnmax = nmax; 7, Init decomposition,
for i = l:n
°/p Compute a new approximation.
a = symconvup(wavecopy('a', nc, ns), lp, lp, fl, nsC, :)) +
symconvup(wavecopy('h', nc, ns, nnmax), ...
hp, lp, fl, nsC, :)) + ...
symconvup(wavecopy('v', nc, ns, nnmax), ...
lp, hp, fl, nsC, :)) + ...
symconvup(wavecopy('d', nc, ns, nnmax), ...
hp, hp, fl, nsC, :));
°/o Update decomposition.
nc = ncD * prod(ns(l, :)) + l:end); nc = [a(:)' nc] ;
ns = nsC:end, :); ns = [ns(l, :); ns] ;
nnmax = size(ns, 1) - 2;
end
°/e For complete reconstructions, reformat output as 2-D.
if nargout == 1
7.4- Быстрое обратное вейвлетное преобразование 287
а = пс; пс = repmat(O, ns(l, :)); nc(:) = а;
end
varargout{l> = пс;
if nargout == 2
varargout{2} = ns;
end
I %
function z = symconvup(x, fl, f2, fin, keep)
°/o Upsample rows and convolve columns with fl; upsample columns and
°/e convolve rows with f2; then extract center assuming symmetrical
°/0 extension.
у = zeros([2 1] .* size(x)); y(l:2:end, :) = x;
у = conv2(y, fl');
z = zeros([1 2] .* size(y)); z(:, 1:2:end) = y;
z = conv2(z, f2);
z = z(fln - l:fln + keep(l) - 2, fin - l:fln + keepB) - 2);
Главные действия в функции waveback совершаются в цикле for, который
выполняет требуемое число шагов итерации, зависящее от уровня (масштаба)
декомпозиции. Можно видеть, что на каждом шаге четыре раза вызывается
внутренняя функция symconvup, и полученные матрицы складываются. Вектор
декомпозиции пс, который в начале приравнивается вектору с, обновляется на
каждом шаге итерации путем замены четырех подматриц коэффициентов, обра-
обработанных функцией symconvup, на одну вновь вычисленную матрицу приближе-
приближения а. Управляющая матрица ns также параллельно изменяется, и в результате
получается структура декомпозиции [пс, ns] на единицу меньшего масштаба.
Эта последовательность действий слегка отличается от процесса, изображенного
на рис. 7.6, где верхние два входа комбинируются по правилу
[W$(j,m,n) T2m K{m) + WZ(j,m,n) fm *М™)] fn *Mn).
Здесь |2m и |2п обозначают операции сгущающей выборки с шагом 2, соответ-
соответственно, по 7П и п. Функция waveback совершает эквивалентные вычисления по
формуле
[W°(j,m,n) T2m M^)] T2n *М") + [W|(j,m,n) fm *М™)] T2n *М")-
Функция symconvup производит требуемую свертку и сгущающую выборку
для вычисления вклада одного входа на рис. 7.6 в выход W^{j + 1,га,п) в соот-
соответствии с приведенным выше выражением. Сначала входной массив х сгущает-
сгущается по строкам, в результате чего образуется массив у, который сворачивается по
столбцам с фильтром f 1, и результат записывается на место у. Затем у сгущает-
сгущается в направлении столбцов, сворачивается строка за строкой с фильтром f 2, и в
результате получается массив z. Наконец, центральные keep элементов z (окон-
(окончательная свертка) возвращаются в виде вклада входы х в новое приближение.
Глава 7. Вейвлеты
Пример 7.7. Сравнение времени вычислений waveback и waverec2.
Следующая тестовая программа сравнивает время выполнения функции waverес2
из Wavelet Toolbox и построенной нами функции waveback с помощью простой
модификации тестовой функции примера 7.3:
function [ratio, maxdiff] = ifwtcompare(f, n, wname)
'/oIFWTCOMPARE Compare waverec2 and waveback.
% [RATIO, MAXDIFF] = IFWTCOMPARE(F, N, WNAME)
7e compares the operation of toolbox function WAVEREC2
7e and custom function WAVEBACK.
У.
7, INPUTS:
7o F Image to transform and inverse transform.
7o N Number of scales to compute.
7o WNAME Wavelet to use.
У.
7. OUTPUTS:
7o RATIO Execution time ratio (custom/toolbox)
7e MAXDIFF Maximum genereted image difference.
У.
7o Compute the transform and get output and computation
7e time for wavedec2.
[cl, si] = wavedec2(f, n, wname);
tic;
gl = waverec2(cl, si, wname);
reftime = toe;
7o Compute the transform and get output and computation
7e time for waveback.
[c2, s2] = wavefast(f, n, wname);
tic;
g2 = waveback(c2, s2, wname);
t2 = toe;
7o Compare the results.
ratio = t2 / (reftime + eps);
maxdiff = abs(max(gl - g2));
Для изображения 512x512 на рис. 7.4, преобразованного до пятого масштаба вей-
влетным преобразованием Добеши порядка 4, получаем следующее:
>> f = imread ('Vase', 'tif');
>> [ratio, maxdifference] = ifwtcompare(f, 5, 'db4')
ratio =
1.0000
maxdifference =
3.6948e-013
7.5. Вейвлеты при обработке изобраэюепий
Отметим, что время работы обеих функций одинаково (частное ratio рав-
равно 1), а максимум разности выходов равен 3.6948 х10~13. Для любых практиче-
практически значимых целей обе функции выдают идентичные результаты, затрачивая
на вычисления одно и то же время. ?
7.5. Вейвлеты при обработке изображений
Подобно преобразованию Фурье (см. § 4.3.2), вейвлетные преобразования приме-
применяются при обработке цифровых изображений в следующем порядке:
1. Вычислить двумерное вейвлетное преобразование изображения.
2. Внести изменения в коэффициенты преобразования.
3. Вычислить обратное преобразование.
Поскольку масштаб в вейвлетной области аналогичен частоте области Фурье, боль-
большинство технологий, основанных на фильтрации в Фурье-переменных (см. гл. 4),
имеют похожие аналоги в «вейвлетных переменных». В этом параграфе, исполь-
используя приведенную выше трехшаговую схему, мы приведем несколько примеров
использования вейвлетов при обработке конкретных изображений. Основное вни-
внимание будет обращено на применение разработанных в этой главе процедур, при-
причем нам не потребуются ни функции из пакета Wavelet Toolbox, ни примеры из
гл. 7 книги [Gonzalez, Woods, 2002].
Пример 7.8. Вейвлетная направленность и обнаружение контуров.
Рассмотрим тестовое 500x500 изображение из рис. 7.7, а). Это изображение уже
использовалось в гл. 4 при иллюстрации процедур сглаживания и повышения
резкости на базе преобразования Фурье. Здесь мы продемонстрируем направ-
направленную чувствительность двумерных вейвлетных преобразований и их пользу в
задачах обнаружения контуров.
» f = imreadOA.tif);
>> imshow(f ) ;
>> [с, s] = wavefast(f, 1, 'sym4');
>> figure; wave2gray(c, s, -6);
>> [nc, y] = wavecutCa', c, s) ;
>> figure; wave2gray(nc, s, -6);
>> edges = abs(waveback(nc, s, Jsym4'));
>> figure; imshow(mat2gray(edges));
Горизонтальная, вертикальная и диагональная направленности одномасштаб-
ного вейвлетного преобразования рис. 7.7, а), выполненного вейвлетом 5sym4',
отчетливо видна на рис. 7.7, б). Например, заметьте, что горизонтальные кон-
контуры исходного изображения присутствуют на изображении горизонтальных де-
деталей, расположенном в верхнем правом квадранте рис. 7.7, б). Вертикальные
контуры изображения также легко идентифицировать на изображении горизон-
горизонтальных деталей, находящемся в нижнем левом квадранте. Чтобы объединить
Глава 7. Вейвлеты
эту информацию в одном общем изображении, достаточно обнулить коэффици-
коэффициенты приближения построенного преобразования, вычислить обратное преобра-
преобразование и взять абсолютное значение результата. Модифицированное преобра-
преобразование и результирующее изображение контуров показаны, соответственно, на
рис. 7.7, в) и г). Аналогичным образом можно выделить только горизонтальные
или только вертикальные контуры изображения. ?
а) б)
в)
Рис. 7.7. Вейвлеты при обнаружении контуров: а) Простое тестовое изображение; б) Его
вейвлетное преобразование; в) Модификация преобразования путем обнуления
коэффициентов приближения; (г) Контурное изображение, полученное вычис-
вычислением абсолютной величины обратного преобразования
Пример 7.9. Сглаживание и размытие изображений с помощью вейвлетов.
Вейвлеты, подобно их аналогам Фурье, являются эффективным инструментом
для сглаживания и размытия изображений. Еще раз рассмотрим тестовое изоб-
изображение на рис. 7.7, а), которое повторено на рис. 7.8, а). Его вейвлетное преоб-
преобразование четвертого масштаба с помощью Jsym4J показано на рис. 7.8, б). Для
выполнения процедуры сглаживания мы воспользуемся следующей утилитной
функцией:
function [nc, g8] = wavezero(e, s, 1, wname)
%WAVEZER0 Zeroes wavelet transform detail coefficients.
% [NC, G8] = WAVEZEROCC, S, L, WNAME) zeroes the level
% L detail coefficients in wavelet decomposition
% structure [C, S] and computes the resulting inverse
% transform with respect to WNAME wavelets.
7.5. Вейвлеты при обработке изображений
[nc, foo] = wavecut Oh', с, s, 1);
[nc, foo] = wavecut Ov', nc, s, 1);
[nc, foo] = wavecut 0d>, nc, s, 1) ;
i = wavebaek (nc, s, wname);
g8 = im2uint8(mat2gray(i));
figure; imshow (g8);
Рис. 7.8. Сглаживание изображений на базе вейвлетов: а) Тестовое изображение; б) Его
вейвлетное преобразование; в) Обратное преобразование после обнуления коэф-
коэффициентов деталей первого уровня; г)-е) Аналогичные результаты после обну-
обнуления деталей второго, третьего и четвертого уровней
Используя функцию wavezero, молено построить целую серию изображений с
нарастающим сглаживанием, выполнив следующую последовательность команд:
>> f = imreadOA.tif);
>> [с, s] = wavefast(f, 4, 'sym4');
>> wave2gray(c, s, 20);
>> [с, g8] = wavezero (с, s, 1, Jsym4J);
>> [c, g8] = wavezero(c, s, 2, 'sym4');
>> [c, g8] = wavezero(c, s, 3, Jsym4');
>> [c, g8] = wavezero(c, s, 4, Jsym4J);
Заметим, что сглаженное изображение на рис. 7.8, в) лишь слегка размыто. Оно
получено обнулением коэффициентов деталей вейвлетного преобразования пер-
первого уровня (масштаба) исходного изображения (взятием обратного преобразова-
преобразования от модифицированных данных). Уже большее размытие обнаруживается на
рис. 7.8, г), которое демонстрирует эффект обнуления коэффициентов деталей
Глава 7. Вейвлеты
первого и второго масштаба. Этот процесс продолжен на рис. 7.8, д), где допол-
дополнительно удалены коэффициенты третьего масштаба. Наконец, на рис. 7.8, е)
удалены все коэффициенты деталей. Градуированное повышение размытия от
рис. 7.8, в) до е) напоминает аналогичные результаты, полученные с помощью
преобразования Фурье. Это иллюстрирует близкую связь между масштабами
вейвлетной области и частотами в области Фурье-анализа. ?
Пример 7.10. Прогрессивная реконструкция.
Теперь рассмотрим задачу передачи и реконструкции вейвлетного четырехмас-
штабного преобразования изображения на рис. 7.9, а) в контексте получения быст-
быстрого сетевого доступа к некоторой удаленной базе изображений. Здесь мы несколь-
несколько отклонимся от нашей трехшаговой схемы, предложенной в начале этого пара-
параграфа, и рассмотрим приложение, у которого нет аналога на базе Фурье-анализа.
Пусть каждое изображение базы данных хранится в виде кратномасштабной вей-
вейвлетной декомпозиции. Такая структура хранения весьма подходит для прило-
приложений, которым нужна прогрессивная реконструкция данных, особенно если ко-
коэффициенты декомпозиции хранятся в одномерном векторе, общий формат ко-
которого был представлен в § 7.4. Для преобразования четвертого масштаба этого
примера вектор декомпозиции имеет вид
[А4(:)'Н4(:)' • • • Hi(:)/Vi(:)'Di@/ • • • ViO/DxO)'],
где А4 — это матрица коэффициентов приближения четвертого уровня деком-
декомпозиции, а Нг, Уг, и Di при г = 4,3,2,1 — матрицы коэффициентов деталей по
горизонтали, вертикали и диагонали масштаба г. Если передавать этот вектор
по сети в порядке слева направо, то удаленное устройство отображения смо-
сможет градуированно строить все более хорошие приближения конечного изобра-
изображения высокого разрешения (в зависимости от потребностей пользователя) по
мере приема данных на станции обслуживания. Например, когда будут полу-
получены коэффициенты матрицы А4, станет доступна версия изображения самого
низкого разрешения, которое можно сразу отобразить на экране [рис. 7.9, б)].
Когда поступят матрицы Н4, V4, и D4, можно будет реконструировать изобра-
изображение с большим разрешением [рис. 7.9, в)] и т.д. На рис. 7.9 с г) по е) показаны
еще три реконструкции с возрастанием разрешения. Этот процесс прогрессивной
реконструкции легко смоделировать с помощью следующей последовательности
команд MATLAB.
>> f = imread( 'Strawberries.tif'); °/e Generate transform
>> [с, s] = wavefast(f, 4, 'jpeg9.7');
>> wave2gray(c, s, 8);
>>
>> f = wavecopyCa' , c, s) ; °/e Approximation 1
>> figure; imshow(mat2gray(f)) ;
>>
>> Cc, s] = waveback(c, s, 5jpeg9.7', 1); 7» Approximation 2
>> f = wavecopyCa', c, s) ;
>> figure; imshow(mat2gray(f)) ;
7.5. Вейвлеты при обработке изобраснсений
б) в) г)
Рис. 7.9. Прогрессивная реконструкция: а) Четырехмасштабное вейвлетное преобразова-
преобразование; б) Приближение четвертого уровня из верхнего левого угла; в) Улучшенное
изображение с использованием деталей четвертого уровня; г)-е) Дальнейшее по-
повышение разрешения с использованием деталей более высоких порядков
>> [с, s] = waveback(c, s, 'jpeg9.7', 1); °/0 Approximation 3
>> f = wavecopy ('a', c, s) ;
>> figure; imshow(mat2gray(f)) ;
>> [c, s] = waveback(c, s, Jjpeg9.7', 1); °/0 Approximation 4
>> f = wavecopy('a', c, s) ;
>> figure; imshow(mat2gray(f)) ;
>> [c, s] = waveback(c, s, 5jpeg9.7', 1); °/0 Final image
>> f = wavecopy(Ja' , c, s) ;
>> figure; imshow(mat2gray(f)) ;
Глава 7. Вейвлеты
Обратите внимание на то, что финальное, четвертое приближение использует
функцию waveback для совершения реконструкции первого масштаба. ?
Выводы
В этой главе рассматриваются вейвлетные преобразования и обсуждается их ис-
использование при обработке изображений. Подобно преобразованию Фурье, вей-
вейвлетные преобразования могут применяться при решении задач широкого спек-
спектра, от обнаружения контуров и до сглаживания изображений, что рассматри-
рассматривалось в материалах данной главы. Поскольку вейвлетный анализ глубоко про-
проникает как в частотные, так и в пространственные характеристики изображе-
изображений, вейвлетные преобразования могут найти применение в таких областях, где
анализ-Фурье уже не работает, например, в приложениях, требующих прогрес-
прогрессивную реконструкцию данных (см. пример 7.10). По причине того, что стан-
стандартный пакет IPT не содержит функции, совершающие вейвлетные преобразо-
преобразования, значительная часть главы посвящена разработке набора таких функций,
которые расширяют возможности IPT на базе вейвлетного анализа изображе-
изображений. Разработанные функции полностью совместимы с возможностями пакета
Wavelet Toolbox системы MATLAB, обзор которого также делается в настоящей
главе, но который не является частью пакета IPT. В следующих главах вейвлет-
вейвлетный анализ будет использоваться в задачах сжатия изображений. К этой теме
обращено пристальное внимание авторов современных книг и учебников по об-
обработке цифровых изображений.
ГЛАВА 8
СЖАТИЕ
ИЗОБРАЖЕНИЙ
Введение
Задача сжатия изображения заключается в сокращении объема данных, необхо-
необходимого для представления цифрового изображения. Эффект сжатия может быть
достигнут путем удаления одного из трех типов избыточности:
A) кодовой избыточности, имеющей место, если используемые кодовые слова
не являются оптимальными (например, не имеют минимальную длину);
B) межпикселъной избыточности, которая возникает при наличии определен-
определенной корреляции между близкими пикселами;
C) визуальной избыточности, содержащейся в информации, которая не вос-
воспринимается органами зрения человека (т. е. детали изображения, несуще-
несущественные для глаза).
В этой главе рассматриваются все эти типы избыточности и описываются неко-
некоторые известные методы ее удаления или сокращения. Кроме того, мы изучим
два стандарта сжатия: JPEG и JPEG2000. Эти стандарты призваны унифици-
унифицировать основные концепции и подходы к сжатию изображений, излагаемые в
данной главе, путем комбинирования всех подходов, которые в итоге приводят к
сокращению всех трех типов избыточности.
Поскольку пакет IPT не содержит функции для сжатия изображений, основ-
основная цель данной главы заключается в обозначении эффективных путей исполь-
использования технологий сжатия в контексте системы MATLAB. В частности, мы раз-
разработаем вызываемые в MATLAB С-функции, которые продемонстрируют идею
представления данных на битовом уровне с помощью кодов переменной длины.
Это весьма важно, так как именно коды переменной длины лежат в основе сжа-
сжатия изображений, в то время как эффективность и быстрота матричных опера-
операций в MATLAB определяется одинаковым форматом представления числовых
данных с помощью кодов фиксированной длины. При рассмотрении этих функ-
функций мы будем предполагать, что читатель знаком с основами программирования
на языке С, а наше внимание будет сконцентрировано на обсуждении механиз-
механизмов взаимодействия системы MATLAB с внешними программами (на языке С
или Fortran). Эти приемы являются весьма важными, когда возникает необходи-
необходимость наладить взаимодействие М-функций с уже существующими программами
на С или Fortran при сохранении преимуществ высокоскоростной векторизован-
векторизованной техники MATLAB обработки матриц (например, когда цикл типа for не
поддается адекватной векторизации). Таким образом, семейство функций для
сжатия изображений, разработанное в этой главе, вместе со способностью си-
системы MATLAB обращаться к программами на С или Fortrsn, как если бы они
Глава 8. Сжатие изображений
были обычными М-функциями, показывают, что MATLAB может стать весьма
эффективным инструментарием для создания прототипов алгоритмов и систем
сжатия изображений.
8.1. Некоторые основы
Как видно из рис. 8.1, системы сжатия изображений состоят из двух различных
структурных блоков: кодера и декодера. Изображение /(х,у) подается на вход
кодера, который преобразует входные данные в определенный набор символов и
использует его для представления исходного изображения. Пусть п\ и n<i обозна-
обозначают число элементарных носителей информации (например, битов) исходного
и закодированного изображения. Тогда меру сжатия можно выразить количе-
количественно с помощью коэффициента сжатия Cr = ni/ri2. Коэффициент сжатия
10 (или 10 : 1) указывает на то, что исходное изображение имеет 10 элементов
хранения информации (т. е. битов) на каждый элемент хранения в сжатом на-
наборе данных. В MATLAB частное числа битов, используемых для хранения и
представления двух файлов изображений и/или переменных, можно вычислять
с помощью следующей М-функции:
function cr = imration(fl, f2)
°/eIMRATI0 Computes the ratio of the bytes in two images/variables.
7o CR = IMRATIO(F1, F2) returns the ratio of the number of bytes in
7e variables/files Fl and F2. If Fl and F2 are an original and
% compressed image, respectively, CR is the compression ratio.
error(nargchkB, 2, nargin)); У, Check input arguments
cr = bytes(fl) / bytes(f2); 7, Compute the ratio
I 1
function b = bytes(f)
7o Return the number of bytes in input f. If f is a string, assume
7o that it is an image filename; if not, it is an image variable,
if ischar(f)
info = dir(f); b = info.bytes;
elseif isstruct(f)
7o MATLABJs whos function reports an extra 124 bytes of memory
7o per structure field because of the way MATLAB stores
7o structures in memory. Don't count this extra memory; instead,
7o add up the memory associated with each field.
b = 0;
fields = fieldnames(f);
for k = 1:length(fields)
b = b + bytes(f.(fields{k}));
end
else
info = whos Of); b = info, bytes;
end
8.1. Некоторые основы
Рис. 8.1. Блок-схема модельной
системы сжатия изображений f(x>y)
Преобра-
Преобразователь
Кванто-
Квантователь
Кодер
символов
Кодер источника
Сжатое
изображение
Декодер
символов
Обратный
преобра-
Декодер источника
fix, у)
Например, коэффициент сжатия изображения на рис. 2.4, в) (стр. 36) при коди-
кодировании JPEG можно вычислить с помощью команды
г = imratio(imread('bubbles25.jpg'), 'bubbles25.jpg')
г =
35.1612
Заметим, что в imratio внешняя функция b = bytes (f ) написана так, чтобы
она возвращала число байтов
A) в файле,
B) в структурной переменной, и/или
C) в переменной, не являющейся структурной.
Если f не является структурной переменной, то функция whos, введенная в § 2.2,
возвращает размер этой переменной в байтах. Если f — это имя файла, то ана-
аналогичное действие выполняет функция dir. В используемой форме синтаксиса
функция dir возвращает структуру (см. сведения о структурах в § 2.10.6), ко-
которая имеет поля name, date, bytes и isdir. В этих полях записаны, соответ-
соответственно, имя файла, дата его последнего изменения, размер в байтах и инфор-
информация о том, является ли f папкой (директорией) (isdir = 1, если «да», иначе
isdir = 0). Наконец, если i является структурой, то функция bytes вызывает
рекурсивно сама себя для сложения числа байтов, используемых при хранении
каждого отдельного поля структуры. Это позволяет исключить объем служебной
информации, связанной с самой структурной переменной A24 байта хранения на
одно поле), когда возвращается только число байтов, необходимых для хранения
самих данных, записанных в полях. Функция f ieldename1 используется для по-
получения списка полей f, а операторы
for k = 1:length(fields)
b = b + bytes(f.(fields{k}));
осуществляют рекурсию. Обратите внимание на применение динамических имен
полей структур в рекурсивных вызовах функции bytes. Если S — это структура,
1 Функция names = fieldnames(s) возвращает смешанный массив, состоящий из строк, в кото-
которых записаны имена полей структуры s.
Глава 8. Сжатие изображений
a F — переменная символьной строки, содержащая имя поля, то операторы
S.(F) = foo;
field = S.(F);
употребляют синтаксис динамических имен полей структур для присвоения и/или
прочтения содержимого поля F структуры S.
Чтобы увидеть и/или использовать сжатое (т. е. закодированное) изображе-
изображение, его необходимо подать на декодер (см. рис. 8.1), который построит рекон-
реконструированное изображение f(x,y). В общем случае, изображение f(x,y) может
совпадать с исходным изображением /(ж, у) или может от него отличаться. В пер-
первом случае система называется свободной от ошибок, или системой кодирования
или сжатия без потери информации. В противном случае в реконструированном
изображении присутствуют определенные искажения и потери и система назы-
называется кодированием или сжатием с потерей информации. Ошибку (невязку)
е(х1у) между f(x,y) и f(x,y) можно вычислить для любых пикселов (я, у) по
формуле
е(х,у) = f(x,y) - f(x,y),
а величина общей ошибки между двумя изображениями равна
M-1N-1
х=0 у=0
1
\х) У) ~ J\xi У)\
Среднеквадратическое отклонение (root-mean-square) erms между f(x,y)nf(x,y)
равно квадратному корню из средней квадратичной ошибки по всей матрице
MxTV, т.е.
=
М-1 ЛГ-1
\ш Е Е (/(*.») - я*.»))
L х=0 у=0
1/2
Следующая М-функция вычисляет erms и строит (если erms ф 0) изображение
е(х,2/) и его гистограмму. Поскольку матрица е(х,у) может содержать как по-
положительные, так и отрицательные величины, вместо imhist (которая работает
только с изображения) используется функция hist для построения гистограммы.
function rmse = compare(fl, f2, scale)
VoCOMPARE Computes and displays the error between two matrices.
°/o RMSE = COMPARE(F1, F2, SCALE) returns theroot-mean-square error
°/o between inputs Fl and F2, displays a histogram of the difference,
7e and displays a scaled difference image. When SCALE is omitted, a
°/o scale factor of 1 is used.
7o Check input arguments and set defaults.
error(nargchkB, 3, nargin));
if nargin < 3
scale = 1;
end
8.2. Кодовая избыточность
°/0 Compute the root-mean-square error.
e = double(fl) - double(f2);
[m, n] = size(e);
rmse = sqrt(sum(e(:) . Л2) / (m * n));
°/o Output error image & histogram if an error (i.e., rmse ~= 0).
if rmse
°/o Form error histogram,
emax = max(abs(e(:))) ;
[h, x] = hist(e(:), emax);
if length(h) >= 1
figure; bar(x, h, >k>);
°/o Scale the error image symmetrically and display
emax = emax / scale;
e = mat2gray(e, [-emax, emax]);
figure; imshow(e);
end
end
Заметим, что кодер на рис. 8.1 отвечает за сокращение всех трех типов избы-
избыточности (кодовой, межпиксельной и визуальной) исходного изображения. На пер-
первой стадии процесса кодирования преобразователь трансформирует входное изоб-
изображение в некоторый (невизуальный) формат, приспособленный для понижения
межпиксельной избыточности. На второй стадии блок квантователь понижает
точность выхода преобразователя в соответствии с ранее оговоренным критери-
критерием точности. На этой стадии происходит сокращение визуальной избыточности,
т. е. некоторое огрубление изображения, почти незаметное, однако, для глаза. Эта
процедура является необратимой, поэтому не выполняется, если необходимо со-
совершить сжатие без потери информации. На третьей и последней стадии процесса
кодер символов строит оптимальный код (который сокращает кодовую избыточ-
избыточность) для выхода квантователя и преобразует выходную последовательность в
соответствии с построенным кодом.
Декодер на рис. 8.1 имеет только две компоненты: декодер символов и об-
обратный преобразователь. Эти блоки совершают действия, обратные действиям
блока кодера символов и блока преобразователя. Поскольку процедура кванто-
квантования не является обратимой, блок обратного квантователя отсутствует в общей
схеме декодера.
8.2. Кодовая избыточность
Пусть дискретная случайная величина г^ при к = 1,2, ...,L с вероятностями
Pr(rk) соответствует распределению уровней полутонового изображения, общее
число которых равно L. Как и в гл. 3, предполагается, что г\ соответствует ну-
нулевому уровню (напомним, что индексы массивов в MATLAB начинаются с 1, а
не с 0). Пусть также
Рг(гк) = —, к = 1,2,...,L,
п
Глава 8. Сжатие изображений
где rik равно числу появлений на изображении пикселов к-го уровня серого цве-
цвета, an — общее число пикселов изображения. Если число битов, используемых
в цифровом представлении каждой величины г к, равно 1(гк)> то среднее число
битов, необходимое для представления каждого пиксела, равно
Таким образом, средняя длина кодовых слов, назначаемых различным значениям
уровней серого цвета, находится суммированием произведений числа битов пред-
представления каждого уровня на вероятность появления этого уровня. Значит, общее
число битов для кодирования изображения размерами MxN равно MNLavg.
Таблица 8.1. Иллюстрация кодовой избыточности: Lavg = 2 для Кода 1 и Lavg — 1.81
для Кода 2
г\
Г2
гз
Рг(гк)
0.1875
0.5000
0.1250
0.1875
Код 1
00
01
10
11
h(rk)
2
2
2
2
Код 2
011
1
010
00
h(rk)
3
1
3
2
Если все уровни изображения представлены обычным га-битовым двоичным
кодом, то правая часть последнего равенства, очевидно, сводится к га битам. В са-
самом деле, /(г/с) = га для любого г к, и этот множитель выносится за знак сумми-
суммирования, а сумма всех рг(тк) равна 1, и в итоге Lavg = тп. Из табл. 8.1 следует, что
кодовая избыточность почти всегда присутствует, когда уровни градации серого
цвета кодируются обычными двоичными кодами фиксированной длины. В этой
таблице даны обе схемы кодирования пикселов четырехуровневого изображения,
распределение уровней которого дано во втором столбце. Кодирование каждого
уровня двумя битами (Код 1 в третьем столбце таблицы) дает среднюю длину
кодового слова, равную 2 битам. А средняя длина кода пиксела при кодировании
Кодом 2 (пятый столбец таблицы) равна
4
Lavg = ]Г 1(гк)рг{гк) = 3 • 0.1875 + 1 • 0.5 + 3 • 0.125 + 2 • 1.875 = 1.8125,
к=1
и достигнутый коэффициент сжатия равен Cr = 2/1.8125 ~ 1.103. Эффект сжа-
сжатия при использовании Кода 2 достигается за счет того, что кодовые слова имеют
переменную длину, и это позволяет назначать короткие коды значениям пиксе-
пикселов, чаще других появляющимся на изображении.
Тогда возникает естественный вопрос: сколько битов требуется для оптималь-
оптимального представления уровней пикселов изображения? Иными словами, какой ми-
минимальный объем данных является достаточным для полного описания изобра-
изображения без потери информации? С математической точки зрения, ответы на по-
подобные вопросы дает наука теория информации. Основная посылка этой теории
заключается в том, что информационный поток можно моделировать в виде веро-
вероятностного процесса, измерение которого хорошо согласуется с нашей интуицией.
8.2. Кодовая избыточность 301
В соответствии с этим положением можно считать, что случайная величина Е,
наблюдаемая с вероятностью Р(Е), несет
1
единиц информации. Если Р(Е) = 1 (событие всегда наступает), то 1(Е) = 0 и
здесь нет никакой информации. В самом деле, в этом случае нет неопределенно-
неопределенности в наступлении данного события, и поэтому нет необходимости сообщать или
передавать информацию о том, что событие имело место. При таком подходе,
чем реже наступает событие, тем оно «ценнее» и, следовательно, несет в себе
большую информацию. Имея источник случайных событий из дискретного се-
семейства возможных исходов {ai, 02,..., aj} и соответствующий набор вероятно-
вероятностей этих исходов {P(ai), Р(аг),. •., P(aj)}, средняя информация, приходящаяся
на один выход источника, называемая энтропией этого источника, вычисляется
по формуле
Я = -?Р(а,-) log Р(аД
э=\
Если интерпретировать изображение как выборку, порождаемую некоторым «по-
«полутоновым источником», то можно моделировать вероятности символов этого
источника с помощью гистограммы наблюдаемого полутонового изображения.
Тогда строится число, называемое оценкой первого порядка Н для энтропии ис-
источника:
Я = -
Эту оценку можно вычислять с помощью следующей М-функции в предположе-
предположении, что каждый уровень серого цвета кодируется независимо от других. В этом
случае в теории информации доказано, что энтропия задает нижнюю границу
сжатия, которую можно достигнуть путем удаления кодовой избыточности.
function h = entropy(x, n)
'/«ENTROPY Computes a first-order estimate of the entropy of a matrix.
У, H = ENTROPY(X, N) returns the first-order estimate of matrix X
7e with N symbols (N = 256 if omitted) in bits/symbol. The estimate
e/e assumes a statistically independent source characterized by the
7e relative frequency of occurrence of the elements in X.
error(nargchkd, 2, nargin)); e/0 Check input arguments
if nargin < 2
n = 256; °/0 Default for n.
end
x = double (x); °/0 Make input double
xh = hist(x(:), n) ; °/0 Compute N-bin histogram
xh = xh / sum(xh(:)); °/0 Compute probabilities
e/. Make mask to eliminate O's since Iog2@) = -inf.
Глава 8. Сжатие изображений
i = find(xh);
h = -sum(xh(i) .* Iog2(xh(i))); °/0 Compute entropy
Обратите внимание на употребление функции f ind из МATLАВ для нахождения
индексов ненулевых элементов гистограммы xh. Оператор f ind(x) эквивалентен
команде find(x ~= 0). Функция entropy использует find при построении ин-
индексного вектора i гистограммы xh, который будет использоваться в дальней-
дальнейшем для удаления всех нулевых значений из формулы для вычисления энтропии
в последней строке функции. Если не сделать этого, функция Iog2 выдаст для
h значение NaN (результатом команды 0*-inf является не число), когда вероят-
вероятность символа равна нулю.
Пример 8.1. Вычисление оценки первого порядка для энтропии.
Рассмотрим простое изображение 4x4, гистограмма которого (см. вектор р в сле-
следующем программном фрагменте) моделирует вероятности символов из табл. 8.1.
Следующая последовательность команд строит одно такое изображение и вычис-
вычисляет оценку первого порядка для его энтропии.
>> i = [119 123 168 119; 123 119 168 168];
>> f = [f; 119 119 107 119; 107 107 119 119]
f =
119 123 168 119
123 119 168 168
119 119 107 119
107 107 119 119
p = hist(f(:), 8);
p = p / sum(p)
P =
0.1875 0.5 0.125 0 0 0 0 0.1875
h = entropy(f)
h =
1.7806
Код 2 из табл. 8.1 имеет среднюю длину Lavg — 1.81, которая приближает оценку
первого порядка для энтропии, равной минимальной длине двоичного кода для
изображения i. Заметим, что уровень 107 соответствует элементу п и имеет
двоичный код 0112 в табл. 8.1, 109 — это гч с двоичным кодом I2, a 123 и 168
имеют коды ОЮ2 и ООг соответственно. ?
8.2.1. Коды Хаффмана
При кодировании уровней полутонового изображения или выхода некоторой опе-
операции полутонового отображения (разности пикселов, длин серий и т.д.) коды
Хаффмана назначают символам источника наименьшее возможное число кодо-
кодовых символов (например, битов) при условии, что символы источника (например,
пикселы) кодируются по отдельности.
Первый шаг метода Хаффмана состоит в построении серии редуцированных
источников путем упорядочивания вероятностей символов данного источника и
8.2. Кодовая избыточность
объединения символов с наименьшими вероятностями в один символ, который бу-
будет их замещать в редуцированном источнике следующего уровня. Этот процесс
проиллюстрирован на рис. 8.2, а) для распределения уровней из табл. 8.1. В двух
левых колонках исходный набор символов источника и их вероятности упорядоче-
упорядочены сверху вниз по убыванию вероятностей. Для формирования первой редукции
источника два символа с наименьшими вероятностями - в данном случае это а\
и аз с вероятностями 0.125 и 0.1875 — объединяются в один «составной символ»
с суммарной вероятностью 0.3125. Этот составной символ и связанная с ним ве-
вероятность помещаются в список первого редуцированного источника, который
также упорядочивается от наибольшей вероятности к наименьшей [см. третью
колонку рис. 8.2, а)}. Этот процесс повторяется до тех пор, пока не образуется
редуцированный источник всего с двумя символами [самая правая колонка на
рис. 8.2, а)].
а)
Исходный источник
Символ
а2
а4
<*\
<*з
Вероятность
0.5
0.1875
0.1875
0.125
Редуцированный источник
1
0.5
| - 0.3125 г
0.1875 '
1
2
0.5
-0.5
б)
Исходный источник
Редуцированный источник
Символ Вероятность
Код
1
а2
0.5
0.1875
0.1875
0.125
1
00
011 ¦
010
0.5 1
¦0.3125 01-
0.1875 00-
0.5
¦0.5
Рис. 8.2. Метод кодирования Хаффмана: а) Редуцирование источника; б) Назначение
кодовых слов
Второй шаг процедуры Хаффмана состоит в кодировании каждого редуциро-
редуцированного источника, начиная с источника с наименьшим числом символов и дви-
двигаясь к исходному источнику. Наименьший двоичный код для источника с двумя
символами состоит, конечно, из символов 0 и 1. Как показано на рис. 8.2, б), эти
символы приписываются к двум символам источника справа (порядок присвое-
присвоения не имеет значения — перестановка 0 и 1 даст абсолютно тот же результат).
Поскольку второй символ редуцированного источника с вероятностью 0.5 был
получен объединением двух символов предыдущего редуцированного источника
(расположенного слева от него), кодовый символ 0 приписывается каждому из
объединенных символов, после чего коды этих символов дополняются слева сим-
символами 0 и 1 (в произвольном порядке) для отличия их друг от друга. Затем эта
Глава 8. Сжатие изображений
операция повторяется для редуцированных источников всех уровней вплоть до
исходного источника. Окончательные коды для символов исходного источника
приведены в третьей колонке на рис. 8.2, б).
Код Хаффмана на рис. 8.2, б) (и из табл. 8.1) является мгновенно и однознач-
однозначно декодируемым блоковым кодом. Код называется блоковым, поскольку каждый
символ источника отображается в фиксированную последовательность кодовых
символов. Он является мгновенно декодируемым, так как каждое кодовое слово
в закодированной последовательности можно декодировать независимо от после-
последующих кодовых символов. Это связано с тем, что в любом коде Хаффмана каж-
каждое кодовое слово не является префиксом (началом) никакого другого кодового
слова. По этой же причине код Хаффмана является однозначно декодируемым,
так как любая последовательность, состоящая из кодовых слов кода Хаффмана,
может быть декодирована единственным способом. Таким образом, любую после-
последовательность кодированных по Хаффману символов можно декодировать, ана-
анализируя ее слева направо. Изображение размером 4x4, рассмотренное в приме-
примере 8.1, кодируется по Хаффману в порядке строк сверху вниз и по столбцам слева
направо с помощью кодов из рис. 8.2, б), в результате чего получается последо-
последовательность из 29 кодовых символов 10101011010110110000011110011. Поскольку
мы использовали мгновенно и однозначно декодируемый блоковый код, нет необ-
необходимости ставить разделительные символы между закодированными пиксела-
пикселами. Анализ этой кодовой последовательности слева направо обнаруживает, что
первым допустимым кодовым словом является 1, которое является кодом сим-
символа а>2, отвечающего уровню серого цвета 109. Следующее допустимое кодовое
слово — это 010, которое соответствует уровню 123. Продолжая этот анализ, мы
в итоге получим полностью декодированное изображение, которое эквивалентно
изображению f из рассматриваемого примера.
Построение редуцированных источников и назначение кодовых слов по опи-
описанной выше схеме реализованы в следующей М-функции, которую мы назвали
huffman:
function CODE = huffman(p)
°/eHUFFMAN Builds a variable-length Huffman code for a symbol source.
7o CODE = HUFFMAN(P) returns a Huffman code as binary strings in
% cell array CODE for input symbol probability vector P. Each word
% in CODE corresponds to a symbol whose probability is at the
7, corresponding index of P.
У.
% Based on huffman5 by Sean Danaher, University of Northumbria,
°/, Newcastle UK. Available at the MATLAB Central File Exchange:
°/e Category General DSP in Signal Processing and Communications.
7, Check the input arguments for reasonableness.
error(nargchkA, 1, nargin));
if (ndims(p) ~= 2) | (min(size(p)) > 1) | ~isreal(p) | ~isnumeric(p)
error('P must be a real numeric vector.');
end
70 Global variable surviving all recursions of function 'makecode'
8.2. Кодовая избыточность
global CODE
CODE = cell(length(p) , 1); °/0 Init the global cell array
if length (p) > 1 % When more than one symbol . . .
p = p / sum(p); % Normalize the input probabilities
s = reduce(p); °/0 Do Huffman source symbol reductions
makecode(s, []) ; °/0 Recursively generate the code
else
CODE = {'1'}; °/o Else, trivial one symbol case!
end;
•/. 1
function s = reduce(p);
°/e Create a Huffman source reduction tree in a MATLAB cell structure
°/o by performing source symbol reductions until there are only two
°/o reduced symbols remaining
s = cell(length(p), 1);
°/0 Generate a starting tree with symbol nodes 1, 2, 3, ... to
°/o reference the symbol probabilities.
for i = 1:length(p)
s{i} = i;
end
while numel(s) > 2
[p, i] = sort(p); °/0 Sort the symbol probabilities
pB) = p(l) + pB); °/0 Merge the 2 lowest probabilities
p(l) = [] ; °/o and prune the lowest one
s = s(i); °/0 Reorder tree for new probabilities
s{2} = {s{l}, s{2}}; % and merge & prune its nodes
s(l) = []; % to match the probabilities
end
0/ 0/
/o_ ________________________ /o
function makecode(sc, codeword)
°/o Scan the nodes of a Huffman source reduction tree recursively to
°/0 generate the indicated variable length code words.
У, Global variable surviving all recursive calls
global CODE
if isa(sc, 'cell') % For cell array nodes,
makecode(sc{l}, [codeword 0]); °/0 add a 0 if the 1st element
makecode(sc{2}, [codeword 1]); °/0 or a 1 if the 2nd
else % For leaf (numeric) nodes,
C0DE{sc} = char('O' + codeword); °/o create a char code string
end
Следующая последовательность команд использует кодирование Хаффмана для
построения кодов рис. 8.2:
>> р = [0.1875 0.5 0.125 0.1875];
>> с = huff man (p)
Глава 8. Сжатие изображений
с =
'011'
'I3
'010'
'00'
Отметим, что выходом служит массив, состоящий из строк переменной длины, в
котором каждый элемент представляет собой строку из нулей и единиц, что яв-
является двоичным кодом соответствующего индексированного символа из р. На-
Например, символьная строка '010' (в массиве имеет индекс 3) является кодом
уровня серого цвета с вероятностью 0.125.
В первых строках функции huff man осуществляется проверка входного ар-
аргумента р (вектора вероятностей входных кодируемых символов) на предмет его
корректности и производится инициализация глобальной переменной CODE в виде
смешанного массива MATLAB (см. § 2.10.6), который имеет length(р) строк и
один столбец. Все глобальные переменные MATLAB должны быть продеклари-
продекларированы в функциях, которые будут их использовать, с помощью команды
global X Y Z.
Эта команда делает переменные X, Y и Z доступными в тех функциях, в кото-
которых они будут продекларированы. Когда несколько функций декларируют одни
и те же глобальные переменные, они используют одну и ту же копию этих пе-
переменных. В функции huff man основная программа, а также внешняя функция
make code используют общую глобальную переменную CODE. Обратим ваше вни-
внимание на то, что общепринято писать имена глобальных переменных заглавными
буквами. Неглобальные переменные являются локальными переменными, и их
можно использовать лишь в тех функциях, где они объявлены (но не в других
функциях или в основном рабочем пространстве). Имена локальных переменных
принято писать строчными буквами.
В huff man переменная CODE инициализируется с помощью функции cell, ко-
которая имеет следующий синтаксис1:
X = celKrn, n).
При исполнении этой команды строится массив тхп матриц, к элементам кото-
которых можно обращаться как к смешанному массиву или по содержимому. Круглые
скобки «( )» используются для индексации смешанного массива; фигурные скоб-
скобки «{ }» используются для индексации содержимого. Итак, команда ХA) = []
индексирует и удаляет элемент 1 из смешанного массива, в то врем как Х{1} = []
присваивает первому элементу массива пустую матрицу. То есть, Х{1} обращает-
обращается к содержимому первого элемента (массива), а ХA) обозначает сам этот элемент
(а не его содержимое). Поскольку смешанные массивы могут находиться внут-
внутри других смешанных массивов, синтаксис типа Х{1}{2} обращается ко второму
1 Эквивалентное выражение имеет вид X - cell( [ш, п]). Другие формы вызова отображаются
командой
>> help cell
8.2. Кодовая избыточность
элементу смешанного массива, который является первым элементом смешанного
массива X.
После инициализации переменной CODE и нормирования входного вектора ве-
вероятностей [по команде р = р / sum(p)] код Хаффмана для нормированного
вектора вероятностей р строится за два шага. На первом шаге, который начинает-
начинается оператором s = reduce (p) основной программы, вызывается внешняя функ-
функция reduce, которая совершает редуцирование источника, проиллюстрированное
на рис. 8.2, а). В подпрограмме reduce элементы изначально пустого смешанного
массива s редуцированного источника, размер которого согласован с CODE, ини-
инициализируются своими индексными значениями. Т.е. s{l} = 1, s{2} = 2 и т.д.
После этого в цикле while numel(s) > 2 создается двоичное дерево редуциро-
редуцированных источников, эквивалентное смешанному массиву. На каждом шаге цикла
вектор р упорядочивается в восходящем порядке вероятностей. Это совершается
функцией sort, имеющей синтаксис
[y,i] =sort(x),
где в выход у записывается вектор упорядоченных элементов вектора х, а ин-
индексный вектор i удовлетворяет соотношению у = x(i). После упорядочения
вектора р две наименьшие вероятности сливаются путем помещения их суммы
в рB), а элемент рA) выбрасывается. После этого смешанный массив реду-
редуцированного источника переупорядочивается, чтобы соответствовать р на базе
индексного вектора i с помощью операции s = s(i). Наконец, s{2} заменяется
смешанным массивом из двух элементов, в котором записаны индексы слившихся
вероятностей по формуле s{2} = {s{l}, s{2}} (пример индексирования по со-
содержимому), а индексирование по массиву используется для удаления первого из
двух слившихся элементов s(l) по правилу s(l) = [ ]. Процесс продолжается
до тех пор, пока в s не останется только два элемента.
а)
Корень 1
Второе
редуцирование
источника
Первое
редуцирование
источника
Источник
символов
0.1875 0.3125
в)
S{1}{1} = 4
5{1}{2}{1} = 3
s{l}{2}{2} = 1
s{2} = 2
Рис. 8.3. Редуцирование источника на рис. 8.2, а) с помощью функции huff man: а) Экви-
Эквивалентное двоичное дерево; б) Изображение, построенное cellplot(s); в) Выход
команды celldisp(s)
На рис. 8.3 показан результат процесса обработки вероятностей символов из
табл. 8.1 и рис. 8.2, а). Рис. 8.3, б) и в) были получены при подстановке пары
Глава 8. Сжатие изображений
команд
celldisp(s);
cellplot(s);
между двумя последними исполняемыми строками основной программы huff man.
Функция MATLAB celldisp рекурсивно печатает содержимое смешанного мас-
массива, а графическая функция cellplot представляет смешанный массив в виде
семейства вложенных прямоугольных блоков. Обратите внимание на взаимно од-
однозначное соответствие между элементами смешанного массива на рис. 8.3, б) и
узлами дерева редуцированного источника. На рис. 8.3, а):
A) каждая пара разветвляющихся ветвей дерева (которая обозначает редуци-
редуцирование источника) соответствует двухэлементному смешанному массиву в s;
B) каждый двухэлементный смешанный массив содержит индексы символов,
которые были слиты в один символ в процессе редуцирования.
Например, объединение символов аз и ai в основании дерева порождает двух-
двухэлементный смешанный массив s{l}{2}, где s{1}{2}{1} = 3 и s{l}{2}{2} = 1
(индексы as и а\ соответственно). Корень дерева, расположенный сверху, обра-
образует двухэлементный смешанный массив s самого верхнего уровня.
Последний шаг процесса построения кода (т. е. присвоение кодовых слов на основе
редуцированного источника) осуществляется вызовом функции make с ode (s, [ ]).
Это обращение инициирует рекурсивную процедуру присвоения кода, основан-
основанную на схеме рис. 8.2, б). Хотя рекурсивное задание не обеспечивает сохранение
в памяти (поскольку стек обработанных величин должен где-то храниться) или
увеличения скорости, оно имеет то преимущество, что код получается более ком-
компактным и его легче понять, особенно при работе с такой рекурсивно заданной
структурой данных, как дерево. Любую функцию MATLAB можно использовать
рекурсивно, т. е. она может вызывать сама себя явно или неявно. При использо-
использовании рекурсии каждый вызов функции порождает новое множество локальных
переменных, которое не зависит от всех предыдущих подобных множеств.
Внешняя функция make code принимает два входные параметра: codeword,
массив из нулей и единиц, и sc, элемент смешанного массива редуцированно-
редуцированного источника. Когда sc сам является смешанным массивом, он состоит из двух
символов источника (или составных символов), которые были объединены в про-
процессе редуцирования. Поскольку их необходимо кодировать раздельно, делается
два рекурсивных обращения (к функции make с ode) наряду с двумя подходя-
подходящим образом обновленными кодовыми словами @ и 1 добавляются к входному
codeword). Когда sc не содержит смешанный массив, он является индексом сим-
символа изначального источника и ему присваивается двоичная кодовая последова-
последовательность, построенная по codeword с помощью операции
C0DE{sc} = char('0J + codeword).
Как отмечалось в § 2.10.5, функция MATLAB char преобразует массив, содержа-
содержащий положительные целые числа, представляющие коды символов в символьный
массив MATLAB (первые 127 кодов представляют собой стандартные ASCII коды
8.2. Кодовая избыточность
символов). Значит, к примеру, char ('О' +[0 1 0] ) породит символьную строку
'010', поскольку добавление 0 к ASCII коду нуля даст ASCII '0J, а прибавле-
прибавление 1 к ASCII '0' даст ASCII код 1, а именно '1'.
Таблица 8.2. Процесс назначения кодов для смешанного массива редуцированного источ-
источника на рис. 8.3
Вызов
1
2
3
4
5
6
7
Источник
main routine
makecode
makeсode
makeсode
makecode
makeсode
makecode
{1x2
[2]
[4]
4
[3]
3
1
2
sc
cell}
{1x2 cell}
[1]
Кодовое слово
[ ]
0
0 0
0 1
0 10
0 11
1
Табл. 8.2 детализирует последовательность вызовов makecode, которые про-
производятся в соответствии со смешанным массивом редуцированного источника
на рис. 8.3. Чтобы закодировать 4 символа изначального источника, потребова-
потребовалось 7 вызовов этой функции. Первый вызов (строка 1 в табл. 8.2) совершается из
основной программы huff man. Он запускает процесс кодирования с присвоением
входам codeword и sc, соответственно, пустой матрицы и смешанного массива s.
В соответствии со стандартным обозначением MATLAB, {1x2 cell} обозначает
смешанный массив из одной строки и двух столбцов. Поскольку sc почти все-
всегда является смешанным массивом при первом вызове (исключение составляет
источник, состоящий из одного элемента), совершаются два рекурсивных вызова
(см. строки 2 и 7). Первый из этих вызовов инициирует еще два вызова (строки 3
и 4), а второй инициирует два дополнительных вызова (строки 5 и 6). Во всех слу-
случаях, когда sc не является смешанным массивом, как это имеет место в строках
3, 5, 6 и 7 таблицы, дополнительные рекурсии не нужны; кодовая последователь-
последовательность строится по codeword и назначается символу источника, чей индекс был
передан как sc.
8.2.2. Кодирование Хаффмана
Построение кодов Хаффмана само по себе не является сжатием. Чтобы получить
эффект сжатия, заложенный в эти коды, символы соответствующего источника,
независимо от их природы (уровни серых тонов, длины серий или выходы иных
операций отображения уровней), необходимо преобразовать или трансформиро-
трансформировать (т. е. закодировать) в соответствии с построенным кодом.
Пример 8.2. Отображение кодов переменной длины в MATLAB.
Рассмотрим простое 16-ти байтовое изображение размерами 4x4:
>>f2 = uint8([2 3 4 2; 3 2 4 4;
f2 =
2 3 4 2
3 2 4 4
2212; 112 2])
Глава 8. Сжатие изображений
2 2
1 1
whosC
Name
f2
1
2
f2')
Size
4x4
2
2
Bytes
16
Class
uint8 array
Grand total is 16 elements using 16 bytes
Каждый пиксел в f 2 является байтом, состоящим из 8 битов. Для представ-
представления всего изображения используется 16 байтов. Поскольку уровни серых тонов
в 12 не являются равновероятными, коды переменной длины (как отмечалось в
предыдущем параграфе) позволят сократить объем памяти, которая потребуется
для хранения этого изображения. Функция huff man строит один из таких кодов:
>>с = huffman(hist(double(f2(:)) , 4))
с =
'011'
'1'
'010'
'00'
Поскольку коды Хаффмана основаны на относительных частотах появления сим-
символов источника (но не на самих символах), которые требуется закодировать, код
с идентичен коду, построенному для изображения из примера 8.1. На самом деле,
изображение f 2 можно получить из f (пример 8.1) путем отображения уровней
107, 119, 123 и 168 в числа 1, 2, 3 и 4. Оба изображения имеют одинаковый вектор
частот р = [0.1875 0.5 0.125 0.1875].
Простейший путь кодирования f 2 с помощью кода с заключается в соверше-
совершении следующих операций:
»hlf2 =
hlf2 =
Columns 1 through 9
'1' '010' '1' '011' '010' '1' '1' '011' '00'
Columns 10 through 16
'00' '011' '1' '1' '00' '1' '1'
>> whos('hlf2')
Name Size Bytes Class
hlf2 1x16 1530 cell array
Grand total is 45 elements using 1530 bytes
Здесь изображение f 2 (двумерный массив класса UINT8) преобразован в сме-
смешанный массив hlf2 размерами 1x16 (операция транспонирования применена
для экономии бумаги). Элементами hlf 2 являются символьные строки перемен-
переменной длины, а соответствующие пикселы f 2 расположены в порядке считывания
сверху вниз и слева направо (т.е. по столбцам). Как видно из этой распечатки,
закодированное изображение занимает 1530 байт, т.е. памяти требуется почти в
100 раз больше, чем при хранении самого изображения f 2!
8.2. Кодовая избыточность
Использование смешанного массива hlf 2 вполне логично, поскольку это один
из двух стандартных типов данных в MATLAB (см. § 2.10.6) для представле-
представления разнородных данных. В случае с hlf 2 эта разнородность означает различие
длин символьных строк, и платой за удобство обращения с ними посредством
смешанного массива служит существенное увеличение требуемой памяти (при-
(присущее смешанным массивам), которое требуется для отслеживания положения
элементов переменной длины. Этот излишний расход памяти можно устранить
путем преобразования hlf 2 в обычный двумерный символьный массив:
>>h2f2 = char (hlf 2)'
h2f2 =
1010011000011011
1 11 1001 0
0 10 1 1
>> whos(Jh2f2')
Name Size Bytes Class
h2f2 3x16 96 char array
Grand total is 48 elements using 96 bytes.
Здесь смешанный массив hlf 2 преобразован в символьный массив h2f 2 размера-
размерами 3x16. Каждый столбец h2f 2 соответствует пикселу в f 2 в порядке сканирова-
сканирования сверху вниз и слева направо (т. е. по столбцам). Отметим, что в массиве h2f 2
вставлены символы пробелов для правильного соответствия битов по столбцам.
Поскольку два байта требуется для каждого символа '0' или ' 1' кодовых слов,
для хранения h2f 2 требуется 96 байт — все еще в 6 раз больше, чем исходные
16 байт, необходимые для хранения f 2. Мы можем избавиться от вставки пустых
символов с помощью операций
>>h2f2 = h2f2(:);
>> h2f2(h2f2 =='') = [];
>> whos('h2f2')
Name Size Bytes Class
h2f2 29x1 58 char array
Grand total is 29 elements using 58 bytes
Но требуемый объем памяти по-прежнему превосходит 16 байт для хранения f 2.
Чтобы по-настоящему сжать f 2, код с должен проявиться на битовом уровне,
когда несколько закодированных пикселов пакуются в один байт:
>>h3f2 =
h3f2 =
size:
min:
hist:
code:
>> whos(
Name
h3f2
mat2huff(f2)
[4 4]
32769
[3 8 2
[43867
>h3f2>)
Size
lxl
3]
1944]
Bytes
518
Class
struct array
Grand total is 13 elements using 518 bytes
Глава 8. Сжатие изображений
Несмотря на то, что функция mat2huf f возвращает структуру h3f 2, которой тре-
требуется для хранения 518 байт памяти, большая ее часть связана со служебной
информацией о структурной переменной (напомним,что в § 8.1 при обсуждении
функции imratio сообщалось, что MATLAB использует 124 дополнительные бай-
байта на одно поле структуры), а также с тем, что mat2huf f генерирует некоторую
информацию, облегчающую будущее декодирование. Пренебрегая этими излиш-
излишками памяти, которые пренебрежимо малы при работе с практически значимыми
изображениями (нормальных размеров), mat2huf f сжимает f 2 с коэффициентом
4 : 1, а именно: 16 пикселов по 8 бит в f 2 сжимаются до двух 16-ти битовых
слов — элементов поля code в h3f 2:
>>hcode = h3f2.code;
>>whos('hcode')
Name Size Bytes Class
hcode 1x2 4 uintl6 array
Grand total is 2 elements using 4 bytes
>>dec2bin (double (hcode))
ans =
1010101101011011
0000011110011000
Отметим, что функция dec2bin2 была использована для отображения индивиду-
индивидуальных битов в h3f2.code. Пренебрегая завершающими тремя битами, которые
дополняют данные до объема, кратного 16, (т. е. нули в конце), молено сказать, что
это кодирование 32-мя битами эквивалентно кодированию 29 битами мгновенно
и однозначно декодируемым блоковым кодом 10101011010110110000011110011. ?
Как было отмечено в предыдущем примере, функция mat2huf f помещает ин-
информацию, необходимую для декодирования закодированного входного массива
(т. е. его исходные размеры и значения вероятностей символов), в одну структур-
структурную переменную MATLAB. Сведения об этой переменной задокументированы в
справочной секции самой функции mat2huf f .3
function у = mat2huff(x)
e/PMAT2HUFF Huffman encodes a matrix.
e/e Y = MAT2HUFF(X) Huffman encodes matrix X using symbol
e/e probabilities in unit-width histogram bins between X's minimum
У, and maximum values. The encoded data is returned as a structure
°/o Y:
У» Y.code The Huffman-encoded values of X, stored in
e/o a uintl6 vector. The other fields of Y contain
e/e additional decoding information, including:
7, Y.min The minimum value of X plus 32768
2Функция dec2bin преобразует десятичное целое число в двоичную строку. Для получения
большей информации наберите команду
>> help dec2bin.
3 Функция hist с аналогична функции hist. Для дополнительной информации выполните
>> help histc
8.2. Кодовая избыточность
7. Y.size The size of X
У, Y.hist The histogram of X
°/.
°/o If X is logical, uint8, uintl6, uint32, int8, intl6, or double,
У, with integer values, it can be input directly to MAT2HUFF. The
У, minimum value of X must be representable as an intl6.
%
7, If X is double with non-integer values- - -for example, an image
°/, with values between 0 and 1--first scale X to an appropriate
7o integer range before the call. For example, use Y =
У. MAT2HUFFB55*X) for 256 gray level encoding.
7,
У, NOTE: The number of Huffman code words is round (max (X(:))) -
7e round(min(X(:))) + 1. You may need to scale input X to generate
7e codes of reasonable length. The maximum row or column dimension
7, of X is 65535.
7,
7. See also HUFF2MAT.
if ndims(x) ~= 2 | ~isreal(x) | (~isnumeric(x) & ~islogical(x))
error('X must be a 2-D real numeric or logical matrix.');
end
7o Store the size of input x.
y.size = uint32(size(x));
7o Find the range of x values and store its minimum value biased
7, by +32768 as a UINT16.
x = round(double(x));
xmin = min(x(:));
xmax = max(x(:));
pmin = double(int16(xmin));
pmin = uintl6(pmin + 32768); y.min = pmin;
7o Compute the input histogram between xmin and xmax with unit
7o width bins, scale to UINT16, and store,
x = x(:)';
h = histc(x, xmin:xmax);
if max(h) > 65535
h = 65535 * h / max(h);
end
h = uintl6(h); y.hist = h;
7e Code the input matrix and store the result.
map = huf f man (double (h)) ; 7o Make Huffman code map
hx = map(x(:) - xmin +1); 7o Map image
hx = char(hx)'; °/0 Convert to char array
hx = hx(:)>;
hx(hx =='') = []; 7, Remove blanks
ysize = ceil(length(hx) / 16); У, Compute encoded size
hxl6 = repmatCO', 1, ysize * 16); 7o Pre-allocate modulo-16 vector
Глава 8. Сжатие изображений
hxl6(l:length(hx)) = hx; °/e Make hx modulo-16 in length
hxl6 = reshape(hxl6, 16, ysize); °/0 Reshape to 16-character words
hxl6 = hxl6' - '0'; °/o Convert binary string to decimal
twos = pow2A5:-l:0);
y.code = uintl6(sum(hxl6 .* twos(ones(ysize, 1), :), 2))';
Обратите внимание на то, что команда у = mat2huf f (x) кодирует по Хаффману
матрицу х с помощью гистограммных корзин единичной длины, размещенных на
интервале от минимального до максимального значения матрицы х. При даль-
дальнейшем декодировании данных, закодированных в y.code, нужный код Хафф-
мана должен быть воссоздан по y.min, минимальному значению х, и по у.hist,
гистограмме х. Вместо того, чтобы хранить таблицу кода Хаффмана, функция
mat2huf f сохраняет информацию о вероятностях символов, достаточную для вос-
восстановления этого кода. Имея эти данные, а также исходный размер матрицы х,
который записан в поле у.size, функция huff2mat, рассматриваемая в следую-
следующем параграфе этой главы, сможет декодировать у. code и восстановить х.
Шаги при построении y.code можно резюмировать следующим образом:
1. Вычислить гистограмму h входа х между минимальным и максимальным
значениями х с помощью корзин единичной длины и нормировать ее так,
чтобы ее значения помещались в вектор UINT16.
2. Использовать функцию huff man для построения кода Хаффмана, который
называется тар, на основе гистограммы h.
3. Преобразовать х с помощью тар (при этом образуется смешанный массив) и
конвертировать результат в символьный массив hx, удаляя пустые символы,
которые были вставлены на манер примера 8.2 при обработке матрицы h2f 2.
4. Сконструировать вариант вектора hx, в котором символы организованы в
виде сегментов из 16-ти символов. Это делается разбиением hx на отрезки
по 16 символов (hxl6 в программе) и приданием им формы матрицы из 16
строк и ysize столбцов, где ysize = ceil(length(hx) / 16). Напомним,
что функция ceil (см. §4.2) округляет число в сторону положительной бес-
бесконечности. Обобщенная функция MATLAB
у = reshape(x, m, п)
возвращает матрицу размерами m на п, элементы которой взяты по столб-
столбцам матрицы х, и делает сообщение об ошибке, если в х нет m*n элементов.
5. Конвертировать элементы по 16 символов из hxl6 в 16-ти битовые числа
(т. е. в формате uintl6). Три завершающие операции выполняют действия,
эквивалентные одной компактной команде у = uintl6(bin2dec(hxl6')).
Они являются ядром функции bin2dec, которая возвращает десятичный эк-
эквивалент двоичной строки (например, bin2dec (' 101') дает результат 5), но
выполняется существенно быстрее. Функция MATLAB pow2(y) применяет-
применяется для построения массива, равного числу 2, возведенному поэлементно в степе-
степени у; т.е. twos = pow2 A5:-1:0) порождает массив [32768163848192... 8421].
8.2. Кодовая избыточность
Пример 8.3. Кодирование с помощью mat2huff.
Чтобы проиллюстрировать степень сжатия при кодировании Хаффмана, рас-
рассмотрим 8-ми битовое монохромное изображение 512x512 на рис. 8.4, а). Сжатие
этого изображения функцией mat2huf f осуществляется посредством следующих
команд:
>> f = imread( 'Tracy.tif' );
>> с = mat2huff (f) ;
>> crl = imratio(f, с)
crl =
1.2191
С помощью удаления кодовой избыточности, присутствующей в исходном изоб-
изображении, представленном обычными 8-ми битовыми кодами, нам удалось сжать
это изображение примерно до 80% от его исходного размера (даже при включе-
включении в сжатый файл служебной информации).
Рис. 8.4. Монохромное 8-ми а)
битовое изображение женщи-
женщины размерами 512x512 и уве-
увеличенное изображение ее пра-
правого глаза
Поскольку выход mat2huff представляет собой структуру, мы запишем ее на
диск с помощью функции save:
>> save SqueezeTracy с;
>> cr2 = imratio('Tracy.tif', 'SqueezeTracy .mat')
cr2 =
1.2365
Функция save4, аналогично командам Save Workspace и Save Selection As
из меню команд (см. § 1.7.4), добавляет расширение .mat к создаваемому файлу.
Полученный файл — в нашем случае, SqueezeTracy .mat — называется МАТ-
файлом. Он является файлом двоичных данных, в котором хранятся имена ра-
рабочих переменных и их значения. В нашем случае в файле хранится всего одна
рабочая переменная с. Отметим, что небольшая разница в коэффициентах сжа-
сжатия crl и сг2 связана с размерами служебных данных файлов MATLAB. ?
4 В синтаксической форме save file var эта функция записывает на диск рабочую переменную
var в виде файла данных MATLAB с именем 'file.mat'.
Глава 8. Сжатие изображений
8.2.3. Декодирование Хаффмана
Изображения, закодированные по Хаффману, будут бесполезными, пока их нель-
нельзя продекодировать и получить исходные изображения, по которым они были
построены. Для выхода у = mat2huf f (x), описанного в предыдущем параграфе,
декодер должен сначала построить соответствующий код Хаффмана, по которо-
которому кодировалось изображение х (по его гистограмме и связанной информации
в у), а затем сделать обратное отображение закодированных данных (которые
также извлекаются из у) для реконструкции х. Как видно из прилагаемого да-
далее листинга функции huf f 2mat, эти действия можно разложить на 5 основных
шагов:
1. Извлечь размеры m и п, а также минимальное значение xmin (возможного
выхода х) из входной структуры у.
2. Реконструировать код Хаффмана, которым было закодировано х, пропу-
пропустив его гистограмму через функцию huf fman. Полученный результат в
программе носит имя тар.
3. Построить структуру данных (таблицу переходов и выходов link) для упро-
упрощения декодирования данных в у. code путем ряда эффективных процедур
двоичного поиска.
4. Пропустить построенную структуру и закодированные данные (т. е. link
и у.code) через С-функцию unravel. Эта функция минимизирует время
выполнения операций двоичного поиска и строит выходной декодированный
вектор х класса double.
5. Добавляет xmin к каждому элементу х и придает ему форму и размеры
исходного изображения х (т. е. форму матрицы с m строками и п столбцами).
Единственная особенность функции huf f 2mat заключается в вызове С-функ-
ции unravel из тела М-функции MATLAB (см. шаг. 4), что делает декодирование
изображений нормального разрешения почти мгновенным.
function х = huff2mat(y)
°/eHUFF2MAT decodes a Huffman encoded matrix.
°/e X = HUFF2MAT(Y) decodes a Huffman encoded structure Y with uintl6
У. fields:
°/e Y.min Minimum value of X plus 32768
°/o Y.size Size of X
°/0 Y.hist Histogram of X
e/e Y.code Huffman code
1
7o The output X is of class double.
°/o
У. See also MAT2HUFF.
if ~isstruct(y) | ~isfield(y, 'min') | ~isfield(y, 'size') | ...
~isfield(y, 'hist') | ~isfield(y, 'code')
error('The input must be a structure as returned by MAT2HUFF.');
end
sz = double(y. size) ; m = sz(l); n = szB);
8.2. Кодовая избыточность
xmin = double (у .min) - 32768; °/0 Get X minimum
map = huf f man (double (y. hist)) ; 7, Get Huffman code (cell)
7o Create a binary search table for the Huffman decoding process.
°/0 'code' contains source symbol strings corresponding to 'link'
°/0 nodes, while 'link' contains the addresses (+) to node pairs for
°/e node symbol strings plus '0' and '1' or addresses (-) to decoded
°/e Huffman codewords in 'map'. Array 'left' is a list of nodes yet to
°/e be processed for 'link' entries.
code = cellstr(char(>, '0', '1')); °/e Set starting conditions as
link = [2; 0; 0]; left = [2 3]; °/0 3 nodes w/2 unprocessed
found = 0; tofind = length (map) ; °/0 Tracking variables
while length(left) & (found < tofind)
look = f ind(strcmp(map, code{leftA)})) ; °/0 Is string in map?
if look % Yes
link (left A)) = -look; °/0 Point to Huffman map
left = leftB:end); */, Delete current node
found = found + 1; % Increment codes found
else % No, add 2 nodes & pointers
len = length (code) ; °/0 Put pointers in node
linkdeft(l)) = len + 1;
link = [link; 0; 0] ; e/0 Add unprocessed nodes
code{end + 1} = strcat(code{left(l)}, '0');
code{end + 1} = strcat(code{left(l)}, '1');
left = leftB:end); °/0 Remove processed node
left = [left len + 1 len + 2] ; °/0 Add 2 unprocessed nodes
end
end
x = unraveKy. code', link, m * n) ; °/0 Decode using С 'unravel'
x = x + xmin - 1; °/0 X minimum offset adjust
x = reshape (x, m, n) ; °/0 Make vector an array
Как уже отмечалось ранее, декодирование huf f 2mat основано на сериях опе-
операций двоичного поиска с двумя исходящими решениями декодирования. Каж-
Каждый элемент последовательно просматриваемой строки символов, закодирован-
закодированной по Хаффману (т.е. О или 1), переключает двоичное решение декодирова-
декодирования, основанное на таблице переходов и выходов link. Построение link начи-
начинается ее инициализацией командой link = [2; 0; 0] . Каждый элемент исход-
исходного массива link, состоящего из трех элементов, соответствует закодирован-
закодированной двоичной последовательности в смешанном массиве code. В начале code =
= cellstr(char(>, '0', '1')). Пустая строка code(l) является исходной точ-
точкой (начальным состоянием) любого декодирования Хаффмана. Ассоциирован-
Ассоциированное число 2 в link(l) обозначает два возможных состояния декодирования, кото-
которые следуют за добавлением к нулевой строке ' 0' или ' 1'. Если следующий зако-
закодированный бит равен '0', то следующее состояние декодирования есть linkB)
(поскольку codeB) = '0' нулевая строка соединяется с '0'); если этот бит ра-
равен ' 1', то новое состояние будет linkC) [с индексом B +1) или 3, со значением
Глава 8. Сжатие изображений
code C) = ' 1']. Обратите внимание на то, что соответствующие значения в link
равны 0. Это означает, что они еще не были обработаны для получения подходя-
подходящих решений для кода Хаффмана тар. При построении link, если в тар найдена
строка (т. е. 'О' или ' 1', что означает настоящее кодовое слово), то соответству-
соответствующий 0 в link заменяется на соответствующий индекс тар со знаком минус (это
декодированная величина). В противном случае новый (положительный) индекс
тар вставляется по указателю на два новые состояния (возможные кодовые слова
Хаффмана) в логической последовательности (или ' 00' и '01', или ' 10' и '11').
Эти новые и еще не обработанные элементы link увеличивают размер link (сме-
(смешанный массив code также необходимо обновить), после чего процесс построе-
построения продолжается до тех пор, пока в link остаются необработанные элементы.
Вместо того, чтобы непрерывно сканировать link на предмет необработанных
элементов, функция huff2mat строит массив отслеживания с именем left, кото-
который в начале процесса равен [2, 3], и каждый раз обновляет его, чтобы в нем
находились индексы неисследованных элементов link.
Таблица 8.3. Таблица декодирования смешанного массива редуцированного источника
на рис. 8.3
Индекс i
1
2
3
4
5
6
7
Значение link(i)
2
4
-2
-4
6
-3
-1
В табл. 8.3 показана таблица link, которая строится для кода Хаффмана из
примера 8.2. Если каждый индекс link рассматривать в качестве состояния деко-
декодирования i, то каждое двоичное решение кодирования (при просмотре кодовой
последовательности слева направо) и/или выход декодера Хаффмана определя-
определяется по link(i) по следующим правилам:
1. Если link(i) < 0 (отрицательно), то кодовое слово Хаффмана уже было
продекодировано. Выход декодера есть |link(i)|, где | • | обозначает абсо-
абсолютную величину.
2. Если link(i) > 0 (положительно), и следующий обрабатываемый бит ра-
равен 0, то следующее состояние декодирования — это индекс link(i), т.е.
мы полагаем i = link(i).
3. Если link(i) > 0 и следующий обрабатываемый бит равен 1, то следующее
состояние декодирования — это индекс link(i) + 1, т.е. мы полагаем i =
= link(i) + 1.
Как ранее отмечалось, положительные компоненты link соответствуют дво-
двоичным переходам декодирования, а отрицательные компоненты определяют про-
декодированные выходные значения. После декодирования каждого кодового слова
Хаффмана начинается новый двоичный поиск с индексом link равным i = 1.
При декодировании строки 101010110101... из примера 8.2 последовательность
8.2. Кодовая избыточность
состояний переходов: i = 1, 3, 1, 2, 5, 6, 1, ...; а соответствующая после-
последовательность выходов:-, |-2|, -, -, -, |-3|, - ..., где знак '-' обозначает
отсутствие выхода. Декодированные выходные значения 2 и 3 являются первыми
двумя пикселами из первого столбца тестового изображения f 2 в примера 8.2.
С-функция unravel принимает описанную выше структуру link и использует
ее в процедуре двоичного поиска, нужного для декодирования входа пх. Блок-
схема на рис. 8.5 отображает основные действия unravel, которые производятся
в процессе принятия решений, которые объяснялись вместе с табл. 8.3. Отметим,
что при написании программы на С потребовалось вносить некоторые поправки,
связанные с тем, что индексы массивов в С начинаются с 0, а не с 1.
Рис. 8.5. Блок-схема С-функ-
ции unravel
Полностью
продекоди-
ровано?
В систему MATLAB можно внедрять функции, написанные на языках С и
Fortran, что служит двум целям:
A) появляется возможность вызывать в MATLAB огромное количество име-
имеющихся программ на С и Fortran без необходимости их переписывания и
отлаживания в виде М-файлов, и
Глава 8. Сжатие изображений
B) можно оптимизировать критически важные вычислительные процессы, т. е.
алгоритмы, реализации которых на MATLAB работают недостаточно быст-
быстро, запрограммировать на С или на Fortran более эффективно, воспользо-
воспользовавшись близостью этих языков к машинному коду.
При использовании С или Fortran, функции, написанные на этих языках, назы-
называются МЕХ- файлами5. С ними можно обращаться как с обычными М-файлами
или М-функциями MATLAB, но сначала их надо откомпилировать с помощью
специальной программы MATLAB, которая называется тех. Например, для ком-
компиляции программы unravel при работе в операционной среде Windows необхо-
необходимо в командной строке MATLAB выполнить следующую команду:
>> тех unravel.с
При этом образуется МЕХ-файл unravel.dll с расширением .dll. Функцию
МЕХ можно сопроводить любой справочной информацией, которую следует рас-
расположить в отдельном М-файле с тем же именем (и с расширением .ш).
Следующий код функции на языке С для МЕХ-файла unravel имеет расши-
расширение .с:
* unravel.с
* Decodes a variable length coded bit sequence (a vector of
* 16-bit integers) using a binary sort from the MSB to the LSB
* (across word boundaries) based on a transition table.
*=„ии„„„„„„„„„„„„=====„===„„==„„„=1|1/
#include >mex.h>
void unravel(unsigned short *hx, double *link, double *x,
double xsz, int hxsz)
{
int i= 15, j =0, k=0, n=0; /* Start at root node, 1st */
/* hx bit and x element */
while (xsz - k) { /* Do until x is filled */
if (*(link + n) > 0) { /* Is there a link? */
if ((*(hx + j) >> i) & 0x0001) /* Is bit a 1? */
n = *(link + n) ; /* Yes, get new node */
else n = *(link + n) - 1; /* It's 0 so get new node */
if (i) i-; else {j++; i = 15;} /* Set i, j to next bit */
if (j > hxsz) /* Bits left to decode? */
mexErrMsgTxt(>0ut of code bits ???>);
}
else { /* It must be a leaf node */
*(x + k++) = -*(link + n) ; /* Output value */
n = 0; } /* Start over at root */
5МЕХ-функция (Matlab External function) строится по программному коду С или Fortran. Ее
расширение зависит от компьютерной платформы. (Например, в Windows используется расши-
расширение .dll)
8.2. Кодовая избыточность
if (к == xsz - 1) /* Is one left over? */
*(x + k++) = -*(link + n);
}
void mexFunction(int nlhs, mxArray *plhs [],
int nrhs, const mxArray *prhs[])
{
double *link, *x, xsz;
unsigned short *hx;
int hxsz;
/* Check inputs for reasonableness */
if(nrhs != 3)
mexErrMsgTxt(>Three inputs required.>);
else if (nlhs > 1)
mexErrMsgTxt(>Too many output arguments.>);
/* Is last input argument a scalar? */
if (!mxIsDouble(prhs[2]) || mxIsComplex(prhs [2]) ||
mxGetN(prhs[2]) * mxGetM(prhs [2]) != 1)
mexErrMsgTxt(>Input XSIZE must be a scalar.>);
/* Create input matrix pointers and get scalar */
hx = mxGetPr(prhs[O]); /* UINT16 */
link = mxGetPr(prhs[l]); /* DOUBLE */
xsz = mxGetScalar(prhs[2]); /* DOUBLE */
/* Get the number of elements in hx */
hxsz = mxGetM(prhs[0]);
/* Create 'xsz' x 1 output matrix */
plhs[0] = mxCreateDoubleMatrix(xsz, 1, mxREAL);
/* Get С pointer to a copy of the output matrix */
x = mxGetPr(plhs[0]);
/* Call the С subroutine */
unravel(hx, link, x, xsz, hxsz);
}
Сопроводительная справочная информация помещается в файле unravel.m:
7oUNRAVEL Decodes a variable-length bit stream.
°/0 X = UNRAVEL(Y, LINK, XLEN) decodes UINT16 input vector Y based on
°/0 transition and output table LINK. The elements of Y are
7o considered to be a contiguous stream of encoded bits-i.e., the
% MSB of one element follows the LSB of the previous element. Input
°/o XLEN is the number code words in Y, and thus the size of output
°/o vector X (class DOUBLE) . Input LINK is a transition and output
°/o table (that drives a series of binary searches) :
°/o
°/0 1. LINK(O) is the entry point for decoding, i.e., state n = 0.
°/, 2. If LINK(n) < 0, the decoded output is |LINK(n)|; set n = 0.
°/0 3. If LINK(n) > 0, get the next encoded bit and transition to
°/o state [LINK(n) - 1] if the bit is 0, else LINK(n) .
Глава 8. Сжатие изображений
Как и любой МЕХ-файл, построенный из программы на С, МЕХ-файл для unravel. с
состоит из двух частей: вычислительной программы и шлюзовой программы.
Вычислительная программа, которая также называется unravel, содержит про-
программный код на С, реализующий процесс декодирования по схеме на рис. 8.5 с
использованием таблицы link. Шлюзовая программа, которая должна называть-
называться mexFunction, осуществляет интерфейс (обмен параметрами) вычислительной
программы и вызывающей ее М-функции huf f 2mat. Она использует стандартный
интерфейс МЕХ-файлов MATLAB, который включает следующие элементы:
1. Четыре стандартизованные параметра входа/выхода - nlhs, plhs, nrhs и
prhs. Эти параметры являются, соответственно, числом выходных аргумен-
аргументов в левой части (целое), массивом указателей на выходные аргументы в
левой части (массивы MATLAB), числом входных аргументов в правой ча-
части (другое целое) и массивом указателей на входные аргументы в левой
части (также массивы MATLAB).
2. Имеющееся в MATLAB семейство приложений программного интерфейса
API (Application Program Interface). Функции API имеют префикс шх. Они
предназначены для создания, доступа, манипулирования и/или удаления
структур класса mxArray. Например,
- mxCalloc осуществляет динамическое распределение памяти подобно
стандартной функции С calloc. Вместо соответствующих С-функций
malloc и realloc используются функции mxMalloc и mxRealloc;
- mxGetScalar извлекает скаляры из входного массива prhs. Другие
функции mxGet. . ., например, mxGetM, mxGetN и mxGetString извле-
извлекают другие типы данных;
- функция mxCreateDoubleMatrix создает выходной массив MATLAB
для plhs. Другие функции mxCreate. . ., например, mxCreateString и
mxCreate-NumericArray создают другие типы данных.
Функции API с префиксом тех совершают действия в рабочем простран-
пространстве MATLAB. Например, mexErrMsgTxt выдает сообщение в рабочем окне
MATLAB.
Прототипы функций API тех и тх, приведенные в пункте 2 предыдущего пе-
перечня, расположены в заголовочных файлах MATLAB mex.h и matrix.h соот-
соответственно. Оба эти файла размещаются в папке <matlab>/extern/include, где
<matlab> обозначает корневую установочную папку вашей системы MATLAB.
Заголовок тех. h, который должен быть включен в начало любого МЕХ-файла
(обратите внимание на присутствие в начале файла unravel. с записи #include
>mex.h>), содержит в себе также заголовочный файл matrix.h. Прототипы ин-
интерфейсных программ тех и тх, которые хранятся в этих файлах, определяют
используемые параметры и придают смысл операциям над этими параметрами.
Дополнительную информацию по этому вопросу молено узнать из руководства
MATLAB по внешним интерфейсам (External Interfaces).
На рис. 8.6 приведенные выше сведения даны в компактной форме, из которой
видна структура МЕХ-файла unravel, а также обозначено направление потоков
информации между unravel и huf f 2mat. Несмотря на то, что эта концепция про-
проиллюстрирована в контексте декодирования Хаффмана, ее легко распространить
на другие функции С или Fortran, если требуется их использование в MATLAB.
8.2. Кодовая избыточность
М-файл unravel.m
Справочная информация
для МЕХ-файла unravel:
Содержит текст,
отображаемый командой
» help unravel
С МЕХ-файл unravel.с
MATLAB передает параметры
1 у, link и ш*п в МЕХ-файл:
prhs[O] = y
prhs[1] = link
prhs[2] = m*n
nrhs = 3
nrhs = 1
Параметры nlhs и nrhs явля-
являются целыми, обозначающи-
обозначающими число аргументов слева и
справа, a prhs — вектор, со-
1 держащий указатели на мас-
1 сивы MATLAB у, link и ш*п
М-файл hufOmat
•
•
•
В М-файле huff2mat
команда
х = unravel(y,...
link, M*n)
говорит системе MATLAB
передать у, link и m*n в
МЕХ-файл функции unravel
Возвращаемая переменная
plhs(O) присваивается пере-
иенной х
•
•
I
I
•^ 1
•
MATLAB передает выход
МАХ-файла plhs [0]
в М-файл huff2mat.
В МЕХ-файле unravel.с вычисления начинаются и заканчи-
заканчиваются в шлюзовой программе mexFunction, которая вызы-
вызывает С-вычислительную программу unravel. Точка входа
интерфейса декларируется записью
#include "mex.h"
^-функция mexFunction
Шлюзовая программа для МЕХ-файла
void mexFunction(
int nlhs, mxArray *plhs[ ],
int nrhs, const mxArray
*prhs[])
где целые nlhs и nrhs обозначают число аргументов слева
и справа, а векторы plhs и prhs содержат указатели на вход-
входные и выходные аргументы типа mxArray. Тип mxArray слу-
служит в MATLAB для внешнего представления массивов.
Пакет API MATLAB состоит из функций, которые обраба-
обрабатывают типы данных, поддерживаемые этим пакетом.
Здесь мы:
1. Используем функции mxGetM, mxGetN, mxIsDoubl,
mxIsComplex и mexErrMsgTxt для проверки входных
и выходных аргументов.
2. Используем функцию mxGetPr для получения указате-
указателей на prhs[O] (код Хаффмана) и на prhs[1] (таблица деко-
декодирования) и сохранения их в виде С-указателей hx и
link, соответственно.
3. Применяем mxGetScalar для получения размера выход-
выходного массива и сохраняем его в переменной xsz.
4. Применяем mxGetM для определения числа элементов
prhs[O] (кода Хаффмана) и сохраняем его в hxsz.
5. Используем mxCreateDoubleMatrix и mxGetPr для создания
указателя на выходной массив (для декодера) и присва-
присваиваем его plhs[O].
6. Вызываем вычислительную программу unravel, переда-
передавая ее аргументы, сформированные при выполнении
шагов 1-5.
С-функция unravel.
МАХ-файл вычислительной программы:
void unravel(
unsigned short *hx
double link, double *x,
double xsz, int hxsz)
содержит исполняемый С-код для декодирования hx
на основе link и помещает результат в х.
Рис. 8.6. Взаимодействие М-функции huff2mat и вызываемой из MATLAB С-функции
unravel. Обратите внимание на то, что МЕХ-файл unravel состоит из двух
функций: шлюзовой программы mexFunction и вычислительной программы
unravel. Справочная информация для МЕХ-файла unravel располагается в от-
отдельном М-файле, который также называется unravel
Глава 8. Сжатие изображений
Пример 8.4. Декодирование с помощью huf f 2mat.
Изображение из примера 8.3 можно продекодировать следующей последователь-
последовательностью команд:6
>> load SqueezeTracy;
>> g = huff2mat(c) ;
>> f = imreadOTracy.tif');
>> rmse = compare (f, g)
rmse =
0
Обратите внимание на то, что процесс кодирования-декодирования полностью
сохраняет информацию: среднеквадратическая ошибка между исходным и де-
декодированным изображением равна нулю. В силу того, что значительная часть
работы в функции huf f 2mat выполняется С-функцией unravel, время ее испол-
исполнения немного меньше времени кодирования функцией mat2huf f. Отметим также
использование функции load для повторной загрузки данных из МАТ-файла, в
котором были сохранен результат кодирования, полученный в примере 8.3. ?
8.3. Межпиксельная избыточность
Рассмотрим два изображения на рис. 8.7, а) и ej, которые имеют практически
одинаковые гистограммы. На этих гистограммах можно выделить три определя-
определяющие моды, которые означают присутствие на изображениях трех доминирую-
доминирующих интервалов серых тонов. Поскольку здесь уровни серого цвета не являются
равномерно распределенными, можно использовать коды переменной длины для
сокращения кодовой избыточности, которая будет присутствовать при кодирова-
кодировании пикселов по обычной схеме кодами фиксированной длины:
>> fl = imread('Random Matches.tif');
>> cl = mat2huff (f 1) ;
>> entropy (fl)
ans =
7.4253
>> imratio(fl, cl)
ans =
1.0704
>> f2 = imreadOAligned Matches.tif');
>> c2 = mat2huff (f2) ;
>> entropy (f 2)
ans =
7.3505
>> imratio(f2, c2)
ans =
1.0821
6 Функция load file считывает переменные MATLAB, хранящиеся на диске в файле 'file.mat',
и загружает их в рабочее пространство. При выполнении команд save/load имена переменных
не изменяются.
8.3. Меэюпиксельная избыточность
Заметим, что энтропийные оценки первого порядка обоих изображений близки
друг к другу G.4253 и 7.3505 бит/пиксел), и эти изображения одинаково сжи-
сжимаются функцией mat2huff (с коэффициентами сжатия 1.0704 против 1.0821).
Из этого сравнения видно, что коды переменной длины не используют при сжа-
сжатии очевидное структурное преимущество рис. 8.7, в), на котором спички лежат
ровным рядом. На этом изображении имеется явная межпиксельная корреляция,
однако эта же корреляция присутствует также и на рис. 8.7, а), т. к. значения
пикселов можно в значительной степени предсказать по значениям их соседей.
Информация, которую несет каждый отдельный пиксел, достаточно мала. Боль-
Большая часть визуального вклада индивидуальных пикселов является избыточной,
и ее можно восстановить, зная вклад других близких пикселов. Эта зависимость
и служит основой для межпиксельной избыточности.
Рис. 8.7. Два изоб- а)
ражения и их полуто-
полутоновые гистограммы
в)
50 100 150 200 250
50 100 150 200 250
Для того, чтобы сократить межпиксельную избыточность, двумерные мас-
массивы, используемые для представления зрительных образов, необходимо пре-
преобразовать в более эффективный (но «невизуальный») формат. Например, для
представления изображений можно использовать разность примыкающих друг к
другу пикселов. Преобразования такого типа (они удаляют межпиксельную из-
избыточность) принято называть отобраэюениями. Отображения называются обра-
обратимыми, если элементы исходного изображения можно однозначно восстановить
(реконструировать) по множеству отображенных данных.
Простая процедура отображения показана на рис. 8.8. Этот подход, называ-
называемый кодированием с предсказанием без потерь, удаляет межпиксельную избы-
Глава 8. Сжатие изображений
точность с помощью вычитания и кодирования лишь новой (добавочной инфор-
информации) пикселов. Новая информация пикселов определяется как разность между
реальным значением пикселом и величиной его предсказания. Как видно, систе-
система состоит из кодера и декодера, и каждый из них имеет один и тот же блок
предсказатель. Когда очередной пиксел входного изображения, обозначаемый /п,
поступает на вход кодера, предсказатель строит прогноз (оценку значения этого
пиксела), основанный на некотором наборе предыдущих входных пикселов. За-
Затем выход предсказателя округляется до ближайшего целого, обозначаемого /п,
и используется для нахождения разности или ошибки предсказания
а)
Входное
изображение
J
Предска-
Предсказатель
Ближайшее
среднее
-ч еп
fn
Кодер
символов
Сжатое
изображение
б)
Сжатое # >
изображение
Декодер
символов
е" Г
I
fn
J
Предска-
Предсказатель
fn
Восстановленное
~ изображение
Рис. 8.8. Модель кодирования с предсказанием без потери информации: а) кодер;
б) декодер
Эта ошибка кодируется кодом переменной длины (кодером символов), и тем самым
генерируется очередной элемент сжатого потока данных. Декодер на рис. 8.8, б)
восстанавливает значение еп по принятому кодовому слову переменной длины и
совершает обратное преобразование
fn = en + fn.
Для построения предсказания /п могут использоваться различные локальные,
глобальные или адаптивные методы. Однако в большинстве случаев принято вы-
вычислять предсказание в виде линейной комбинации т предыдущих пикселов:
fn = rOUnd V" OLifn-i ,
где т — это порядок линейного предсказания, операция round [] обозначает округ-
округление до ближайшего целого (наподобие функции round из MATLAB), а щ при
8.3. Межпикселъная избыточность
г = 1,2,...,7П — коэффициенты предсказания. Для одномерного кодирования с
предсказанием это выражение можно переписать в виде
f(x,y) = round
A=l
где каждая индексированная переменная теперь выражена явно в виде функции
пространственных координат х и у. Отметим, что при таком подходе предсказа-
предсказание f(x,y) зависит лишь от значений пикселов одной текущей обрабатываемой
строки.
М-функции mat21pc и Ipc2mat реализуют процедуру кодирования/декоди-
кодирования/декодирования с предсказанием, описанную выше (за вычетом шагов символьного ко-
кодирования/декодирования). Функция кодирования mat21pc использует цикл for
для построения одновременного прогноза всех пикселов входа х. На каждом ша-
шаге итерации массив xs, который в начале равен х, сдвигается на одну позицию
вправо (с нулевым заполнением слева), умножается на соответствующие коэф-
коэффициенты предсказания и прибавляется к суммирующему массиву р. Поскольку
обычно число коэффициентов линейного предсказания мало, процедура работает
достаточно быстро. Отметим, что при исполнении следующей программы, если
фильтр предсказания f не задан на входе, то используется простейший фильтр,
состоящий из одного числа 1.
function у = mat21pc(x, f)
°/0MAT2LPC Compresses a matrix using 1-D lossles predictive coding.
°/o Y = MAT2LPC(X, F) encodes matrix X using 1-D lossless predictive
°/e coding. A linear prediction of X is made based on the
% coefficients in F. If F is omitted, F = 1 (for previous pixel
°/o coding) is assumed. The prediction error is then computed and
70 output as encoded matrix Y.
У.
У. See also LPC2MAT.
error(nargchk(l, 2, nargin));
if nargin < 2
f = 1;
end
x = double(x);
[m, n] = size(x);
p = zeros(m, n);
xs = x; zc = zeros(m, 1);
for j = 1:length(f)
xs = [zc xs(:, l:end - 1)]
p = p + f(j) * xs;
end
у = x - round(p); °/o Compute the prediction error
Функция декодирования Ipc2mat совершает действия, обратные преобразова-
преобразованиям функции кодирования mat21pc. Как видно из следующего текста этой про-
программы, она совершает п итераций цикла for, где п обозначает число столбцов
e/o Check input arguments
°/e Set default filter if omitted
7o Ensure double for computations
°/o Get dimensions of input matrix
% Init linear prediction to 0
°/0 Prepare for input shift and pad
% For each filter coefficient . . .
У, Shift and zero pad x
°/e Form partial prediction sums
Глава 8. Сжатие изображений
закодированной входной матрицы у. На каждой итерации вычисляется только
один столбец выхода декодера х, поскольку для этого требуется знать все преды-
предыдущие столбцы. Для ускорения вычислений цикла for матрица х расширяется до
максимально необходимого размера перед началом цикла и заполняется нулями.
Заметьте также, что предсказания вычисляются здесь точно в том же порядке,
что и в функции Ipc2mat. В этом случае удается избежать ошибок округления в
вычислениях с плавающей точкой.
function х = Ipc2mat(y, f)
70LPC2MAT Decompresses a 1-D lossless predictive encoded matrix.
7e X = LPC2MAT(Y, F) decodes input matrix Y based on linear
°/e prediction coefficients in F and the assumption of 1-D lossless
У» predictive coding. If F is omitted, filter F = 1 (for previous
7e pixel coding) is assumed.
°/o
У. See also MAT2LPC.
error(nargchk(l, 2, nargin)); e/e Check input arguments
if nargin < 2 °/0 Set default filter if omitted
f = 1;
end
f = f (end:-1:1); e/0 Reverse the filter coefficients
[m, n] = size(y); °/e Get dimensions of output matrix
order = length(f); % Get order of linear predictor
f = repmat(f, m, 1); °/0 Duplicate filter for vectorizing
x = zeros(m, n + order); e/0 Pad for 1st 'order' column decodes
°/e Decode the output one column at a time. Compute a prediction based
7e on the 'order' previous elements and add it to the prediction
°/o error. The result is appended to the output matrix being built,
for j = l:n
jj = j + order;
x(:» jj) = y(:> j) + round(sum(f(:, order:-l:l) .* ...
x(:, (jj - l):-l:(jj - order)), 2));
end
x = x(:, order + l:end); 7, Remove left padding
Пример 8.5. Кодирование с предсказанием без потери информации.
Рассмотрим кодирование изображения на рис. 8.7, в) с помощью простого линей-
линейного предсказателя первого порядка
f(x, у) = round [af{x, у - 1)].
Такую форму предсказания принято называть предсказанием по предыдущему
пикселу, а соответствующая схема кодирования называется дифференциальным
кодированием или кодированием по предыдущему пикселу. На рис. 8.9, а) приве-
приведено изображение ошибки предсказания при а = 1. Здесь уровень яркости 128
8.3. Межпикселъная избыточность
соответствует нулевой ошибке предсказания, а ненулевые (положительные и от-
отрицательные) ошибки усилены функцией mat2gray, что делает их более яркими
или более темными оттенками.
>>
>>
>>
>>
ans
f = imread('Aligned Matches.tif');
e = mat21pc(f);
imshow(mat2gray(e));
entropy(e)
5.9727
Заметьте, что энтропия ошибки предсказания е существенно меньше энтропии
исходного изображения f. Энтропия уменьшилась с 7.3505 бит/пиксел (см. вы-
вычисления в начале этого параграфа) до 5.9727 бит/пиксел, и это при том, что для
m-битных изображений требуются (га + 1)-битные числа для корректного пред-
представления полученной последовательности ошибок. Такое уменьшение энтропии
означает, что изображение, составленное из ошибок предсказания, можно коди-
кодировать более эффективно по сравнению с исходным изображением, а как раз это
и является целью отображения. В итоге мы имеем
>> с = mat2huff (e) ;
>> cr = imratio(f, с)
сг =
1.3311
откуда видно, что коэффициент сжатия вырос, как и ожидалось, с 1.0821 (при
прямом кодировании уровней изображения по Хаффману) до 1.3311.
а)
б)
14000
12000
10000
8000
6000
4000
2000
0
I I I I I Г
6 4 2 0 2 4 6
Рис. 8.9. а) Изображение ошибки предсказания для изображения на рис. 8.7, в);
б) Гистограмма ошибки предсказания
Гистограмма ошибок предсказания, приведенная на рис. 8.9, б), вычислена
командами
>> [h, x] = hist(e(:) * 512, 512);
>> figure; bar(x, h, Jk>);
Глава 8. Сжатие изображений
Обратите внимание на высокий пик возле 0 и на относительно небольшую диспер-
дисперсию гистограммы по сравнению с гистограммой распределения уровней исходно-
исходного изображения (см. рис. 8.7, г)). Все это означает удаление значительной части
межпиксельной избыточности в процессе дифференциального предсказания. Мы
завершим этот пример демонстрацией полного сохранения информации при ко-
кодировании по этой схеме. Для этого мы декодируем с и сравниваем результат с
начальным изображением f:
>> Ipc2mat(huff2mat(c)) ;
>> compare (f, g)
ans =
0 ?
8.4. Визуальная избыточность
В отличие от кодовой и межпиксельной избыточности, визуальная избыточность1
связана с настоящей визуальной информацией, поддающейся количественному
измерению. Ее удаление желательно, поскольку эта информация сама по себе не
существенна для обычного визуального восприятия. Поскольку уменьшение ви-
визуальных избыточных данных приводит к потери части количественной инфор-
информации, этот процесс принято называть квантованием. Такая терминология хоро-
хорошо согласуется с обычным смыслом этого слова, которое означает представление
широкого набора величин с помощью ограниченного множества допустимых зна-
значений. Эта процедура не является обратимой (после ее совершения происходит
невосполнимая утрата части информации), т.е. квантование приводит к потере
части сжимаемых данных.
Пример 8.6. Сжатие посредством квантования.
Рассмотрим изображения на рис. 8.10. Рис. 8.10, а) показывает черно-белое изоб-
изображение с 256 возможными градациями яркости. На рис. 8.10, б) представлено то
лее самое изображение после равномерного квантования на 16 уровней D бита).
Полученный в результате коэффициент сжатия равен 2:1. Заметим, что на
некоторых областях изображения, которые были гладкими, появились ложные
контуры. В этом проявляется обычный видимый эффект слишком грубого пред-
представления уровней яркости изображения.
Рис. 8.10, в) иллюстрирует значительное улучшение изображения, возмож-
возможное при использовании квантования, которое учитывает визуальные особенности
зрительного аппарата человека. Несмотря на то, что коэффициент сжатия при
этом квантовании также равен 2:1, ложные контуры значительно ослаблены за
счет некоторой дополнительной, но мало заметной зернистости. Заметим, что в
обоих случаях полное восстановление изображения после декодирования остается
невозможным (квантование является необратимым преобразованием). ?
*В английском оригинале использовано словосочетание psychovisual redundansy (психовизуаль-
(психовизуальная избыточность). Мы будем употреблять принятый в русскоязычной литературе термин
визуальная избыточность. Однако следует иметь в виду, что эта избыточность связана преж-
прежде всего с психофизическими особенностями зрения человека.
8.4- Визуальная избыточность
Рис. 8.10. а) Исходное изобра- а)
жение. б) Равномерное кванто-
квантование на 16 уровней, в) Кван-
Квантование IGS на 16 уровней
б)
в)
Метод квантования, примененный на рис. 8.10, в), называется методом мо-
модифицированного квантования яркости IGS (Improved Gray-Scale quantization).
Он учитывает свойственную глазу чувствительность к контурам и борется с лож-
ложными контурами с помощью добавления ко всем пикселам малых псевдослучай-
псевдослучайных чисел, которые строятся по младшим битам значений окрестных пикселов до
из квантования. Поскольку младшие биты, как правило, достаточны случайны,
то это действие эквивалентно добавлению некоторого уровня случайности, зави-
зависящего от локальных свойств изображения, что приводит к разрушению четкости
ровных перепадов, которые выглядят как ложные контуры. Ниже приводится
текст функции quantize, которая совершает оба типа квантования: метод IGS и
стандартное отсекание младших битов. Заметим, что реализация IGS векторизо-
векторизована так, что вход х обрабатывается по столбцам за один шаг. Чтобы построить
столбец результата по 4 бита на рис. 8.10, в), сумма по столбцам s (которая об-
обнуляется в начале) вычисляется как сумма одного столбца х и четырех наименее
значимых битов существующей (ранее вычисленной) суммы. Если четыре самые
значимые бита некоторой величины х равны 11112, то вместо этого добавляется
00002- Затем четыре самые значимые бита полученной суммы используются для
кодирования значения пиксела обрабатываемого столбца2.
function у = quantize(x, b, type)
°/eQUANTIZE Quantizes the elements of a UINT8 matrix.
°/o Y = QUANTIZEU, B, TYPE) quantizes X to В bits. Truncation is
7o used unless TYPE is 'igs' for Improved Gray Scale quantization.
error(nargchkB, 3, nargin)); °/e Check input arguments
if ndims(x) ~= 2 | ~isreal(x) | ...
~isnumeric(x) | ~isa(x, 'uint8')
error('The input must be a UINT8 numeric matrix.');
end
°/o Create bit masks for the quantization
lo = uint8B ~(8 b) 1);
2 Для сравнения строк si и s2 используется функция s = strcmpi(sl, s2).
Глава 8. Сжатие изображений
hi = uint8B Л8 double(lo) 1);
% Perform standard quantization unless IGS is specified
if nargin < 3 | ~strcmpi (type, 'igs')
у = bitand(x, hi);
% Else IGS quantization. Process column-wise. If the MSB's of the
°/0 pixel are all l's, the sum is set to the pixel value. Else, add
% the pixel value to the LSB's of the previous sum. Then take the
% MSB's of the sum as the quantized value,
else
[m, n] = size(x); s = zeros(m, 1);
hitest = double(bitand(x, hi) ~= hi); x = double(x);
for j = l:n
s = x(:, j) + hitest(:, j) .* double(bitand(uint8(s), lo));
y(:, j) = bitand(uint8(s), hi);
end
end
Модифицированное квантование яркости является весьма типичным пред-
представителем большого семейства процедур квантования, которые оперируют на-
напрямую со значениями яркости пикселов сжимаемых изображений. Они часто
приводят к понижению как пространственного, так и яркостного разрешения
изображений. Если изображение сначала отображается с целью сокращения меж-
межпиксельной избыточности, то дальнейшее квантование может привести к другим
типам искажения в виде размытия тонких контуров (т. е. к потере высокочастот-
высокочастотных деталей), когда двумерное преобразование в частотной области используется
для декорреляции данных.
Пример 8.7. Сочетание квантования IGS, кодирования с предсказанием без
потерь и кодирования Хаффмана.
Несмотря на то, что квантование, использованное при построении сжатого изоб-
изображения на рис. 8.10, ej, удаляет большую часть визуальной избыточности с
весьма малым влиянием на воспринимаемое глазом качество изображения, даль-
дальнейшее сжатие можно получить, используя методы, изложенные в предыдущих
двух параграфах, которые позволяют уменьшить межпиксельную и кодовую из-
избыточности. На самом деле, мы можем более чем вдвое повысить сжатие, достиг-
достигнутое при квантовании IGS. Следующая последовательность команд выполняет
квантование IGS, кодирование с предсказанием и кодирование Хаффмана, что
позволяет сжать изображение на рис. 6.10, а) в четыре раза и более от его исход-
исходного размера:
>> f = imreadOBrushes.tif');
>> q = quantize(f, 4, 'igs');
>> qs = double (q) / 16;
>> e = mat21pc(qs);
>> с = mat2huff(e);
>> imratio(f, c)
ans =
4.1420
8.5. Стандарты сжатия JPEG
Закодированное изображение с можно разжать с помощью обратной последова-
последовательности операций (только без «обратного квантования»):
>> ne = huff2mat(c);
>> nqs = Ipc2mat(ne);
>> nq = 16 * nqs;
>> compare (q, nq)
ans =
0
>> rmse = compare(f, nq)
rmse =
6.8382
Отметим, что среднеквадратическое отклонение разжатого изображения от ис-
исходного равно приблизительно 7 уровням яркости, что происходит исключитель-
исключительно из-за процедуры квантования. ?
8.5. Стандарты сжатия JPEG
Изложенные в предыдущем параграфе методы оперируют непосредственно с
пикселами изображения, поэтому они называются методами квантования в про-
пространственной области. В этом параграфе мы рассмотрим семейство популяр-
популярных стандартов сжатия, которые основаны на модификациях преобразованного
изображения. Наше цель заключается в описании использования двумерных пре-
преобразований при сжатии изображений, а также в рассмотрении некоторых новых
приемов сокращения избыточности, которые обобщают подходы, изложенные в
§§ 8.2-8.4. Тогда читатель сможет оценить современное состояние дел в области
сжатия изображений. Представленные стандарты (на самом деле, мы рассмот-
рассмотрим лишь некоторые приближения к ним) разработаны для обработки широкого
круга изображений, которым требуются весьма различные условия сжатия.
При трансформационном кодировании используется некоторое обратимое линей-
линейное преобразование, например, дискретное преобразование Фурье DFT (см. гл. 4)
или дискретное косинусное преобразование DCT (Descrete Cosinus Transform),
которое задается уравнениями
_. ч v-^ v^4 п/ \ / \ / \ ГBж + 1)шг,
T(u,v)= > > f(x,y)aM(u)aN(v) cos \ — cos
2М ' ' 2N
где
у /
^ при и = О,
^ прии = 1,2,...,М-1
(и аналогичная формула для функции ам{у))- При этом изображение /(х,у)
отображается в некоторое множество коэффициентов преобразования, которые
Глава 8. Сжатие изображений
затем квантуются и кодируются. Для подавляющего числа естественных изоб-
изображений существенная часть коэффициентов преобразования имеет малую ам-
амплитуду, и их можно грубо квантовать (или даже совсем отбросить), внеся тем
самым в изображение незначительные искажения, практически незаметные для
глаза.
8.5.1. JPEG
Одним из самых известных и широко применяемых универсальных стандартов
сжатия изображений с непрерывными тонами является стандарт JPEG (эта аб-
аббревиатура образована из слов Joint Photographic Experts Group, объединенная
группа экспертов по фотографии). В базовой системе кодирования JPEG, осно-
основанной на дискретном косинусном преобразовании и годящейся для большинства
приложений сжатия, входные и выходные изображения ограничены 8-и битным
форматом представления компонент яркости и цветности, а длина представле-
представления коэффициентов DCT равна 11 битам. Как видно на упрощенной блок-схеме
рис. 8.11, а), само сжатие совершается за четыре шага: извлечение подизображе-
ний размерами 8x8, вычисление DCT, квантование и присвоение кодов перемен-
переменной длины, т. е. кодирование.
а)
Входное
изображение
Формирова-
•Иние 8x8
блоков
Прямое
преобразо-
вание
Квантователь
Кодер
символов
Сжатое
изображение
б)
Сжатое
изображение *
Декодер
символов
Denormalizer
Обратное
преобра-
Объедине-
ние 8x8
блоков
Восстановленное
изображение
Рис. 8.11. Блок-схема JPEG: а) кодер; б) декодер
Первый шаг процесса сжатия JPEG заключается в разделении входного изоб-
изображения на непересекающиеся блоки пикселов размерами 8x8. Это выполняет-
выполняется последовательно в направлении слева направо и сверху вниз. Каждый блок
8x8 (подизображение) подвергается определенной обработке. Все его 64 пиксела
сдвигаются вычитанием числа 2т~1, где 2т — это число уровней яркости изоб-
изображения, после чего вычисляется дискретное косинусное преобразование DCT
блока. Полученные коэффициенты нормируются и квантуются по правилу
hatT(u,v) = round
Z{u,v)
где T(u, v) при u,v = 0,1,2,..., 7 обозначают нормированные и квантованные
коэффициенты, Т(и, v) — коэффициенты DCT текущего блока 8x8 изображения
/(х,2/), a Z(u,v) — нормирующая матрица преобразования, предписанная стан-
стандартом и приведенная на рис. 8.12, а). Если менять элементы матрицы Z(u,v)
пропорционально некоторому числу, то это позволяет варьировать коэффициент
достигаемого сжатия, что отражается на качестве реконструированного изобра-
изображения.
8.5. Стандарты сжатия JPEG
а)
16
12
14
14
18
24
49
72
11
12
13
17
22
35
64
92
10
14
16
22
37
55
78
95
16
19
24
29
56
64
87
98
24
26
40
51
68
81
103
112
40
58
57
87
109
104
121
100
51
60
69
80
103
ИЗ
120
103
61
55
56
62
77
92
101
99
б)
0
2
3
9
10
20
21
35
1
4
8
11
19
22
34
36
5
7
12
18
23
33
37
48
6
13
17
24
32
38
47
49
14
16
25
31
39
46
50
57
15
26
30
40
45
51
56
58
27
29
41
44
52
55
59
62
28
«-
43
53
54
60
61
63
Рис. 8.12. а) Нормировочная матрица JPEG; б) Последовательность упорядочения коэф-
коэффициентов по зигзагу в JPEG
После того, как коэффициенты DCT всех блоков будут проквантованы, эле-
элементы двумерных матриц Т(и, v) переупорядочиваются в зигзагообразном поряд-
порядке, показанном на рис. 8.12, б) последовательными числами 0,1,2,..., 63, образуя
одномерный массив. Поскольку полученные одномерные векторы (квантованных
коэффициентов) упорядочены по возрастанию пространственной частоты, то са-
сами они уменьшаются в этом направлении, и кодер символов на рис. 8.11, а) опти-
оптимизирован с учетом вероятного появления длинных серий нулей, которые обычно
возникают после упорядочения зигзагом. В частности, ненулевые коэффициен-
коэффициенты АС [т.е. все T(u,v), кроме случая и = v = 0] кодируются с использованием
кодов переменной длины, которые определяют величины этих коэффициентов и
число следующих за ними нулей. Коэффициенты DC [т. е. Т@,0)] кодируются
разностными кодами по отношению к коэффициентам DC предыдущих подизоб-
ражений. В стандарте имеются таблицы для кодов Хаффмана коэффициентов
DC и АС, которые используются при сжатии по умолчанию, но пользователь мо-
может построить свои собственные таблицы, а также задать свою нормировочную
матрицу. В последнем случае всю эту информацию придется добавить к сжатым
данным в зарезервированную область параметров.
Хотя полная реализация стандарта JPEG выходит за рамки этой главы, сле-
следующая М-функция моделирует процесс базового кодирования:
function у = im2jpeg(x, quality)
e/eIM2JPEG Compresses an image using a JPEG approximation.
7. Y = IM2JPEGCX, QUALITY) compresses image X based on 8 x 8 DCT
7e transforms, coefficient quantization, and Huffman symbol
e/e coding. Input QUALITY determines the amount of information that
% is lost and compression achieved. Y is an encoding structure
°/e containing fields:
У. Y.size
°/o Y.numblocks
У. Y. quality
Size of X
Number of 8-by-8 encoded blocks
Quality factor (as percent)
Глава 8. Сжатие изображений
°/o Y. huff man
Huffman encoding structure, as returned by
MAT2HUFF
У.
7, See also JPEG2IM.
error (nargchkd, 2, nargin)); 70 Check input arguments
if ndims(x) ~= 2 | ~isreal(x) | ~isnumeric(x) | ~isa(x, 'uint8')
error('The input must be a UINT8 image.');
end
if nargin < 2
quality = 1; °/0 Default value for quality,
end
m = [16 11 10 16 24 40 51 61 % JPEG normalizing array
12 12 14 19 26 58 60 55 e/. and zig-zag redordering
14 13 16 24 40 57 69 56 °/. pattern.
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99] * quality;
order = [1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 ...
41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 ...
43 36 29 22 15 8 16 23 30 37 44 51 58 59 52 ...
45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 ...
62 63 56 64];
[xm, xn] = size(x); °/0 Get input size,
x = double (x) - 128; °/0 Level shift input
t = dctmtx(8); 7o Compute 8x8 DCT matrix
7o Compute DCTs of 8x8 blocks and quantize the coefficients,
у = blkproc(x, [8 8], 'PI * x * P2', t, t');
'round(x ./ PI)', m);
7o Break 8x8 blocks into columns
7o Get number of blocks
7o Reorder column elements
7o Create end-of-block symbol
l);
у = blkproc(y, [8 8]
у = im2col(y, [8 8], 'distinct');
xb = size(y, 2);
у = у(order, :);
eob = max(x(:)) + 1;
r = zeros(numel(y) + size(y, 2)
count = 0;
for j = l:xb
i = max(find(y(:, j)));
if isempty(i)
i = 0;
end
p = count + 1;
q = p + i;
r(p:q) = [y(l:i, j); eob]
Process 1 block (col) at a time
Find last non-zero element
No nonzero block values
count = count + i + 1;
% Truncate trailing 0's, add EOB,
°/0 and add to output vector
end
8.5. Стандарты сжатия JPEG
r((count + l):end) = [] ; °/0 Delete unusued portion of r
y.size = uintl6([xm xn] ) ;
y.mimblocks = uintl6(xb);
y.quality = uint16(quality * 100);
y.huffman = mat2huff(r);
В соответствии с блок-схемой на рис. 8.11, а), функция im2jpeg обрабатывает
отдельные подизображения или блоки 8x8 входного изображения х (последова-
(последовательно блок за блоком, но не все изображение сразу). Для упорядочения вычис-
вычислений используются две функции обработки блоков blkproc и im2col. Функция
blkproc имеет стандартный синтаксис
В = blkproc(A, [M N], FUN, PI, P2, ...).
Эта функция унифицирует весь процесс поблочной обработки изображения. Она
принимает входное изображение А вместе с размерами блоков [М N], по которым
требуется обрабатывать изображение, а также функцию FUN, которая будет об-
обрабатывать эти блоки, и некоторый опционный набор аргументов PI, P2, ...
функции FUN. Затем функция blkproc разделяет А на блоки MxN (используя за-
заполнение нулями там, где блок выходит за рамки изображения), вызывает функ-
функцию FUN для каждого блока с заданными параметрами Р1, Р2, . . ., и, наконец,
помещает результат в выходное изображение В.
Другой функцией поблочной обработки, используемой в процедуре im2jpeg,
является функция im2col. Если функция blkproc не годится для реализации
специфических поблочных действий, функция im2col может использоваться для
переупорядочения входа так, чтобы операции можно было совершить проще и
эффективнее (например, применяя векторизацию). Выходом im2col служит мат-
матрица, в которой каждый столбец состоит из элементов одного блока входного
изображения. Ее стандартизованный формат имеет вид
В = im2col(A, [M N], 'distinct'),
где параметры А, В и [М N] имеют тот же смысл, что и в функции blkproc, a
строка 'distinct' сообщает im2col о том, что обрабатываемые блоки не пересе-
пересекаются; другая строка-параметр 'sliding' сигнализирует о том, что необходимо
строить один столбец В для каждого пиксела в А (как если бы блок скользил по
изображению).
В процедуре im2jpeg функция blkproc применяется для облегчения вычис-
вычисления DCT, нормирования и квантования, а функция im2col упрощает упоря-
упорядочение квантованных коэффициентов и отслеживание серий нулей. В отличие
от стандарта JPEG, функция im2jpeg обнаруживает только последнюю серию
нулей в каждой упорядоченной последовательности коэффициентов квантован-
квантованного блока, заменяя всю эту серию одним символом eob (End Of Block). Наконец,
отметим, что в системе MATLAB имеется эффективная утилита, написанная на
базе FFT, которая выполняет DCT для больших изображений (см. справку для
функции dct2). Тем не менее, im2jpeg использует альтернативную матричную
Глава 8. Сжатие изображений
формулу1
Т = HFHT,
где F — это блок 8x8 изображения /(х,у), Н — матрица преобразования DCT,
которая строится командой dctmtx(8), a T — результат применения DCT к F.
Здесь верхний индекс Т обозначает операцию транспонирования. При отсутствии
квантования обратное преобразование DCT от Т вычисляется по формуле
F = НТТН.
Эта формула особенно эффективна при обработке малых квадратных изображе-
изображений (подобно DCT 8x8 в JPEG). Таким образом, команда
у = blkproc(x, [8 8], >Р1*х*Р2\ h, h')
вычисляет преобразование DCT изображения х по блокам 8x8 с использованием
матрицы преобразования h и транспонированной матрицы hJ в качестве пара-
параметров Р1 и Р2, которые являются множителями в формуле матричного произ-
произведения DCT Р1*х*Р2, играющего роль функционального параметра FUN.
Аналогичная поблочная обработка и преобразование на основе матричных
произведений (см. рис. 8.11, б)) применяются в процессе декодирования изобра-
изображения, сжатого функцией im2jpeg. Приведенная ниже функция jpeg2im выпол-
выполняет всю необходимую последовательность обратных операций (за исключением
квантования). Она использует общую функцию
А = col2im(B, [M N], [MM NN], 'distinct')
для воссоздания двумерного изображения из столбцов матрицы В, где каждый
столбец по 64 элемента является блоком 8x8 реконструируемого изображения.
Параметры А, В, [М N] и 'distinct' были определены при описании функции
im2col, а массив [MM NN] обозначает размеры выходного изображения А.
function х = jpeg2im(y)
7eJPEG2IM Decodes an IM2JPEG compressed image.
e/e X = JPEG2IM(Y) decodes compressed image Y, generating
e/e reconstructed approximation X. Y is a structure generated by
У. IM2JPEG.
У.
°/, See also IM2JPEG.
error(nargchkCl, 1, nargin)); °/e Check input arguments
m = [16 11 10 16 24 40 51 61 % JPEG normalizing array
12 12 14 19 26 58 60 55 e/e and zig-zag reordering
14 13 16 24 40 57 69 56 e/e pattern.
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
1Для вычисления DCT блока f размерами 8x8 с помощью матричной операции h*f*h', следует
взять h - dctmtx(8).
8.5. Стандарты сжатия JPEG
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99];
order = [1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 .
41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 .
43 36 29 22 15 8 16 23 30 37 44 51 58 59 52
45 38 31 24 32 39 46 53 60 61 54 47 40 48 55
62 63 56 64];
rev = order;
for к = 1:length(order)
rev(k) = find(order == k);
end
m = double(y.quality) / 100
xb = double(y.numblocks);
sz = double(y.size);
xn = szB);
xm = sz(l);
x = huff2mat(y.huffman);
eob = max(x(:)) ;
z = zerosF4, xb); к = 1;
Compute inverse ordering
for
j = l:xb
for i =
if x(k)
к = к
else
1:64
== eob
+ 1; break;
* m; % Get encoding quality.
°/o Get x blocks.
% Get x columns.
% Get x rows.
% Huffman decode.
% Get end-of-block symbol
% Form block columns by copying
% successive values from x into
°/0 columns of z, while changing
% to the next column whenever
% an EOB symbol is found.
= x(k);
к =
end
end
end
z = z(rev,
к + 1
:)
x = col2im(z, [8 8], [xm xn], 'distinct'):
x = blkproc(x, [8 8],
t = dctmtx(8);
x = blkproc(x, [8 8],
x = uint8(x + 128);
Jx .* PI', m);
'PI * x * P2', t', t);
°/o Restore order
% Form matrix blocks
°/e Denormalize DCT
°/o Get 8x8 DCT matrix
°/o Compute block DCT-1
°/e Level shift
Пример 8.8. Сжатие JPEG.
На рис. 8.13, а) и б), приведены два кодированные и декодированные изобра-
изображения JPEG, которые являются приближениями одного и того же исходного
черно-белого изображения на рис. 8.4, а). Первый результат, имеющий коэффи-
коэффициент сжатия примерно 18 к 1, получен прямым использованием стандартной
нормирующей матрицы на рис. 8.12, а). Второе изображение, имеющее коэффи-
коэффициент сжатия 42 к 1, построено при умножении нормирующей матрицы на 4, что
соответствует более грубому квантованию.
340 Глава 8. Сжатие изображений
б)
Рис. 8.13. Левая колонка:
приближение рис. 8.4, а) с ис-
использованием DCT и нормиру-
нормирующей матрицы рис. 8.12, а).
Правая колонка: аналогичные
результаты с нормирующей мат-
матрицей, увеличенной в 4 раза
в)
г)
д)
е)
Разности между исходным изображением рис. 8.4, а) и восстановленными изоб-
изображениями рис. 8.13, а) и б) построены, соответственно, на рис. 8.13, в) и г).
Тоны обоих изображений были усилены для лучшей визуализации имеющихся
отклонений. Соответствующие средние ошибки RMS равны 2.5 и 4.4 уровней
яркости. Влияние этих ошибок на качество изображений видно более отчетли-
отчетливо на увеличенных участках изображений, приведенных на рис. 8.13, д) и е).
Эти изображения позволяют лучше оценить тонкие различия между обоими вос-
восстановленными изображениями [исходное увеличенное изображение имеется на
рис. 8.4, б)]. Обратите внимание на артефакты блочностщ присутствующие на
обоих увеличенных приближениях.
Изображения на рис. 8.13 и обсуждавшиеся только что численные результаты
получены с помощью следующей последовательности команд:
>> f = imreadCTracy.tif');
>> cl = im2jpeg(f);
>> f I = jpeg2im(cl) ;
8.5. Стандарты сжатия JPEG
» imratio(f, cl)
ans =
18.2450
>> compare(f, fl, 3)
ans =
2.4675
>> c4 = im2jpeg(f, 4) ;
>> f4 = jpeg2im(c4) ;
>> imratio(f, c4)
ans =
41.7826
>> compare(f, f4, 3)
ans =
4.4184
Эти результаты отличаются от тех, которые получаются при сжатии насто-
настоящим стандартом JPEG, поскольку наша программа im2jpeg лишь моделирует
процесс кодирования Хаффмана, заложенный в стандарт JPEG. Имеется два
принципиальных отличия, заслуживающих внимания:
A) в стандарте все серии нулевых коэффициентов кодируются по Хаффману,
а в im2jpeg кодируется лишь завершающая серия нулей каждого блока;
B) кодер и декодер стандарта используют (по умолчанию) предписанный код
Хаффмана, в то время как im2jpeg получает информацию, необходимую
для реконструкции таблицы кодовых слов из самого изображения.
Если использовать полный стандарт JPEG, то коэффициент сжатия повысится
еще примерно в два раза. ?
8.5.2. JPEG 2000
Как и первоначальная реализация JPEG, рассмотренная в предыдущем парагра-
параграфе, алгоритм сжатия стандарта JPEG 2000 основан на идее, что коэффициенты
преобразования, которое декоррелирует пикселы изображения, можно кодиро-
кодировать более эффективно, чем сами исходные пикселы. Если базисные функции
преобразования — вейвлеты в случае JPEG 2000 — пакуют самую важную часть
визуальной информации в относительно малое число коэффициентов, то остав-
оставшиеся коэффициенты можно грубо проквантовать или вовсе обнулить, что при-
приведет лишь к малым искажениям сжатого изображения.
Рис. 8.14 показывает упрощенную систему кодирования JPEG 2000 (в ней от-
отсутствует несколько опционных операций). Первый шаг процесса кодирования,
как и в исходном стандарте JPEG, состоит в сдвиге в нуль среднего уровня яр-
яркости пикселов, которое достигается вычитанием из всех пикселов числа 2т~1,
где 2т — общее число возможных уровней яркости. Затем вычисляется одно-
одномерное дискретное вейвлетное преобразование строк и столбцов изображения.
При сжатии без потерь используется биортогональное вейвлетное преобразова-
Глава 8. Сжатие изображений
ние 5-32. В приложениях, которые допускают потерю информации, используется
вейвлетное преобразование 9-7 (см. функцию wavef ilter в гл. 7). В обоих слу-
случаях первоначальным результатом декомпозиции изображения являются четыре
поддиапазона — одно низкочастотное приближение и три частные характеристи-
характеристики (детали) по горизонтали, вертикали и диагонали.
а' Входное щ
изображение
Вейвлет-
преобразо-
вание
Квантователь
Кодер
символов
f Сжатое
изображение
б)
Сжатое
изображение"
Декодер
символов
Denormalizer
Обратное вейвлет-
преобразование
ь Восстановленное
изображение
Рис. 8.14. Блок-схема JPEG 2000: а) кодер и б) декодер
Повторяя процесс декомпозиции Nl раз
с последующими итерациями, применяемыми
к коэффициентам приближения предыдущей
декомпозиции, строится вейвлетное преобра-
преобразование масштаба Nl- Пространственное раз-
разрешение соседних масштабов различается в
два раза, причем самый крупный масштаб об-
образует наиболее точное приближение исход-
исходного изображения. Как можно предположить
из рис. 8.15, на котором приведена стандарт-
стандартная схема обозначений для случая масштаба
Nl = 2, преобразование масштаба Nl обще-
общего вида состоит из 3Nl + 1 поддиапазона, ко-
коэффициенты которых обозначаются индекси-
индексированной буквой аъ, где Ъ = NlLL, NlHL,
NlLH, NlLL, ..., ltf L, 1L#, 1ЯЯ. Стандарт
не ограничивает число вычисляемых масштабов.
После того, как вейвлетное преобразование
масштаба Nl вычислено, общее число коэффи-
коэффициентов преобразования равно числу отсчетов
исходного изображения, но главная визуальная информация сконцентрирована
только в небольшом числе коэффициентов. Для уменьшения числа битов, требу-
требуемых для их представления, коэффициент аъ(и,у) поддиапазона Ь квантуется на
величину дь(и,у) по формуле
qb(u,v) = sign(db(u,v)) • floor
Рис. 8.15. Схема обозначений для ко-
коэффициентов двухмасштабного вейв-
летного преобразования JPEG 2000 и
число дополнительных битов анализа
(в черных кружочках)
где sign( •) — это знак числа, floor[ • ] — целая часть числа (подобно стандартным
2 В обозначении вейвлетного преобразования а — Ъ число а означает количество коэффициентов
низкочастотного, а Ь — высокочастотного фильтров анализа.
8.5. Стандарты сжатия JPEG
функциям sign3 и floor в MATLAB). Шаг квантования Д& задается выражением
АЬ = 2*-
Здесь Яь — номинальный динамический диапазон поддиапазона 6, а въ и //& —
число битов, отводимых под величины порядка и мантиссы его коэффициентов.
Номинальный динамический диапазон b равен сумме числа битов, используемых
для представления исходного изображения, и числа дополнительных битов ана-
анализа поддиапазона Ь. Числа дополнительных битов анализа заключены в черные
кружочки на рис. 8.15. Например, для поддиапазона Ь = 1НН отводится 2 до-
дополнительных бита анализа.
Для сжатия без потерь используются следующие значения параметров: \1ъ = О,
Rb = ?ъ, Аб = 1- Для необратимого сжатия в стандарте не предусмотрено никако-
никакого конкретного шага квантования. Вместо этого декодер должен знать число би-
битов порядка и мантиссы, которое или передается вместе с каждым поддиапазоном
(это называется явным квантованием), или же только с поддиапазоном NlLL
(неявное квантование). В последнем случае остальные поддиапазоны квантуют-
квантуются с использованием значений параметров, экстраполированных по параметрам
поддиапазона NlLL. Полагая, что во и /do — это известное число битов, отводи-
отводимых для поддиапазона NlLL, параметры для поддиапазона Ь вычисляются по
формулам
где nsdb обозначает число уровней декомпозиции от исходного изображения до
поддиапазона Ь. Финальным шагом процесса сжатия является кодирование кван-
квантованных коэффициентов с помощью метода арифметического кодирования на
основе битовых плоскостей. Мы здесь не обсуждаем метод арифметического ко-
кодирования, который, подобно схеме Хаффмана, представляет собой эффектив-
эффективный вариант кодирования кодами переменной длины, разработанный для сокра-
сокращения кодовой избыточности.
Приводимая далее функция im2 j peg2k моделирует процесс кодирования JPEG 2000
на рис. 8.14, а) за исключением этапа арифметического символьного кодирова-
кодирования. Как видно из текста этой функции, вместо этого для простоты используется
кодирование Хаффмана, расширенное кодированием длин нулевых серий.
function у = im2jpeg2k(x, n, q)
°/0IM2JPEG2K Compresses ал image using a JPEG 2000 approximation.
У, Y = IM2JPEG2KU, N, Q) compresses image X using an N-scale JPEG
°/o 2K wavelet transform, implicit or explicit coefficient
°/o quantization, and Huffman symbol coding augmented by zero
°/o run-length coding. If quantization vector Q contains two
% elements, they are assumed to be implicit quantization
°/o parameters; else, it is assumed to contain explicit subband step
% sizes. Y is an encoding structure containing Huffman-encoded
% data and additional parameters needed by JPEG2K2IM for decoding.
3Для любого числа х функция sign(x) возвращает 1, если х больше нуля, 0, если оно равно
нулю и -1, если меньше нуля.
s,
s,
s,
k,
k,
k,
waveсору(
waveсору(
waveсору(
'h',
'V',
'd',
с,
с,
с,
s,
s,
s,
к) ,
к) ,
к) ,
( q(qi)]
1 q(qi н
1 q(qi H
>;
•¦ D);
ь 2));
Глава 8. Сжатие изображений
у
7,
У. See also JPEG2K2IM.
global RUNS
error(nargchkC, 3, nargin)); 70 Check input arguments
if ndims(x) ~= 2 | ~isreal(x) | ~isnumeric(x) | ~isa(x, 'uint8')
error('The input must be a UINT8 image.');
end
if length(q) ~= 2 & length(q) ~= 3 * n + 1
error('The quantization step size vector is bad.');
end
7o Level shift the input and compute its wavelet transform,
x = double(x) - 128;
[c, s] = wavefast(x, n, 'jpeg9.7');
% Quantize the wavelet coefficients,
q = stepsize(n, q);
sgn = sign(c); sgn(find(sgn == 0)) = 1; с = abs(c);
for к = l:n
qi = 3 * к - 2;
с = wavepaste('h', с,
с = wavepaste('v', с,
с = wavepasteCd', с,
end
с = wavepasteCa', с, s, к, wavecopyCa', с, s, к) / q(qi + 3));
с = floor(c); с = с .* sgn;
°/o Run-length code zero runs of more than 10. Begin by creating
°/e a special code for 0 runs ('zrc') and end-of-code ('eoc') and
% making a run-length table.
zrc = min(c(:)) - 1; eoc = zrc - 1; RUNS = [65535];
°/o Find the run transition points: 'plus' contains the index of the
% start of a zero run; the corresponding 'minus' is its end + 1.
z = с == 0; z = z - [0 z(l:end - 1)];
plus = find(z == 1); minus = find(z == -1);
У, Remove any terminating zero run from 'c'.
if length(plus) ~= length(minus)
с (plus (end) : end) = [] ; с = [с eoc];
end
°/o Remove all other zero runs (based on 'plus' and 'minus') from 'c'
for i = length(minus):-1:1
run = minus(i) - plus(i);
if run > 10
ovrflo = floor(run / 65535); run = run - ovrflo * 65535;
с = [c(l:plus(i) - 1) repmat([zrc 1], 1, ovrflo) zrc ...
runcode(run) с(minus(i):end)];
end
end
°/0 Huffman encode and add misc. information for decoding.
8.5. Стандарты сжатия JPEG
у.runs
У-s
y.zrc
y-q
У.П
= uintl6(RUNS);
= uintl6(s(:));
= uintl6(-zrc);
= uintl6A00 * q
= uintl6(n);
y.huffman = mat2huff(c);
I %
function у = runcode(x)
У, Find a zero run in the run-length table. If not found, create a
°/e new entry in the table. Return the index of the run.
global RUNS
у = find(RUNS == x);
if length(y) ~= 1
RUNS = [RUNS; x] ;
у = length(RUNS);
end
I l
function q = stepsize(n, p)
У, Create a subband quantization array of step sizes ordered by
У, decomposition (first to last) and subband (horizontal, vertical,
Ув diagonal, and for final decomposition the approximation subband).
if length(p) == 2 % Implicit Quantization
q« П;
qn = 2 ~(8 - pB) + n) * A + p(l) / 2 ~11);
for к = 1:n
qk = 2 ~-k * qn;
q = [q B * qk) B * qk) D * qk)] ;
end
q = [q qk] ;
else % Explicit Quantization
q = p;
end
q = round(q * 100) / 100; °/0 Round to l/100th place
if anyA00 * q > 65535)
error('The quantizing steps are not UINT16 representable.');
end
if any(q == 0)
error('A quantizing step of 0 is not allowed.5);
end
Декодер JPEG 2000 просто обращает описанные выше операции. После деко-
декодирования арифметических кодов коэффициентов совершается восстановление
выбранного пользователем числа поддиапазонов изображения. Хотя кодер может
иметь Мь арифметически закодированных битовых плоскостей для конкретно-
конкретного поддиапазона, пользователь — в силу вложенной природы кодового потока —
Глава 8. Сжатие изображений
может выбрать для декодирования только Nb битовых плоскостей. Это равня-
равняется квантованию коэффициентов с использованием размера шага 2Mb~Nb • Ab.
Все недекодируемые биты приравниваются нулю, и полученные коэффициенты,
обозначаемые qb(u,v), восстанавливаются по формулам
Nb^).Ab при qb(u,v)> О,
Nb^).Ab npnqb(u,v)>0,
0 при qb(u,v) = 0,
где Rqb(u,v) обозначает восстановленные значения коэффициентов, a Nb(u,v) —
число декодируемых битовых плоскостей для qb(u,v). Затем полученные коэффи-
коэффициенты подвергаются обратному преобразованию, а к результату прибавляется
величина 2П~1, где п — число битов яркости пикселов. Функция jpeg2k2im мо-
моделирует весь это процесс, обращая результат сжатия под действием функции
im2jpeg2k.
function x = jpeg2k2im(y)
°/0JPEG2K2IM Decodes an IM2JPEG2K compressed image.
% X = JPEG2K2IM(Y) decodes compressed image Y, reconstructing an
°/0 approximation of the original image X. Y is an encoding
°/0 structure returned by IM2JPEG2K.
°/o
°/, See also IM2JPEG2K.
error (nargchkd, 1, nargin)); °/0 Check input arguments
% Get decoding parameters: scale, quantization vector, run-length
°/o table size, zero run code, end-of-data code, wavelet bookkeeping
% array, and run-length table.
n = double(y.n);
q = double(y.q) / 100;
runs = double(y.runs);
rlen = length(runs);
zrc = -double(y.zrc);
eoc = zrc - 1;
s = double(y.s);
s = reshape(s, n + 2, 2);
% Compute the size of the wavelet transform.
cl = prod(s(l, :));
for i = 2:n + 1
cl = cl + 3 * prod(s(i, :));
end
% Perform Huffman decoding followed by zero run decoding,
r = huff2mat(y.huffman);
с = [] ; zi = find(r == zrc); i = 1;
for j = l:length(zi)
с = [с r(i:zi(j) - 1) zeros(l, runs(r(zi(j) + 1)))];
i = zi(j) + 2;
end
8.5. Стандарты сжатия JPEG
zi = find(r == eoc) ; °/e Undo terminating zero run
if length(zi) == 1 % or last non-zero run.
с = [с r(i:zi - 1)];
с = [с zeros(l, cl - length(c))];
else
с = [с r(i:end)];
end
°/o Denormalize the coefficients,
с = с + (с > 0) - (с < 0) ;
for к = l:n
qi = 3 * к - 2;
с = wavepasteOh', с, s, к, wavecopyOh', с, s, к) * q(qi));
с = wavepasteCv3, с, s, к, wavecopyCv', с, s, к) * q(qi + D);
с = wavepasteCd', с, s, к, wavecopyOd', с, s, к) * q(qi + 2));
end
с = wavepaste('a', c, s, k, wavecopy('a', c, s, k) * q(qi + 3));
°/e Compute the inverse wavelet transform and level shift,
x = waveback(c, s, Jjpeg9.7', n);
x = uint8(x + 128);
Принципиальное отличие системы JPEG 2000 на основе вейвлетов (см. рис. 8.14)
от системы JPEG на базе преобразования DCT (см. рис. 8.11) заключается в
отсутствии этапа разделения изображения на маленькие подизображения. По-
Поскольку вейвлетные преобразования одновременно являются вычислительно эф-
эффективными и локальными по своей природе (т. е. их базисные функции имеют
конечную длительность), нет необходимости делить сжимаемое изображение на
подблоки. Как видно в следующем примере, отсутствие стадии деления устраняет
артефакты блочности, которые являются неотъемлемыми спутниками приближе-
приближения изображений на базе преобразования DCT при высокой степени сжатия.
Пример 8.9. Сжатие JPEG 2000.
На рис. 8.16 построены два приближения черно-белого изображения на рис. 8.4, а).
Рис. 8.16, а) является реконструкцией кодирования, которое сжало исходное изоб-
изображение в соотношении 42 : 1, а рис. 8.16, б) получен после сжатия 88 : 1. Оба ре-
результата получены при преобразовании пятого масштаба и с параметрами /хо = 8
и во = 8.5 и 7 соответственно. Поскольку наша функция im2jpeg2k лишь модели-
моделирует настоящее арифметическое кодирование по битовым плоскостям JPEG 2000,
коэффициент сжатия при использовании настоящего стандарта JPEG 2000 будет
отличаться от приведенных выше значений. На самом деле, степень сжатия воз-
возрастет почти в 2 раза.
Раз коэффициент сжатия 42 : 1, отвечающий левой колонке изображений
на рис. 8.16, практически совпадает с коэффициентом сжатия, достигнутым для
изображений в правой колонке на рис. 6.13 (пример 8.8), то рис. 8.16, а), в) и
д) можно сопоставить — качественно и количественно — с результатами сжа-
сжатия JPEG на рис. 8.14, б), г) и е). Визуальное сравнение обнаруживает заметное
снижение ошибок на изображениях JPEG 2000. На самом деле, ошибка RMS для
JPEG 2000 [рис. 8.16, а)] равна 3.7 уровня яркости, в отличие от 4.4 уровней для
Глава 8. Сжатие изображений
соответствующего изображения JPEG [рис. 8.13, б)]. Помимо уменьшения ошиб-
ошибки реконструкции, кодирование на базе JPEG 2000 значительно улучшает каче-
качество изображения (в субъективном смысле). Это становится особенно очевидным
при сравнении увеличенных фрагментов на рис. 8.16, д) и 8.13, е). Обратите вни-
внимание на то, что на рис. 8.16, д) полностью отсутствуют артефакты блочности,
которые отчетливо видны на рис. 8.13, е).
а)
б)
Рис. 8.16. Левая колонка:
приближение JPEG 2000 для
рис. 8.4, а) с использовани-
использованием 5 масштабов и при до =
= 8 и ео = 8.5. Правая ко-
колонка: аналогичные резуль-
результаты с ео = 7
г)
е)
Когда степень сжатия повышается до значения 88 : 1 [см. рис. 8.16, б)\, наблю-
наблюдается некоторая потеря текстуры на одежде девушки, а также происходит раз-
размытие ее глаз. Оба эти эффекта можно обнаружить на рис. 8.16, б) и е). Ошибка
RMS для этих реконструкций равна 5.9 уровней яркости. Результаты на рис. 8.16
были получены с использованием следующей последовательности команд:
>> f = imread( 'Tracy.tif') ;
» cl = im2jpeg2k(f, 5, [8 8.5]);
Выводы 349
>> fl = jpeg2k2im(cl);
>> rmsl = compare(f, fl)
rmsl =
3.6931
>> crl = imratio(f, cl)
crl =
42.1589
>> c2 = im2jpeg2k(f, 5, [8 7]);
>> f 2 = jpeg2k2im(c2) ;
>> rms2 = compare (f, f2)
rms2 =
5.9172
>> cr2 = imratio(f, c2)
cr2 =
87.7323
Обратите внимание на использование неявного квантования при задании третье-
третьего аргумента функции im2jpeg2k в виде вектора из двух компонент. Если же
число компонент этого вектора больше 2, функция подразумевает явное кванто-
квантование, и размеры квантования всех 37Vl + 1 шагов должны быть заданы в этом
векторном аргументе (здесь Nl обозначает число требуемых масштабов). Все эти
числа необходимо упорядочить по уровням декомпозиции (первый, второй, тре-
третий, ...) и по типу поддиапазона (горизонтальный, вертикальный, диагональный
и приближенный). Например,
» сЗ = im2jpeg2k(f, 1, [1111]);
вычисляет одномасштабное преобразование с явным квантованием, а все шаги
квантования всех поддиапазонов равны А\ = 1. Значит, все коэффициенты пре-
преобразования округляются до ближайшего целого. Это случай минимальной ошиб-
ошибки при реализации im2jpeg2k. В этом случае ошибка RMS и коэффициент сжатия
равны
>> f3 = jpeg2k2im(c3) ;
>> rms3 = compare(f, f3)
rms3 =
1.1234
>> cr3 = imratio(f, c3)
cr3 =
1.6350 ?
Выводы
Материал данной главы дает начальное представление об основах сжатия циф-
цифровых изображений, которое достигается путем сокращения и удаления кодовой,
межпиксельной и визуальной избыточности. В ней также разработаны функции
Глава 8. Сжатие изображений
MATLAB, которые позволяют бороться со всеми типами избыточности и, тем са-
самым, расширяют возможности пакета IPT по обработке изображений. Наконец,
дается обзор популярных стандартов сжатия изображений JPEG и JPEG 2000.
За дополнительной информацией по методам сокращения избыточности изобра-
изображений, которые здесь не рассматривались, а также по стандартам сжатия специ-
специфических изображений (например, двоичных изображений) советуем обратиться
к гл. 8 книги [Gonzalez, Woods, 2002].
ГЛАВА 9
МОРФОЛОГИЧЕСКАЯ
ОБРАБОТКА
ИЗОБРАЖЕНИЙ
Введение
Словом морфология принято называть область биологии, которая изучает форму
и строение животных и растений. Мы будем использовать этот термин в контек-
контексте математической морфологии, которая является инструментом для извле-
извлечения определенных компонентов изображения, полезных для представления и
описания форм объектов, например, их границ, остовов или выпуклых оболо-
оболочек. Мы будем также рассматривать морфологические методы, которые приме-
применяются на этапах предварительной и заключительной обработки изображений,
например, морфологическая фильтрация, утончение и усечение.
В § 9.1 определяется базовый набор операций над множествами, вводятся дво-
двоичные изображения, обсуждаются двоичные множества и логические операции
над ними. В § 9.2 вводятся две фундаментальные морфологические операции:
дилатация и эрозия, которые определяются с помощью операций объединения и
пересечения изображения и некоторой смещенной формы (структурообразующе-
(структурообразующего элемента). В § 9.3 понятия дилатации и эрозии используются для построения
более сложных морфологических операций. В § 9.4 вводятся методы маркировки
связных компонентов изображения. Эти действия являются весьма важным ша-
шагом при распознавании и извлечении объектов изображения для их дальнейшего
анализа.
В § 9.5 рассматривается морфологическая реконструкция, которая представ-
представляет собой вид морфологического преобразования, в котором участвуют два
изображения, но не обязательно это изображение и некоторый структурообра-
структурообразующий элемент, что является предметом изучения предыдущих параграфов.
В § 9.6 морфологические концепции обобщаются на полутоновые (монохромные)
изображения путем замены операций объединения и пересечения на операции
взятия максимума и минимума. Большинство двоичных морфологических опе-
операций имеет естественные расширения для их применения к полутоновым изоб-
изображениям. Однако имеются операции, которые применяются исключительно для
обработки полутоновых изображений, например, пиковая фильтрация.
С этой главы начинается переход от методов, сконцентрированных исклю-
исключительно на обработке изображений (т. е. когда и входом, и выходом процесса
являются изображения), к методам анализа изображений, когда выходом про-
процессов уже являются описательные атрибуты, которые извлекаются из содер-
содержания изображений. В этом смысле морфология служит краеугольным камнем
математических инструментов, которые используются при извлечении «смысла»
352 Глава 9. Морфологическая обработка изображений
изображения. Развитие этих и применение других подходов при решении подоб-
подобных задач является предметом оставшихся глав книги.
9.1. Предварительные сведения
В этом параграфе вводятся некоторые основные понятия теории множеств, а
также обсуждаются способы реализации в среде MATLAB логических операций
над двоичными изображениями.
9.1.1. Базовые понятия теории множеств
Пусть Z обозначает множество целых чисел. Процесс дискретизации при фор-
формировании цифровых изображений можно представлять себе в виде разделения
плоскости ху координатной сеткой на ячейки, а координаты центров этих ячеек
являются парами декартова произведения1 Z2. Пользуясь терминологией теории
множеств, мы скажем, что функция f(x,y) называется цифровым изображени-
изображением, если (х, у) — это целые числа из Z2, а / — отображение, которое сопоставля-
сопоставляет значение яркости (которое принадлежит множеству вещественных чисел R)
каждой паре координат (х, у). Если значения яркости из R являются целыми чис-
числами (как это обычно предполагается в нашей книге), то цифровое изображение
становится двумерной функцией, координатами и амплитудами (т. е. значениями
яркости), которой служат целые числа.
Пусть А — некоторое множество из Z2, элементами которого являются коор-
координаты пикселов (х,у). Если элемент w = (х,у) принадлежит А, то это принято
обозначать символической записью
w G А.
В противном случае, если w не принадлежит Л, то принято писать
w ? А.
Множество пикселов ??, удовлетворяющее некоторому условию, представляется
в виде
В = {w | условие}.
Например, множество всех пикселов, не принадлежащих множеству А, которое
принято обозначать Ас, задается формулой
Ас = {w | w i A}.
Это множество называется дополнением множества А.
Объединение двух множеств А и В, которое обозначается
С = AUB,
1 Декартовым произведением множества Z на себя называется множество всех упорядоченных
пар (zi,Zj), где Zi и Zj — любые целые числа. Его принято обозначать Z2.
9.1. Предварительные сведения
есть по определению множество всех пикселов, которые принадлежат или мно-
множеству А, или множеству В, или одновременно обоим множествам. Аналогично,
пересечение двух множеств А и В состоит из всех элементов, которые одновре-
одновременно принадлежат и множеству А, и множеству Б, и обозначается
С = АГ\В.
Разность двух множеств А и В обозначается А \ В. Оно состоит из пикселов,
которые принадлежат А, но не принадлежат В, т. е.
А \ В = {w | w G A, w ? В}.
Рис. 9.1 иллюстрирует введенные выше операции над множествами, где резуль-
результат каждой операции обозначен темным цветом.
Рис. 9.1. а) Два множества
А и В. б) Объединение мно-
множеств А и В. в) Пересечение
множеств А и В. г) Дополне-
Дополнение множества А. д) Разность
множеств А и В.
б)
Вместе с введенными базовыми понятиями нам понадобятся еще две опера-
операции, широко используемые при морфологическом анализе изображений и при-
применяемые ко множествам, элементами которых служат координаты пикселов.
Центральным отражением множества В называется множество В, определяе-
определяемое по формуле
В = {w\w = -b, be В}.
Параллельный перенос (или сдвиг) множества А в точку z = (z\, z^) обозначается
(A)z и задается формулой
(A)z = {с\ с = а + г, а е А}.
Рис. 9.2 иллюстрирует эти две операции применительно к множествам из рис. 9.1.
Жирные точки обозначают начало координат для каждого множества.
б)
Рис. 9.2. а) Сдвиг множества А в точку z.
б) Центральное отражение множества В. (Ис-
(Использованы множества А и В из рис. 9.1)
Глава 9. Морфологическая обработка изображений
9.1.2. Двоичные изображения, множества
и логические операции
Язык и теория математической морфологии позволяют взглянуть на двоичные
изображения как бы с двух сторон. С одной стороны, двоичное изображение (как
часто в этой книге) можно себе представлять в виде функции с двумя возмож-
возможными значениями координат х и у. Теория морфологии рассматривает двоичное
изображение в виде множества его пикселов переднего плана (со значениями 1),
которое лежит в пространстве Z2. Введенные выше операции над множествами
типа объединение и пересечение можно напрямую применять к двоичным изоб-
изображениям. Например, если А и В — двоичные изображения, то С = A U В —
также двоичное изображение, причем пикселы на изображении С являются пик-
пикселами переднего плана, если соответствующие пикселы на А, на В или на обоих
этих изображениях принадлежат переднему плану. При первом, функциональ-
функциональном подходе, изображение С задается формулой
r( v _ J 1,если А(х,у) = 1, или В(х,у) = 1, или оба равны 1;
V ? У) — ^q B ПрОТИВНОМ случае.
А, с точки зрения теории множеств, изображение С определяется выражением
С = {(х,у) | (ж,у) G А, или (ж,у) е В, или (ж,у) <Е {А и В)}.
Операции над множествами, приведенные на рис. 9.1, можно совершать над дво-
двоичными изображениями с помощью следующих логических операций MATLAB:
OR (|) (логическое сложение), AND (&) (логическое умножение) и NOT (~) (от-
(отрицание), как показано в табл. 9.1.
Таблица 9.1. Использование логических операций MATLAB для совершения операций
над двоичными изображениями
Операции
АпВ
лив
Лс
А\В
Выражение MATLAB
для двоичных изображений
А & В
А | В
~А
А & ~В
Имя
AND
OR
NOT
DIFFERENCE
В качестве простой иллюстрации рассмотрим рис. 9.3, на котором показа-
показаны результаты применения ряда логических операций к двум двоичным изоб-
изображениям элементов текста. (Мы следуем правилу IPT, по которому пикселы
переднего плана (со значением 1) отображаются белым цветом.) Изображение
на рис. 9.3, г) является объединением изображений «UTK» и «GT»; на нем при-
присутствуют пикселы переднего плана обоих изображений. Наоборот, пересечение
этих двух изображений, показанное на рис. 9.3, д), состоит из пикселов, которые
принадлежат перекрытию букв «UTK» и «GT». Наконец, разность изображений,
приведенная на рис. 9.3, ej, показывает части букв «UTK», из которых удалены
пикселы букв «GT».
9.2. Дилатация и эрозия 355
итк
UGTK
итк
и ж
Рис. 9.3. а) Двоичное изображение А. б) Двоичное изображение В. в) Дополнение ~А. г)
Объединение А | В. д) Пересечение А & В. е) Разность множеств А & ~В
9.2. Дилатация и эрозия
Операции дилатации и эрозии имеют основополагающее значение при морфоло-
морфологической обработке изображений. Многие алгоритмы, рассматриваемые в этой
главе, построены на этих операциях, которые далее определяются, иллюстриру-
иллюстрируются и обсуждаются.
9.2.1. Дилатация
Операция дилатации «наращивает» или «утолщает» объекты на двоичных изоб-
изображениях. Способ и степень этого утолщения контролируется некоторой формой,
которая называется структурообразующим элементом. Рис. 9.4 иллюстрирует
работу дилатации. На рис. 9.4, а) задано простое двоичное изображение прямо-
прямоугольника. На рис. 9.4, б) показан структурообразующий элемент, состоящий из
пяти пикселов, расположенных по диагонали. С точки зрения вычислений, струк-
структурообразующий элемент представляется в виде матрицы из нулей и единиц, но
часто бывает удобно показывать только единицы, как изображено на рисунке.
Кроме того, центр структурообразующего элемента должен быть ясно выделен.
На рис. 9.4, б) его центр заключен в квадратик. Рис. 9.4, в) графически отобра-
отображает операцию дилатации в виде процесса обноса центра структурообразующего
элемента по области изображения и отметки тех положений центра, когда со-
356 Глава 9. Морфологическая обработка изображений
ответствующий элемент перекрывает некоторые пикселы переднего плана изоб-
изображения (со значением 1). Полученное изображение показано на рис. 9.4, г), на
котором значения 1 присвоены тем пикселам, которые соответствуют положени-
положениям центра структурообразующих элементов, перекрывающих пикселы переднего
плана исходного изображения.
а)
е)
О О О О О О О О О О О 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
О О О О О О О О 0 0 0 0 0 0 0 0 О
о о о о о о о о о о о о о оооо
О О О О О О О О 0 0 0 0 0 0 0 0 0
б)
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
О 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 О
О О О О О О О 0 0 0 0 0 0 0 О О О
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
о о о о о о о о о о о о о о о о о
0 0 0 0 0 0 0 0 О О 0 0 0 0 0 0 О
Структурообразующие элементы, перенесенные
в эти положения, не перекрывают ни одного единичного
пиксела исходного изображения.
Рис. 9.4. Иллюстрация при-
применения дилатации. а) Ис-
Исходное изображение с прямо-
прямоугольником, б) Структурооб-
Структурообразующий элемент из пяти пик-
пикселов по диагонали. Его центр
обведен квадратиком, в) Струк-
Структурообразующий элемент раз-
разнесен по нескольким положе-
положениям на изображении, г) Об-
Обработанное изображение
>_ При переносе центра элемента
в позиции "D", он перекрывает
единичные пикселы исходного
изображения
г)
о о о о о о о о о о о о о о о о о
о о о о о о о о о о о о о о о о о
о о о о о о о о о о о о о о о о о
О 0 0 0 0 0 0 1 1
О 0 0 0 0 0 111
0 0 0 0 0 1111
О 0 0 0 11111
0 0 0 111111
0 0 0 111111
О 0 0 111111
11110 0 О
11110 О О
11110 0 0
1110 О U О
110 0 О О О
1 О О О О О О
о о о о о о о
о о о о о о оооо о о о о о о о
о о о о о о о о о о о о о о о о о
о о о о о о о о о о о о о о о о о
Дилатацию можно строго определить математически в терминах операций
над множествами. Дилатация множества А по множеству В (или относительно
множества В) обозначается А 0 В и определяется по формуле
9.2. Дилатация и эрозия
где 0 обозначает пустое множество, а В — это структурообразующий элемент.
Другими словами, дилатация А относительно В является множеством, которое
состоит из всех положений центров
структурообразующего элемента, ко- а) л б)
торый, будучи центрально отражен-
отраженным и сдвинутым, имеет частичное
перекрытие с множеством А. Заме-
тим, что процесс сдвига структуре»- \
образующего элемента похож: на ме-
ханизм построения свертки, обсуж-
обсуждавшийся В главе 3. На рис. 9.4 не Рис. 9.5. Центральное отражение структурооб-
ВИДНО действие центрального отра- Разующего элемента, а) Несимметричный струк-
,-, турообразующий элемент, б) Структурообразу-
жения элемента В, так как сам он ющий элеменТ; ^^„„„a относительно своего
центрально-симметричен. На рис. 9.5 центра
изображен нецентрально-симметрич-
нецентрально-симметричный структурообразующий элемент и его центральное отражение.
Операция дилатации является коммутативной, т. е. А 0 В = В 0 А. Однако
бывает удобно помещать на место первого операнда изображение, а на место
второго — структурообразующий элемент, который, обычно, существенно меньше
обрабатываемого изображения. Мы будем так их располагать и в дальнейшем.
Пример 9.1. Простое применение дилатации.
В пакете IPT операция дилатации реализуется функцией imdilate. Ее основная
форма вызова имеет вид
А2 = imdilate(А, В),
где А и А2 — это двоичные изображения, а В — матрица из нулей и единиц, которая
обозначает структурообразующий элемент. На рис. 9.6, а) дан пример двоичного
изображения, которое содержит текст с разорванными буквами. Мы хотим при-
применить дилатацию к этому изображению со структурообразующим элементом
0 1 О
1 \\\ 1 .
О 1 О
Следующая последовательность команд считывает изображение из файла, стро-
строит матрицу структурообразующего элемента, совершает дилатацию и показывает
результат.
>> А = imreadCbroken_text.tif');
>> В= [0 10; 1 11; 0 10];
>> А2 = imdilate(A, В);
>> imshow(A2)
На рис. 9.6, б) показано обработанное изображение. ?
Глава 9. Морфологическая обработка изображений
б)
Historically, certain computer
programs were written using
only two digits rather than
four to define the applicable
year. Accordingly, the
company's software may
recognize a date using 0"
as 1900 rather than the year
Рис. 9.6. Простой пример ди-
латации. а) Исходное изобра-
изображение, содержащее разорван-
разорванные символы, б) Изображение
после применения дилатации
9.2.2. Разложение структурообразующих элементов
Операция дилатации является ассоциативной, т. е. выполнено равенство
а е {в е с) = {А е в) е с.
Предположим, что структурообразующий элемент В можно представить в виде
дилатации двух других элементов В\ и В2\
В = В1®В2.
Тогда ЛфБ = Лф (В\ 0В2) = (А 0 В\) 0 Б2. Это означает, что дилатацию А по
В можно построить, выполнив сначала дилатацию AnoBi, а затем к результату
применить дилатацию по В2. Говорят, что В разложен на два структурообразу-
структурообразующих элемента В\ и В2.
Свойство ассоциативности весьма важно, потому что время вычисления дила-
дилатации пропорционально числу ненулевых пикселов структурообразующего эле-
элемента. Рассмотрим, например, дилатацию с матрицей 5x5, состоящую из одних
единиц:
1
1
1
1
1
1
1
1
1
1
1
1
ш
1
1
1
1
1
1
1
1
1
1
1
1
Этот структурообразующий элемент можно разложить на строку и столбец, со-
состоящие из пяти единиц:
1 1
1 1
Число элементов исходного структурообразующего элемента равно 25, а общее
число элементов разложения строка-столбец равно 10. Это означает, что если к
9.2. Дилатация и эрозия
некоторому изображению применить дилатацию по элементу-строке, а затем — по
элементу-столбцу, то вся процедура будет работать в 2.5 раза быстрее, чем дила-
дилатация по целому массиву 5x5. На практике ускорение вычислений будет несколь-
несколько меньшим, поскольку имеются некоторые дополнительные операции, которые
необходимо выполнять при каждой дилатации, а при использовании декомпози-
декомпозиции (разложения) требуется по крайней мере две дилатации. Однако выигрыш
по скорости при использовании этого приема все равно остается значительным.
9.2.3. Функция strel
В пакете IPT имеется функция strel, которая строит структурообразующие эле-
элементы различных форм и размеров. Ее синтаксис имеет вид
se = strel(shape, parameters),
где shape — это строка, обозначающая желаемую форму структурообразующего эле-
элемента, a parameters задают список параметров, которые уточняют информацию о
его форме, например, определяют его размер. Так, команда strel ('diamond', 5)
строит структурообразующий элемент в форме ромба, который занимает ±5 пик-
пикселов по горизонтали и вертикали. В табл. 9.2 перечислены различные формы,
которые может строить функция strel.
Кроме того, для упрощения построения некоторых стандартных структурооб-
структурообразующих элементов в функции strel предусмотрена возможность разложения
элементов там, где это допустимо. Функция imdelate автоматически использу-
использует информацию о разложении для ускорения процесса дилатации. В следующем
примере иллюстрируется выдача функцией strel информации, связанной с раз-
разложением структурообразующего элемента.
Пример 9.2. Иллюстрация разложения структурообразующего элемента с по-
помощью функции strel.
Рассмотрим еще раз процедуру построения структурообразующего элемента в
форме ромба с помощью strel:
>> se = strel('diamond', 5)
se =
Flat STREL object containing 61 neighbors.
Decomposition: 4 STREL objects containing a total of 17 neighbors
Neighborhood:
0
0
0
0
0
1
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
1
1
1
1
1
0
0
0
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
0
0
1
1
1
1
1
1
1
0
0
0
1
1
1
1
1
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
1
0
0
0
00001110000
00000100000
Глава 9. Морфологическая обработка изображений
Таблица 9.2. Различные синтаксические формы функции strel. (Слово плоский означа-
означает, что структурообразующий элемент имеет нулевую высоту. Эта величи-
величина осмыслена только для дилатации и эрозии полутоновых изображений.
См. § 9.6.1.)
Синтаксическая форма
Описание
se = strel('diamond', R)
se = strel('disk', R)
se = strel('line', LEN, DEG)
se = strel('octagon', R)
se = strel('pair', OFFSET)
se = strel('periodicline', P, V)
se = strel('rectangle', MN)
se = strel('square', W)
se = strel('arbitrary', NHOOD)
se = strel(NHOOD)
Строит плоский структурообразующий элемент в
форме ромба, где R обозначает расстояние от центра
структурообразующего элемента до крайней точки
ромба.
Строит плоский структурообразующий элемент в
форме круга с радиусом R. (Имеются дополнитель-
дополнительные параметры, которые описаны в справке по strel).
Строит плоский, линейный элемент, где LEN обозна-
обозначает его длину, a DEG — угол (в градусах) наклона
линии, измеренный против часовой стрелки от гори-
горизонтальной оси.
Строит плоский, шестиугольный элемент, где R обо-
обозначает расстояние от центра элемента до стороны
шестиугольника, измеренное вдоль горизонтальной
или вертикальной оси. Число R должно быть поло-
положительным и кратным 3.
Строит плоский структурообразующий элемент, со-
состоящий из двух точек. Первая точка находится в
центре, а вторая точка смещена от первой на вектор
OFFSET, который должен иметь две целые компонен-
компоненты.
Строит плоский элемент, состоящий из 2*Р + 1 то-
точек. V — это двумерный целочисленный вектор, в ко-
котором записаны смещения по строке и столбцу. Одна
точка элемента находится в его центре, а все осталь-
остальные имеют координаты 1*V, -1*V, 2*V, -2*V, ... , P*V
и -P*V.
Строит плоский элемент в форме прямоугольника,
где MN обозначает его размеры. MN — это двумерный
вектор с неотрицательными целыми компонентами.
Первый элемент MN обозначает число строк, а вто-
второй — число столбцов.
Строит квадратный структурообразующий элемент
ширины, где W — неотрицательное целое.
Строит элемент произвольной формы. NH00D — это
матрица из нулей и единиц, задающая его форму.
Вторая, более простая синтаксическая форма, выпол-
выполняет ту же операцию.
Видно, что strel не показывает обычную матрицу MATLAB. Вместо этого он
возвращает специальную величину, которая называется strel-объектом. В ко-
командном окне MATLAB отображается следующая информация: окрестность (мат-
(матрица из единиц, обозначающая в нашем случае форму ромба), число единичных
пикселов структурообразующего элементы (их здесь 61), число структурообра-
структурообразующих элементов в разложении (их 4) и общее число единичных пикселов всех
элементов разложения A7). Функцию get sequence можно применять для извле-
извлечения и проверки отдельных структурообразующих элементов этого разложения.
9.2. Дилатация и эрозия
» decomp = getsequence(se);
>> whos
Name Size Bytes Class
decomp 4x1 1716 strel object
se lxl 3309 strel object
Grand total is 495 elements using 5025 bytes
Функция whos сообщает, что переменные se и decomp обе являются strel-
объектами, а кроме того, decomp представляет собой четырехкомпонентный век-
вектор strel-объектов. Все четыре структурообразующих элемента разложения мож-
можно получить, индексируя переменную decomp:
>> decomp A)
ans =
Flat STREL object containing 5 neighbors.
Neighborhood:
0 10
111
0 10
>> decomp B)
ans =
Flat STREL object containing 4 neighbors.
Neighborhood:
0 10
10 1
0 10
>> decomp C)
ans =
Flat STREL object containing 4 neighbors.
Neighborhood:
0 0 10 0
0 0 0 0 0
10 0 0 1
0 0 0 0 0
0 0 10 0
>> decomp D)
ans =
Flat STREL object containing 4 neighbors.
Neighborhood:
0 10
10 1
0 10
Функция imdilate автоматически использует форму разложения структуро-
структурообразующего элемента, и при этом скорость вычисления возрастает примерно
в три раза по сравнению с прямым использованием элемента в неразложенной
форме (выигрыш по времени вычислений в « 61/17 раза). ?
Глава 9. Морфологическая обработка изображений
9.2.4. Эрозия
Операция эрозия «ужимает» или «утончает» объекты двоичных изображений.
Как и при дилатации, вид и размер эрозии определяется структурообразую-
структурообразующим элементом. Рис. 9.7 иллюстрирует процесс эрозии. Рис. 9.7, а) совпадает
с рис. 9.4, а). На рис. 9.4, б) приведен структурообразующий элемент — корот-
короткий вертикальный отрезок. Рис. 9.7, в) графически описывает эрозию как про-
процесс перемещения структурообразующего элемента по изображению и фиксации
положений его центра, в которых этот элемент целиком состоит из пикселов пе-
переднего плана изображения. Выходом операции эрозии служит изображение со
значениями 1 у тех пикселов, которые соответствуют положениям центра струк-
структурообразующих элементов, целиком состоящих из пикселов переднего плана
исходного изображения (т. е. этим сдвигам элементов не принадлежат пикселы
изображения со значением 0).
а)
б)
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
{)
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
?
1
в) В этом положении выход равен нулю,
так как структурообразующий элемент
перекрывает фоновые пикселы
Д.
г)
3;
С1
П(
ш
1
1
1
jec
ТУ
эль
яке
1
1
1
ь в
КТ)
юс
ел
J
1
1
1
ых
фО
тьь
ов
/
/
1
1
¦1
1
од
об]
ОС
1
1
1
pai
эаз
0С1
\
\
V
Г11
1 I
1
зен
ую
^ои
1
1,
щи
т и
та]
[й:
з4
кк
ше
)ОН
ак
ме
ОВ]
нт
ых
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Рис. 9.7. Иллюстрация применения эрозии, а) Исходное изображение с прямоугольником.
б) Структурообразующий элемент из трех пикселов по вертикали. Его центр об-
обведен квадратиком, в) Структурообразующий элемент разнесен по нескольким
положениям на изображении, г) Обработанное изображение
9.2. Дилатация и эрозия
Математическое определение операции эрозии похоже на определение дила-
тации. Эрозией множества А по В называется множество
AQB = {z\ {B)znAc = 0}.
Другими словами, эрозия А по Б состоит из тех и только тех координат пиксе-
пикселов, для которых сдвиг множества В в эту точку не пересекается с фоном изоб-
изображения А (напомним, что фон состоит из тех пикселов изображения, значения
которых равны 0).
Рис. 9.8. Иллюстрация эро-
эрозии, а) Эрозия с кругом ра-
радиуса 10. б) Эрозия с кругом
радиуса 5. в) Эрозия с кру-
кругом радиуса 20
Пример 9.3. Иллюстрация процесса эрозии.
Эрозия выполняется в IPT функцией imerode. Предположим, что нам необходи-
необходимо удалить тонкие провода с изображения на рис. 9.8, а), но с сохранением всех
остальных структур. Это можно сделать, выбрав достаточно малый структурооб-
структурообразующий элемент, чтобы он помещался целиком внутри центрального квадрата,
а также внутри толстых полосок у границ, и достаточно большим, чтобы он не
помещался внутри удаляемых проводков. Рассмотрим следующие команды:
>> А = imreadC'wirebond_mask.tif');
>> se = streK'disk' , 10);
>> А2 = imerode(A, se) ;
>> imshow(A2)
На рис. 9.8, б) видно, что эти команды успешно справились с задачей удаления
тонких проводов маски. На рис. 9.8, в) показано, что случится, если мы выберем
структурообразующий элемент слишком малым:
364 Глава 9. Морфологическая обработка изображений
» se = streH'disk' , 5);
>> A3 = imerode(A, se) ;
>> imshow(A3)
Некоторые провода остались на изображении. Рис. 9.8, г) показывает, что будет,
если выбрать слишком большой структурообразующий элемент:
>> А4 = imerode(A, strel( 'disk' , 20));
>> imshow(A4)
Удалены все провода, но одновременно исчезли толстые полоски возле границ. ?
9.3. Комбинирование дилатации и эрозии
В конкретных приложениях обработки изображений операции дилатация и эро-
эрозия часто используются совместно. Обычно изображения подвергаются серии
операций дилатации и/или эрозии с одним и тем лее, а иногда и с разными струк-
структурообразующими элементами. В этом параграфе рассматриваются три часто
используемые комбинации дилатации и эрозии: размыкание, замыкание и преоб-
преобразование успех/неудача. Кроме того, вводятся операции с использованием по-
поисковых таблиц, а также обсуждается функция bwmorph из пакета IPT, которая
выполняет различные морфологические действия.
9.3.1. Размыкание и замыкание
Морфологическое размыкание А по В обозначается А о В и определяется как
эрозия А по Б, после которой выполняется дилатация результата по В:
АоВ = (АеВ)®В.
Эту операцию можно также задать эквивалентной формулой
AoB = U{(B)z\(B)zCA},
где LJ{-} обозначает объединение всех множеств внутри фигурных скобок, а фор-
формула С С D означает, что множество С является подмножеством D. Такое пред-
представление имеет простую геометрическую интерпретацию. На рис. 9.9, а) пока-
показано множество А и структурообразующий элемент В, имеющий форму круга.
На рис. 9.9, б) изображены некоторые сдвиги множества В, которые полностью
содержатся в А. Объединение всех таких сдвигов выделено темным цветом на
рис. 9.9, в). Эта область и является размыканием А по В. На этом рисунке бе-
белым цветом показаны области, где структурообразующий элемент целиком не
поместился, поэтому они не принадлежат размыканию. Морфологическое раз-
размыкание удаляет те части объектов, в которых структурообразующий элемент
полностью не помещается. Оно также сглаживает контуры объектов, разрушает
тонкие соединения и удаляет острые выступы.
Морфологическое замыкание множества А по В обозначается А • В. Эта опе-
операция представляет собой эрозию, примененную к результату дилатации:
А • В = (А 0 В) 0 В.
9.3. Комбинирование дилатации и эрозии
Геометрически множество А • В представляет собой дополнение к объединению
всех сдвигов множества В, которые не пересекаются с А. На рис. 9.9, г) постро-
построено несколько сдвигов множества ??, которые не пересекаются с А. Взяв допол-
дополнение к объединению всех таких сдвигов, мы получим область, затемненную на
рис. 9.9, д), которое есть искомое замыкание. Подобно размыканию, морфологи-
морфологическое замыкание приводит к сглаживанию контуров объектов. Однако в отличие
от размыкания, оно соединяет узкие разрывы, «заливает» длинные углубления
малой ширины и заполняет малые отверстия, диаметр которых меньше размеров
структурообразующего элемента.
Трансляции В внутри А
А о В
г)
Трансляции В вне А
д)
Рис. 9.9. Размыкание и замыкание как объединение сдвигов структурообразующих эле-
элементов, а) Множество А и структурообразующий элемент В. б) Сдвиги В, ко-
которые полностью помещаются внутри А. в) Полное размыкание А (затемненная
область), г) Сдвиги В, которые лежат целиком вне А. д) Полное замыкание А
(затемненная область)
Операции размыкания и замыкания реализованы в пакете IPT с помощью
функций imopen и inclose. Обе эти функции имеют простые формы вызова
С = imopen(A, В)
С = imclose(A, В),
где А — это двоичное изображение, а В — матрица из 0 и 1, которая задает
структурообразующий элемент. Strel-объект SE можно использовать вместо ар-
аргумента В.
Пример 9.4. Использование функций imopen и inclose.
Этот пример иллюстрирует применение функций imopen и inclose. Изображе-
Изображение shapes.tif, построенное на рис. 9.10, а), имеет ряд характерных особенно-
особенностей, которые помогут лучше понять действие размыкания и замыкания на такие
объекты, как: острые выступы, тонкие перемычки, длинные углубления, изоли-
изолированные отверстия, маленькие одиночные объекты и зубчатые элементы гра-
границ. Следующая последовательность команд размыкает изображение с помощью
квадратного структурообразующего элемент 20x20:
Глава 9. Морфологическая обработка изображений
» f = imreadOshapes.tif);
>> se = strel('square', 20);
>> fo = imopen(f, se) ;
>> imshow(fo)
Рис. 9.10. Иллюстрация раз-
размыкания и замыкания, а) Ис-
Исходное изображение, б) Раз-
Размыкание, в) Замыкание, г) За-
Замыкание б)
На рис. 9.10, б) показан результат этих действий. Видно, что при этом исчезли
тонкие выступы и острые зубцы, направленные во внешнюю сторону от границ
объекта. Тонкое соединение и маленький изолированный объект также исчезли.
Команды
>> fc = imclose(f, se) ;
>> imshow(fc)
произвели результат, приведенный на рис. 9.10, в). Здесь были удалены узкое
углубление, зубчатые неровности, направленные внутрь объекта, а также малень-
маленькое отверстие. Как будет показано в следующем абзаце, комбинация замыкания
и размыкания может весьма эффективно удалять шумы. Имея в виду рис. 9.10,
применение замыкания к предыдущему результату размыкания выглядит как
существенное сглаживание объектов изображения. Мы замыкаем разомкнутое
выше изображение следующим образом:
>> foe = imclose(fo, se);
>> imshow(foc)
На рис. 9.10, г) изображены полученные сглаженные объекты.
На рис. 9.11 приведена другая иллюстрация полезности операций замыка-
замыкания и размыкания при обработке нечетких и подпорченных отпечатков пальцев
[рис. 9.11, а)]. Команды
>> f = imread('fingerprint.tif');
>> se = strel (' square >, 3);
>> fo = imopen(f, se);
>> imshow(fo)
9.3. Комбинирование дилатации и эрозии
совершают действия, результат которых приведен на рис. 9.11, б). Заметим, что
случайные мешающие точки были удалены при размыкании изображения, одна-
однако одновременно с этим были внесены лишние разрывы и щели по краям отпе-
отпечатков. Многие из этих недостатков можно исправить последующим замыканием
результата размыкания:
>> foe = imclose(fo,se) ;
>> imshow(foc)
Рис. 9.11, в) показывает окончательный результат. ?
Рис. 9.11. Изображение испорченных отпечатков пальцев, а) Размыкание изображения.
б) Замыкание после размыкания. (Исходное изображение предоставлено Наци-
Национальным институтом стандартов и технологий США)
9.3.2. Преобразование успех/неудача
В приложениях часто бывает необходимо уметь распознавать определенные кон-
конфигурации пикселов, например, изолированные пикселы переднего плана или
пикселы, которые являются концами сегментов линий. Преобразования успех/не-
успех/неудача1 помогают при решении подобных задач. Преобразование успех/неудача
множества А по множеству В обозначается через А (& В. Здесь В обозначает
структурообразующую пару элементов В = (В\, Д2), a не один элемент, как это
было раньше. По определению, преобразованием множества А по В называется
множество
А ® В = {A Q Bi) П {Ас 0 J32).
На рис. 9.12 показано, как преобразование успех/неудача можно использовать
для определения местоположений следующей конфигурации пикселов, имеющей
форму креста:
010
111.
010
На рис. 9.12, а) такие конфигурации пикселов встречаются в двух местах. Эрозия
по структурообразующему элементу В\ устанавливает положения пикселов пе-
переднего плана, у которых одновременно имеются северный, восточный, южный и
западный соседи переднего плана. Эрозия дополнения исходного изображения по
1В оригинале использован термин hit-or-miss transformation.
Глава 9. Морфологическая обработка изображений
элементу Въ определяет положения всех пикселов, у которых одновременно име-
имеются северо-восточный, юго-восточный, юго-западный и северо-западный соседи
заднего плана (фона). Рис. 9.12, ж) приводит результат пересечения (логическое
AND) этих двух действий. Каждый пиксел переднего плана на этом изображении
отвечает множеству пикселов, которое имеет искомую конфигурацию.
а) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 б)
О 0 10 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 1111 0 0 0 0 0 0 в\
0 111 0 0 0 0 0 0 0 0 110 О
О 0 1 0 0 0 0 0 0 0 0 0 1110 1
О 0 0 0 0 1 0 0 0 0 0 0 0 10 0 1ГП 1
00 00111000 0 00000 1
О 0 0 0 0 1 О О 0 0 0 0 0 0 0 0
О О О О О О 0 0 0 0 0 0 О О О О
*)
о о о о о о о о о о о о о о о о
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
О О О О О О О О 0 0 0 0 0 0 0 0
О 0 1 0 0 0 0 0 0 0 0 0 0 0 0 О
О 0 0 0 0 0 0 0 0 0 0 0 0 1 О О
о о о о о о о о о о о о о о о о
О 0 0 0 0 1 О О О О О О О О О О
о о о о о о о о о о о о о о о о
0 о о о о о о о о о о о о о о о
^1111111111111111 д)
1101111111111111
11011100 0 0111111 в
10 0 0 11111111 0 0 11 2
110 1111111110 0 0 1 1 1
1111101111111011 г—1
11110 0 0 111111111 I—1
1111101111111111 l i
1111111111111111
е) Ж)
1010 111111111111 0 0 0 0 0 0 О О О О О О О О О О
1 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 О О О О О О О О О О О О О О
О О О 0 0 1111110 0 0 0 1 О О О О О О О О О О О О О О О О
10 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 О О О О О О О О О О О О О
0 0 0 0 0 10 11110 0 0 0 1 О О О О О О О О О О О О О О О О
1 0 1 0 0 0 0 0 1110 О О О О О О О О О О О О О О О О О О О О
11110 10 111110 10 1 0 0 0 0 0 1 О О О О О О О О О О
1110 0 0 0 0 11111111 0 0 О О О О О О О О О О О О О О
1111010111111111 0 0 0 0 О О О О О О О О О О О О
Рис. 9.12. а) Исходное изображение А. б) Структурообразующий элемент В\. в) Эрозия
А по В\. г) Дополнение исходного изображения Ас. д) Структурообразующий
элемент В^. е) Эрозия Ас по ?2. &с) Результирующее изображение
Название операции «успех/неудача» происходит от результата двух эрозий.
Например, выходное изображение на рис. 9.12 состоит из всех позиций пикселов,
которые подходят под В\ («успех») и полностью не подходят под jE?2 («неудача»).
9.3. Комбинирование дилатации и эрозии
Преобразование успех/неудача реализовано в IPT функцией bwhitmiss, ко-
которая имеет синтаксис
С = bwhitmiss(A, Bl, В2),
где С — это результат операции, А — исходное изображение, а В1 и В2 — структуро-
структурообразующие элементы, задействованные в преобразовании, которые обсуждались
выше.
Пример 9.5. Применение функции bwhitmiss.
Рассмотрим задачу обнаружения положений пикселов верхних левых углов объ-
объектов на изображении с помощью преобразования успех/неудача. На рис. 9.13, а)
приведено простое изображение, состоящее из квадратиков разных размеров. Мы
хотим выделить все пикселы переднего плана, которые имеют восточного и юж-
южного соседа (это «успех»), но не имеют ни северо-восточного, ни северного, ни
северо-западного, ни западного, ни юго-западного соседа (это «неудача»). Эти
условия приводят к следующим структурообразующим элементам:
>> Bl = strel([0 0 0; 0 1 1; 0 1 0]);
>> В2 = strel([l 11; 100; 10 0]);
Заметим, что оба элемента не содержат юго-восточного соседа, который называ-
называется все равно каким пикселом. Мы применяем функцию bwhitmiss для выпол-
выполнения преобразования, где f обозначает входное изображение с рис. 9.13, а):
» g = bwhitmiss(f, Bl ,B2);
>> imshow(g)
Каждая однопиксельная точка на рис. 9.13, б) является пикселом верхнего лево-
левого угла какого-то квадрата на рис. 9.13, а). Пикселы на рис. 9.13, б) были слегка
увеличены для лучшей видимости. ?
Рис. 9.13. а) Исходное изоб- а)
ражение. б) Результат приме-
применения преобразования успех/
неудача (отмеченные точки бы-
были увеличены для лучшей за-
метности)
Глава 9. Морфологическая обработка изображений
9.3.3. Использование поисковых таблиц
Когда структурообразующие элементы, используемые в операции успех/неудача,
малы, то это преобразование можно вычислить быстрее, если воспользоваться по-
поисковой таблицей LUT (LookUp Table). Метод заключается в предварительном
вычислении значений выходных пикселов для всех окрестностных конфигура-
конфигураций, а результаты сохраняются в некоторой таблице для дальнейшего исполь-
использования. Например, всего имеется 29 = 512 различных конфигураций значений
пикселов двоичного изображения 3x3.
Чтобы воспользоваться поисковой таблицей, необходимо присвоить уникаль-
уникальный индекс каждой возможной конфигурации пикселов. Простой способ сделать
это, скажем, для случая 3x3, заключается в умножении каждой конфигурации
3x3 поэлементно на матрицу
1 8 64
2 16 128
4 32 256
и в сложении полученных произведений. Эта процедура назначает уникальное
значение в интервале от 0 до 511 каждой двоичной окрестностной конфигурации
3x3. Например, окрестности
1 1 О
1 0 1
1 0 1
присваивается число 1A)+2A)+4A)+8A) + 16@)+32@)+64@) + 128A)+256A) =
= 399, где первые множители являются коэффициентами из предыдущей матри-
матрицы, а в скобках стоят значения пикселов, взятые по столбцам.
В пакете IPT имеется две функции makelut и applylut (использование кото-
которых будет проиллюстрировано позже в этом параграфе), реализующие эти дей-
действия. Функция makelut строит поисковую таблицу на основе некоторой функ-
функции, заданной пользователем, a applylut обрабатывает входное изображение с
помощью построенной таблицы. Если продолжить рассмотрение случая 3x3, то
использование makelut предполагает задание пользовательской функции, кото-
которая принимает на входе матрицы 3x3, а возвращает одно значение, обычно 0
или 1. Функция makelut вызывает эту заданную пользователем функцию 512 раз,
передавая ей все возможные окрестности 3x3. Она возвращает результат вычис-
вычислений в виде вектора из 512 элементов.
В качестве иллюстрации мы напишем функцию (назовем ее endpoints.m),
которая использует makelut и applylut для обнаружения концевых точек на
двоичном изображении. Концевой точкой мы будем называть пиксел передне-
переднего плана, у которого имеется в точности один сосед переднего плана. Функция
endpoints вычисляет, а затем применяет поисковую таблицу для обнаружения
концевых точек входного изображения. Строка программного кода
persistent lut,
которая используется в endpoints, определяет переменную с именем lut и объяв-
объявляет, что она принадлежит типу persistent (устойчивый). MATLAB «помнит»
9.3. Комбинирование дилатации и эрозии
значения переменных типа persistent в промежутках между вызовами данной
функции. При первом вызове функции endpoints переменная lut автоматически
инициализируется пустой матрицей ( [ ]). Когда lut пуста, то функция вызывает
makelut, передавая ее манипулятор подфункции endpoints.fсп. Затем функция
apply lut находит концевые точки с помощью поисковой таблицы. Поисковая
таблица хранится в переменной lut типа persistent, поэтому при следующем
вызове функции endpoints не придется заново строить эту таблицу2.
function g = endpoints(f)
7eENDPOINTS Computes end points of a binary image.
°/o G = ENDPOINTS (F) computes the end points of the binary image F
°/, and returns them in the binary image G.
persistent lut
if isempty(lut)
lut = makelut(@endpoint_fen, 3);
end
g = applylut(f, lut);
I •/,
function is_end_point = endpoint_fcn(nhood)
'/, Determines if a pixel is an end point.
°/o IS_END_POINT = ENDPOINT_FCN(NHOOD) accepts a 3-by-3 binary
'/, neighborhood, NHOOD, and returns a 1 if the center element is an
°/e end point; otherwise it returns a 0.
is_end_point = nhoodB, 2) & (sum(nhood(:)) == 2);
Пример 9.6. Реализация игры Конвея «жизнь» на основе двоичного изображе-
изображения и поисковой таблицы.
Интересным приложением поисковых таблиц может служить «игра жизнь» Кон-
Конвея, в которой участвуют «организмы», существующие на прямоугольной сетке
и эволюционирующие из поколения в поколение. Мы воспользуемся ею для ил-
иллюстрации достоинства и простоты метода поисковых таблиц. Имеются простые
правила, по которым организмы в игре Конвея рождаются, выживают и умирают
при переходе от одного «поколения» к следующему.
Генетические правила Конвея определяют метод вычисления следующего по-
поколения (или следующего двоичного изображения) по текущему поколению:
1. Каждый пиксел переднего плана, имеющий двух или трех соседей передне-
переднего плана, выживает в следующем поколении.
2. Каждый пиксел переднего плана, имеющий ноль, один или не менее четы-
четырех соседей, «умирает» в следующем поколении (т. е. становится фоновым
пикселом) по причине его «изоляции» или «перенаселенности».
3. Каждый фоновый пиксел, у которого имеется ровно три соседних пиксела
переднего плана, «рождает» пиксел, т. е. он становится пикселом переднего
плана.
2См. § 3.4.2, где обсуждается манипулятор функции
Глава 9. Морфологическая обработка изобраэюений
Все «рождения» и все «смерти» происходят одновременно в процессе вычис-
вычисления следующего двоичного изображения, определяя очередное поколение «ор-
«организмов».
Рис. 9.14. а) Изображение мор-
морфологического остова, б) Выход
функции endpoints. Пикселы это-
этого изображения увеличены для
лучшей наглядности
Для реализации игры «жизнь» с помощью функций makelut и applylut мы
сначала напишем функцию, которая применяет генетические законы Конвея к
выделенному пикселу и его 3x3 соседям:
function out = conwaylaws(nhood)
7oCONWAYLAWS Applies Conway's genetic laws to a single pixel.
% OUT = CONWAYLAWS(NHOOD) applies Conway's genetic laws to a single
% pixel and its 3-by-3 neighborhood, NHOOD.
num_neighbors = sum(nhood(:)) nhoodB, 2);
if nhoodB, 2) == 1
if num_neighbors <= 1
out =0; % Pixel dies from isolation,
elseif num_neighbors > = 4
out =0; % Pixel dies from overpopulation,
else
out = 1; °/0 Pixel survives.
end
else
if num_neighbors == 3
out = 1; °/0 Birth pixel.
else
out =0; % Pixel remains empty.
end
end
9.3. Комбинирование дилатации и эрозии
Затем строится поисковая таблица вызовом функции makelut с манипулято-
манипулятором функции conwaylaws в качестве аргумента:
>> lut = makelut(Oconwaylaws, 3);
Множество исходных изображений было придумано для демонстрации раз-
различных эффектов, возникающих в поколениях «организмов», подчиняющихся
законам эволюции Конвея (см. [Gardner, 1970, 1971]). Рассмотрим, к примеру,
начальное изображение, которое называется «конфигурацией чеширского кота»:
>> bwl = [0 0 0 0 0 0 0 0 О О
0000000000
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
1
1
0
0
0
1
0
0
0
1
0
1
0
1
0
0
0
1
0
1
0
1
0
0
1
1
0
0
0
1
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0];
Следующие команды совершают вычисления и показывают три поколения этого
изображения:
>> imshow(bwl, 'n'), title('Generation I')
>> bw2 = applylut(bwl, lut);
>> figure, imshow(bw2, 'n'); title('Generation 2')
>> bw3 = applylut(bw2, lut);
>> figure, imshow(bw3, 'n'); title('Generation 3')
Мы оставляем читателям проверить, что после нескольких генераций от кота
остается одна улыбка, которая завершается отпечатком кошачьей лапки. ?
9.3.4. Функция bwmorph
Функция bwmorph из пакета IPT выполняет ряд полезных действий, построен-
построенных на основе операций дилатации, эрозии, а также с использованием поисковых
таблиц. Она имеет следующую синтаксическую форму вызова:
g = bwmorph(f, operation, n),
где f — это входное двоичное изображение, operation — символьная строка,
задающая конкретную операцию, а п обозначает, сколько раз необходимо вы-
выполнить эту операцию. Входной аргумент п не является обязательным. При его
отсутствии операция выполняется только один раз. В табл. 9.3 перечислены все
допустимые операции функции bwmorph. В оставшейся части этого параграфа
мы сконцентрируем наше внимание на двух действиях, а именно: на утончении
и построении остова.
Глава 9. Морфологическая обработка изображений
Таблица 9.3. Операции, поддерживаемые функцией bwmorph
Операция
Описание
bothat Совершает операцию «дно шляпы» с использованием структурообразующего
элемента 3x3. Для других элементов применять imbothat (см. § 9.6.2).
bridge Соединяет пикселы, разделенные промежутком в один пиксел.
clean Удаляет изолированные пикселы переднего плана.
close Замыкает с использованием элемента 3x3. Для других структурообразующих
элементов применять операцию imclose.
diag Делает заполнение вокруг диагонально связанных пикселов переднего плана.
dilate Совершает дилатацию с использованием элемента 3x3. Для других структу-
структурообразующих элементов применять операцию imdilate.
erode Выполняет эрозию с использованием элемента 3x3. Для других структуро-
структурообразующих элементов применять операцию imerode.
fill Заполняет однопиксельные «дырки» (фоновые пикселы, окруженные со всех
сторон пикселами переднего плана).
hbreak Удаляет Н-связанные пикселы переднего плана.
majority Делает пиксел р пикселом переднего плана, если не менее 5 пикселов в Ns(p)
(см. § 9.4) являются пикселами переднего плана; в противном случае делает
пиксел р фоновым.
open Размыкает с использованием элемента 3x3. Для других структурообразую-
структурообразующих элементов применять операцию imopen.
remove Удаляет «внутренние» пикселы (пикселы переднего плана, у которых нет ни
одного фонового соседа).
shrink Сжимает объекты без внутренних дыр в точки. Сжимает объекты с дырами
в кольца.
skel Строит остов изображения.
spur Удаляет отростки пикселов.
thicken Утолщает объекты без соединения несвязных частей.
thin Утончает объекты без дыр до минимальной средней линии. Утончает объек-
объекты с дырами до колец.
tophat Совершает операцию «верх шляпы» с использованием структурообразующе-
структурообразующего элемента 3x3. Для других элементов применять imtophat (см. § 9.6.2).
Операция утончение сокращает двоичные объекты или формы изображения
до отдельных линий, которые имеют толщину всего в один пиксел. Например, по-
пилярные линии на отпечатках пальцев, показанные на рис. 9.22, в), являются
слишком толстыми. При анализе этих линий может потребоваться их утончение
вплоть до толщины в один пиксел. Каждое применение соответствующей опера-
операции утончения из bwmorph удаляет один или два пиксела из толщины объектов
двоичного изображения. Например, следующие команды демонстрируют резуль-
результат применения операции утончения один и два раза.
>> f = imread('fingerprint_cleaned.tif');
>> gl = bwmorph(f, 'thin', 1);
>> g2 = bwmorph(f, 'thin', 2);
>> imshow(gl), figure, imshow(g2)
На рис. 9.15, а) и б), приведены соответствующие утонченные изображения. Име-
Имеется важный вопрос: сколько раз следует применять эту операцию? Для ряда
действий, включая утончение, функция bwmorph допускает для п значение Inf
9.3. Комбинирование дилатации и эрозии
(т.е. бесконечность). Вызов bwmorph с этим значением предписывает исполнение
операции до тех пор, пока изображение не перестанет изменяться. Иногда это
называют повторением операции до стабилизации. Например,
>> ginf = bwmorph(f, 'thin', Inf) ;
>> imshow(ginf)
Как видно из рис. 9.15, в), это действие приводит к существенному улучшению
изображения по сравнению с рис. 9.11, в).
а) б) в)
Рис. 9.15. а) Отпечатки пальцев из рис. 9.11, в) утончены один раз. б) Утончение изоб-
изображения произведено два раза, в) Утончение изображения до стабилизации
Построение остова представляет собой другой путь сокращения объектов
двоичного изображения для получения множества тонких линий, которое несет
важную информацию о формах исходных объектов. (Процесс построения осто-
остова детально описан в книге [Gonzalez, Woods, 2002]). Функция bwmorph строит
остов, когда параметр operation установлен в 'skel'. Пусть i обозначает изоб-
изображение объекта, похожего на кость, с рис. 9.16, а). Для получения его остова
мы вызываем bwmorph при n = Inf:
>> is = bwmorph(f, 'skel', Inf);
>> imshow(f) , figure, imshow(fs)
На рис. 9.16, б) приведен полученный остов, который вполне приемлемо отража-
отражает основные формы исходного объекта.
Процедуры построения остова и утончения часто строят лишние короткие от-
отростки, которые иногда называются паразитическими компонентами. Процесс
подчищения (или удаления) этих компонент называется усечением. Для этих це-
целей можно использовать функцию endpoints (см. § 9.3.3). Метод заключается
в последовательном обнаружении концевых точек и их удалении. Следующие
простые команды делают завершающую обработку построенного остова f s изоб-
изображения, которые повторяются 5 раз, для удаления концевых точек:
>> for k = 1:5
fs = fs & ~endpoints(fs);
end
Рис. 9.16, в) показывает результат этих действий.
Глава 9. Морфологическая обработка изображений
Рис. 9.16. а) Изображение в виде кости, б) Остов, полученный с помощью функции
bwmorph. в) Окончательный остов после выполнения операции усечения функ-
функцией endpoints
9.4. Выделение компонент связности
До этого момента все обсуждавшиеся операции применялись индивидуально к
пикселам переднего (или заднего) плана или к их ближайшим соседям. В этом
параграфе рассматриваются важные операции «среднего плана», которые зани-
занимают промежуточное положение между обработкой отдельных пикселов и дейст-
действиями над всеми пикселами переднего плана. Это приводит к понятию компо-
компонент связности, которые мы будет также называть объектами.
Если предложить сосчитать объекты на рис. 9.17, а), то большинство людей
скажет, что их там десять: шесть букв и четыре геометрические фигуры. На
рис. 9.17, б) дан увеличенный прямоугольный фрагмент этого изображения. Ка-
Какое отношение имеют 16 пикселов переднего плана на этом рисунке к десяти
выделенным объектам? Несмотря на то, что они разделены на две группы, все
эти 16 пикселов принадлежат букве «Е» на рис. 9.17, а). Чтобы написать ком-
компьютерную программу, которая обнаруживает объекты и оперирует с ними, нам
необходимо более точно определить ключевые понятия.
Пиксел р с координатами (х, у) имеет два горизонтальных и два вертикальных
соседа с координатами (ж + 1, у), (х — 1, у), (х, у + 1) и (х, у — 1). Эта четверка со-
соседей р обозначается Л^(р). Она выделена на рис. 9.18, а) серым цветом. Четыре
диагональных соседа р имеют координаты (х + 1, г/ + 1), (х + 1, у — 1), (х — 1, г/ + 1)
и (х — 1, у — 1). На рис. 9.18, б) изображены эти диагональные соседи; эта четвер-
четверка обозначается Nd{p)- Объединение А^(р) и No{p) на рис. 9.18, в) определяет
восьмерку соседей пиксела р, которая обозначается Ng(p).
9.4- Выделение компонент связности 377
б)
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Рис. 9.17. а) Изображение, содержащее 10 объектов.
б) Подмножество пикселов изображения
Рис. 9.18. а) Пиксел р и его четвер-
четверка соседей МЦр). б) Пиксел р и его
диагональные соседи Nd{p). в) Пик-
Пиксел р и его восьмерка соседей Ng(p).
г) Пикселы ри q являются 4-смежны-
ми и 8-смежными. д) Пикселы р и q
являются 8-смежными, но не 4-смеж-
ными. е) Затемненные пикселы явля-
являются одновременно 4-связными и 8-
связными. сне) Затемненные пикселы
являются 8-связными, но не 4-связ-
4-связными
а)
б)
в)
г)
е)
р
я
д)
ж)
р
я
0
0
0
1
0
С)
0
0
1
0
0
1
1
1
0
0
1
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
1
0
0
1
1
0
0
0
1
0
0
0
0
1
0
0
0
Два пиксела р и q называются 4~смежными, если q E N^ip). Аналогично,
пикселы р и q называются 8-смежными, если q Е Ns(p). Рис. 9.18, г) и д), иллю-
иллюстрируют эти понятия. Путем между пикселами р\ и рп называется последова-
последовательность пикселов р\,рч,... ,pn-i,pn, такая, что pk является смежным для Pk+i
при к = 1,2,..., п — 1. Путь может быть ^-связным или 8-связным, в зависимости
от используемого определения смежности пикселов.
378 Глава 9. Морфологическая обработка изображений
Два пиксела переднего плана р и q называются 1^-связными, если существует
4-связный путь между ними, который целиком состоит из пикселов переднего
плана [рис. 9.18, е)\. Пикселы р и q называются 8-связными, если между ними
имеется 8-связный путь [см. рис. 9.18, ж)]. Для любого пиксела переднего плана
р множество всех связанных с ним пикселов переднего плана называется компо-
компонентой связности, содержащей р.
Понятие компоненты связности было определено в терминах путей, а поня-
понятие пути, в свою очередь, зависит от определения смежности. Это означает, что
природа связных компонент зависит от понятия смежности, из которых наиболее
употребительными являются 4-связность и 8-связность. Рис. 9.19 иллюстрирует
влияние, которое определение смежности может произвести при подсчете числа
компонент связности изображения. На рис. 9.19, а) приведено маленькое двоич-
двоичное изображение с четырьмя 4-компонентами связности. Рис. 9.19, б) показывает,
что выбор 8-смежности сокращает число компонент 8-связности до 2.
/
1 1
1
1
1
1
* 1
V
V
1
1
1
1
1
1
1
1
\
1
1
1
1
1 i
/
/
0
0 J
0 ]
0
0
0
0
0
0
м
о
0
0
о
0
0
V
0
0
0
О
0
0
\ °
' 0
А
1
0
0
0
0
0
0
0
0
0
0
/
/ 1
1
1
1
1
\ 1
\
1
1
1
1
1
1
1
1
\\ °
1 ]
1
1
1
1
1 j
/
0
и
0
/о
0
0
0
/Г
ч
0
и
0
0
0
0
Л
1
о
°/
о-
0
0
0
у
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1 1 1
1
1
0
0
0
0
0
0
0
о
0
2
2
0
0
0
0
0
0
2
2
0
0
0
3
0
0
о
0
4
4
4
0
0
0
о
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
(.)
0
0
0
0
0
0
0
2
2
0
0
0
0
0
0
2
2
0
0
0
2
0
0
0
0
2
2
2
0
0
0
0
0
Г)
0
0
0
0
Рис. 9.19. Компоненты связности, а) Четыре 4-связные компоненты, б) Две 8-связные
компоненты, в) Размечающая матрица, полученная для 4-связности. г) Разме-
Размечающая матрица, полученная для 8-связности
9.4- Выделение компонент связности
Функция bwlabel из IPT находит все компоненты связности двоичного изоб-
изображения. Форма ее вызова имеет вид
[L, пшп] = bwlabel(f, conn),
где f — это входное двоичное изображение, а параметр conn обозначает желае-
желаемую связность (по 4- или 8-смежности). Выход L называется размечающей мат-
матрицей, а в (необязательный) выходной параметр пшп записывается общее чис-
число обнаруженных компонент связности. Если параметр conn опущен, то он по
умолчанию считается равным 8. На рис. 9.19, в) показана размечающая матри-
матрица, отвечающая рис. 9.19, а) и вычисленная командой bwlabel (f, 4). Пикселам
каждой отдельной компоненты связности присваивается одинаковое число от 1
и до общего числа компонент связности. Другими словами, пикселы, помечен-
помеченные 1, принадлежат первой компоненте связности, пикселы, помеченные 2, —
второй компоненте, и т.д. Фоновые пикселы помечены 0. На рис. 9.19, г) пока-
показана размечающая матрица, соответствующая рис. 9.19, а), которая построена
командой bwlabel (f, 8).
Пример 9.7. Нахождение центров масс компонент связности.
В этом примере показано, как можно найти центр масс каждой компоненты связ-
связности рис. 9.17, а). Прежде всего, мы воспользуемся функцией bwlabel для вы-
вычисления 8-связных компонент:
>> f = imreadOobjects.tif >);
>> [L, n] = bwlabel(f) ;
Функция find (см. § 5.2.2) может быть полезной при работе с размечающими мат-
матрицами. Например, следующий вызов функции find возвращает индексы строк
и столбцов всех пикселов, принадлежащих третьему объекту:
>> [г, с] = find(L == 3);
Функция mean с выходами г и с вычисляет центр масс этого объекта1.
>> rbar = mean(r);
>> cbar = mean(c);
Для нахождения центров масс всех объектов изображения можно воспользовать-
воспользоваться циклом. Чтобы сделать центры масс объектов видимыми на изображении, мы
их обозначим символом «*» белого цвета, который разместим в центре черного
кружка. Для этого выполним следующую серию команд:
>> imshow(f)
>> hold on % So later plotting commands plot on top of the image.
>> for k = l:n
[r, c] = find(L == k);
1Если А является вектором, то mean (А) вычисляет среднее значение его элементов. Если А —
матрица, то mean (А) трактует столбцы А как векторы и возвращает вектор-строку из средних
величин этих векторов. Форма вызова mean (A, dim) возвращает средние значения элементов
вдоль размерности dim.
380 Глава 9. Морфологическая обработка изображений
rbar = mean(r);
cbar = mean(c);
plot(cbar, rbar, 'Marker', 'o', 'MarkerEdgeColor', 'k',,
'MarkerFaceColor', 'k', 'MarkerSize', 10)
plot(cbar, rbar, 'Marker', '*', 'MarkerEdgeColor', 'w')
end
Рис. 9.20 показывает результат этого программного кода. ?
9.5. Морфологическая реконструкция
Реконструкция является морфологическим пре-
преобразованием, в котором участвуют два изоб-
изображения и один структурообразующий элемент
(вместо одного изображения и одного структу-
структурообразующего элемента, как это было в преды-
предыдущих параграфах). Одно изображение, ко-
которое называется маркером, является исход-
исходной точкой преобразования. Другое изображение,
маска, накладывает определенные ограничения
(связи) на отображение. Используемый струк-
структурообразующий элемент определяет связность.
В этом параграфе мы используем 8-связность
(задаваемую по умолчанию), которая означает,
что матрица В, используемая далее, есть 3x3
Рис. 9.20. Центры масс (белые звез- матрица из одних единиц, центр которой нахо-
дочки), наложенные на соответству- датся в точке с КООрдИНатами B, 2).
ющие компоненты связности
ющие компоненты связности
Если д — это маска, а / — маркер, то рекон-
реконструкция д по /, которая обозначается Rg(f),
определяется следующей итеративной процедурой.
1. Инициализация: присвоить hi маркерное изображение /.
2. Построить структурообразующий элемент В = onesC).
3. Повторять:
до тех пор, пока не станет
Маркер / должен быть подмножеством #, т. е.
/Яд.
Рис. 9.21 иллюстрирует эту итеративную процедуру. Заметим, что, несмот-
несмотря на простоту и удобство итеративной формулировки процесса реконструкции,
существуют другие, более быстрые вычислительные алгоритмы, реализующие
9.5. Морфологическая реконструкция 381
это преобразование. Функция imreconstruct из пакета IPT выполняет «быст-
«быструю гибридную реконструкцию», описанную в |Vincent, 1993]. Эта функция име-
имеет следующий синтаксис:
out = imreconstruct(marker, mask),
где marker и mask это изображения, определенные в начале параграфа.
Рис. 9.21. Морфологическая реконструкция, а) Исходное изображение (маска), б) Мар-
Маркерное изображение. в)-д) Промежуточные результаты после 100, 200 и 300
итераций, соответственно, е) Окончательный результат. [Выделенные объекты
маски наложены на рис. б)-д) для сравнения]
9.5.1. Размыкание реконструкцией
При морфологическом замыкании операция эрозия удаляет малые объекты, а
последующая дилатания частично восстанавливает форму оставшихся объектов.
Однако точность этого восстановления зависит от степени подобия форм объ-
объектов и структурообразующего элемента. Метод размыкания реконструкцией1,
обсуждающийся в этом параграфе, в точности восстанавливает форму объектов,
которые остались после эрозии. Размыкание реконструкцией / с использованием
структурообразующего элемента В определяется формулой R/(f Q В).
1 Другие приложения морфологической реконструкции рассматриваются в §§ 10.4.2 и 10.4.3.
Глава 9. Морфологическая обработка изображений
Пример 9.8. Размыкание реконструкцией.
Сравнение результатов морфологического размьжания и размьжания реконструкци-
реконструкцией для изображения, на котором имеется фрагмент текста, показано на рис. 9.22.
В этом примере мы хотим извлечь из рис. 9.22, а) символы, у которых имеют-
имеются длинные вертикальные черточки. Поскольку для размыкания реконструкци-
реконструкцией требуется изображение, подвергнутое эрозии, мы выполним эту операцию на
первом шаге, используя тонкий, вертикальный структурообразующий элемент,
длина которого пропорциональна высоте букв:
>> f = imread('book_text_bw.tif');
>> fe = imerode(f, onesE1, 1));
Рис. 9.22. Морфологическая реконструкция, а) Исходное изображение, б) Эрозия по вер-
вертикальной черточке, в) Размыкание по вертикальной черточке, г) Размыкание
реконструкцией по вертикальной черточке, д) Заполнение дыр. е) Символы,
соприкасающиеся с границей (см. правую границу), сне) Пограничные символы
удалены
9.5. Морфологическая реконструкция
На рис. 9.22, б) приведен результат. Размыкание, показанное на рис. 9.22, в), бы-
было выполнено функцией imopen:
>> fo = imopen(f, onesE1, 1));
Отметим, что вертикальные черточки были обнаружены, но содержащие их сим-
символы целиком восстановлены не были. Теперь выполняем размыкание рекон-
реконструкцией по формуле
>> fobr = imreconstruct(fe, f) ;
Из результата, представленного на рис. 9.22, г), видно, что символы, содержащие
вертикальные черточки, были полностью восстановлены, а все остальные симво-
символы — удалены. Оставшиеся части рис. 9.22 иллюстрируют материалы следующих
двух параграфов. ?
9.5.2. Заполнение отверстий
Морфологическая реконструкция имеет широкий спектр практических прило-
приложений, которые определяются выбором маркера и маски. Например, пусть в ка-
качестве маркерного изображения взято изображение /ш, которое равно 0 везде,
кроме границ, а в точках границы оно равно 1 — /:
-/(я?2/)> если (х, у) лежит на границе,
Тогда операция д = [Rfc{fm)]c имеет эффект заполнения отверстий в /, как это
проиллюстрировано на рис. 9.22, д). Функция imf ill выполняет эти действия
автоматически при задании необязательного аргумента 'holes' в команде
g = imfill(f, 'holes').
Эта функция подробно обсуждается в § 11.1.2.
9.5.3. Очистка от пограничных объектов
Другое полезное приложение реконструкции заключается в очистке изображе-
изображений от объектов, которые соприкасаются с границей. Опять ключевой момент
состоит в выборе подходящих маркера и маски для достижения желаемого ре-
результата. В данном случае в качестве маски используется исходное изображение,
а маркерное изображение fm задается формулой
_ Г /(х,у), если (х,у) лежит на границе,
О иначе.
Рис. 9.22, е) показывает результат реконструкции ify(/m), на котором остались
лишь объекты, касающиеся границы. Разность множеств / \ ify(/m), приведен-
приведенная на рис. 9.22, сне), состоит из объектов исходного изображения, которые не
касаются границы. Функция IPT imclearborder автоматически совершает эту
процедуру. Она имеет форму вызова
g = imclearborder(f, conn),
Глава 9. Морфологическая обработка изображений
где f — это входное изображение, a g — результат. Параметр conn может быть
равным 4 или 8 (по умолчанию). Эта функция «гасит» структуры, которые ярче
своих окрестностей и которые примыкают к границам изображения. Изображе-
Изображение f может быть полутоновым или двоичным. Выходом служит или полутоно-
полутоновое, или двоичное изображение соответственно.
9.6. Полутоновая морфология
Все двоичные морфологические операции, обсуждавшиеся в этой главе, за ис-
исключением преобразований «успех/неудача», имеют естественные расширения
для обработки полутоновых изображений. В этом параграфе, как и в двоичном
случае, мы начнем с рассмотрения операций дилатации и эрозии, которые для
полутоновых изображений формулируются в терминах минимума и максимума,
взятых по окрестностям пикселов.
9.6.1. Дилатация и эрозия
Полутоновая дилатация изображения / по структурообразующему элементу Ь
обозначается / 0 Ъ и определяется формулой
(/ 0 Ь)(ж,у) = max{/(z - х\у - у1) + Ь(х',у') | (х'\у') G Db} ,
где Db обозначает область определения 6, и предполагается, что /(х,у) равно
—оо вне области определения /. Это уравнение реализует процесс, аналогичный
процедуре нахождения пространственной свертки, которая объяснялась в § 3.4.1.
Для наглядности можно мысленно повернуть структурообразующий элемент на
180° вокруг его центра и разнести по всем точкам (х, у) изображения. В каждом
положении нужно сложить соответствующие пикселы изображения с пикселами
повернутого и перемещенного элемента, а затем вычислить максимум всех этих
величин. Получится значение дилатации в точке (х,у).
Важное отличие полутоновой дилатации от пространственной свертки состоит
в том, что двоичная матрица Db определяет, какие точки из окрестности исполь-
использовать в операции взятия максимума. Другими словами, для любой пары коор-
координат (жо, Уо) из области Db сумма величин f(x — #о, У ~ Уо) + Ь(хо, уо) участвует
в вычислении максимума только в случае, если значение матрицы Db в ячей-
ячейке (хо,г/о) равно 1. В противном случае, т.е. когда этот элемент матрицы равен
нулю, соответствующая сумма не участвует в операции взятия максимума. Это
действие повторяется для всех координат (xf,yf) G Db, каждый раз, как только
меняется координата (х,у). Построение графика величины Ь(х',у'), как функции
координат х1 и у', будет выглядеть как цифровая «поверхность», высота которой
в каждой точке задается значением изображения Ъ в этой точке.
На практике полутоновая дилатация обычно выполняется с использованием
плоских структурообразующих элементов (см. табл. 9.2), для которых величина
(высота) Ь равна 0 в каждой точке, принадлежащей Db. To есть
9.6. Полутоновая морфология
В этом случае операция взятия максимума полностью определяется конфигу-
конфигурацией 0 и 1 двоичной матрица Db, а уравнения для полутоновой дилатации
принимают более простой вид
(/ 0 Ь){х,у) = max{/(z - х',у - у') \ {х',у') е Db} .
Таким образом, полутоновая дилатация является операцией взятия локального
максимума, в которой максимум вычисляется по множеству пикселов окрестно-
окрестности, форма которой задается областью Db.
Неплоские структурообразующие элементы можно строить с помощью функ-
функции strel, передавая ей две матрицы:
A) одну матрицу из 0 и 1, которые обозначают область структурообразующего
элемента Db, и
B) другую матрицу, в которой записаны значения высот Ь(х'\у').
Например, команда
>> Ъ = strel ([1 11], [12 1])
Ъ =
Nonflat STREL object containing 3 neighbors.
Neighborhood:
111
Height:
12 1
создает структурообразующий элемент 1x3, значения высот которого равны 6@, — 1) =
= 1,6@,0) = 2, 6@,1) = 1.
Плоские структурообразующие элементы для полутоновых изображений строят-
строятся с использованием функции strel по тем же правилам, что и для двоичных
изображений. Например, следующие команды показывают, как совершать дила-
тацию изображения f на рис. 9.23, а) с помощью плоского 3x3 элемента:
>> se = strel (' square', 3);
>> gd = imdilate(f, se) ;
На рис. 9.23, б) показан результат. Как и следовало ожидать, изображение полу-
получилось слегка размытым. Остальные части рис. 9.22 обсуждаются далее.
Полутоновая эрозия / по структурообразующему элементу 6 обозначается
/ © 6 и определяется формулой
(/ 0 Ь){х,у) = min{/(x + х',у + у1) - Ь(х',у') \ {х>\у') G Db} ,
где Db обозначает область определения 6 и предполагается, что f(x,y) равно -Кос
вне области определения /. Опять эту процедуру можно мысленно представлять
в виде перемещения центра структурообразующего элемента во все точки изобра-
изображения. В каждой точке изображения значения структурообразующего элемента
вычитаются из соответствующих значений пикселов изображения и берется ми-
минимум по всем таким разностям.
386 Глава 9. Морфологическая обработка изображений
Рис. 9.23. Дилатация и эро-
эрозия, а) Исходное изображение.
б) Изображение после дила-
дилатации. в) Изображение после
эрозии, г) Морфологический
градиент. (Исходное изображе-
изображение предоставлено Агентством
NASA)
Как и с дилатацией, полутоновая эрозия чаще всего применяется по плоским
структурообразующим элементам. В этом случае уравнения для эрозии можно
упростить и привести их к виду
(/ 0 Ъ)(х,у) = min{f(x + х\у + у1) \ (я', у') е Db} .
Значит, полутоновая эрозия является операцией локального минимума, в которой
минимум берется по множеству пикселов окрестности, форма которой задается
по Db- Рис. 9.23, в) изображает результат применения функции imerode с тем
же структурообразующим элементом, что и на рис. 9.23, б):
» ge = imerode(f, se);
Дилатацию и эрозию можно сочетать для достижения различных эффектов.
К примеру, вычитание результата эрозии изображения из результата дилатации
задает «морфологический градиент»1, который представляет собой меру локаль-
локальной полутоновой вариации изображения. Например, присвоив
>> morph_grad = imsubtract (gd, ge);
получаем изображение на рис. 9.23, г), которое является морфологическим гра-
градиентом рис. 9.23, а). На этом изображении подчеркнуто выделены граничные
1На самом деле, вычисление морфологического градиента использует другую процедуру для
несимметричных структурообразующих элементов. А именно: на шаге дилатации элемент сле-
следует симметрично отражать.
9.6. Полутоповая морфология
характеристики, подобно тому, как это делается операцией взятия градиента,
обсуждавшейся в § 6.6.1, и которая еще будет рассматриваться в § 10.1.3.
9.6.2. Размыкание и замыкание
Формулы размыкания и замыкания для полутоновых изображений имеют такой
же вид, что и для двоичных изображений. Размыкание изображения / по эле-
элементу Ь обозначается /оби определяется выражением
/ о ь = (/ е ь) © ъ.
Как и раньше, сначала выполняется эрозия / по 6, за которой следует дилатация
по Ь. Аналогично, замыкание / по Ъ, обозначаемое / • Ь, есть дилатация, после
которой совершается эрозия:
/ • ъ = (/ ф 6) е ь.
Обе эти операции имеют простую геометрическую интерпретацию. Представим
изображение f(x,y) в виде трехмерной поверхности, т. е. значения яркости пред-
представляются высотами над координатной плоскостью ху. Тогда процесс размы-
размыкания f no b представляет собой перемещение (перекатывание) структурообра-
структурообразующего элемента строго под трехмерной поверхностью изображения /, причем
поверхность размыкания получается как огибающая высшие точки, которые до-
достигает этот элемент.
Рис. 9.24 иллюстрирует эту процедуру в одномерном случае. Рассмотрим кри-
кривую на рис. 9.24, а), которая представляет собой значения высот (яркости) вдоль
какой-то строки изображения. На рис. 9.24, б) показано несколько положений
плоского структурообразующего элемента при перемещении под кривой. Резуль-
Результат замыкания дан на рис. 9.24, в) жирной линией над серой областью. Посколь-
Поскольку структурообразующий элемент слишком велик, чтобы поместиться внутри
узкого пика, расположенного посередине исходного изображения, это пик среза-
срезается при размыкании. В общем случае процедура размыкания используется для
удаления узких всплесков яркости при сохранении среднего полутонового фона
и широких областей изменения яркости относительно неизменными.
Рис. 9.24, г) иллюстрирует процесс замыкания. Теперь структурообразующий
элемент перемещается сверху по поверхности кривой яркости. Результат замы-
замыкания, показанный на рис. 9.24, д), получается нахождением всех самых нижних
точек, которые достигаются элементом при движении по кривой. Видно, что за-
замыкание подавляет более темные малые колебания яркости, размеры которых
меньше размеров элемента.
Пример 9.9. Морфологическое сглаживание с помощью размыкания и замыкания.
Поскольку размыкание удаляет яркие детали, которых меньше, чем структуро-
структурообразующих элементов, а замыкания, наоборот, подавляют аналогичные темные
детали малых размеров, то эти процедуры широко используются в различных
сочетаниях при сглаживании и удалении постороннего шума. В этом примере
мы применяем функции imopen и imclose для сглаживания изображения дере-
деревянных шпонок на рис. 9.25, а):
» f = imreadCplugs.jpg');
>> se = strel('disk>, 5);
Глава 9. Морфологическая обработка изображений
fo = imopen(f, se);
>> foe = imclose(fo, se) ;
Рис. 9.24. Размыкание и замыкание
в одном измерении, а) График исход-
исходного одномерного сигнала, б) Плос-
Плоский структурообразующий элемент,
пододвинутый снизу к графику сиг-
сигнала в ряде точек, в) Результат раз-
размыкания, г) Плоский структурообра-
структурообразующий элемент, пододвинутый свер-
сверху к графику сигнала в ряде точек.
д) Результат замыкания
д)
На рис. 9.25, б) показано разомкнутое изображение f о, а на рис. 9.25, в) — замк-
замкнутое изображение foe. Обратите внимание на сглаживания фона и деталей объ-
объектов изображения. Эту процедуру часто называют фильтрацией размыканием-
замыканием. Фильтрация замыканием-размыканием приводит к похожему ре-
результату.
Другой путь комбинирования размыкания и замыкания состоит в альтерна-
альтернативной последовательной фильтрации. Одна из форм альтернативной последо-
последовательной фильтрации заключается в серии фильтраций размыканием-замыка-
размыканием-замыканием рядом структурообразующих элементов с увеличивающимися размерами.
Следующая последовательность команд иллюстрирует этот процесс, который на-
начинается с малого структурообразующего элемента с последующим увеличением
его размера до тех пор, пока он не сравняется с элементом, использованным при
построении рис. 9.25, б) и в):
» fasf = f;
>> for k = 2:5
se = streK'disk' , k) ;
fasf = imclose(imopen(fasf, se), se);
end
9.6. Полутоновая морфология
Результат приведен на рис. 9.25, г). Он является более гладким по сравнением с
результатом простой фильтрации размыканием-замыканием, но платой служат
дополнительные вычислительные затраты. ?
Рис. 9.25. Сглаживание а\
при помощи размыкания
и замыкания, а) Исходное
изображение деревянных
шпонок, б) Изображение,
разомкнутое с помощью
круга радиуса 5. в) Замы-
Замыкание результата размы-
размыкания, г) Результат альтер-
альтернативной последователь-
последовательной фильтрации v
в)
Пример 9.10. Применение преобразования «верх шляпы».
Размыкание можно использовать для компенсации неравномерной яркости фона
изображения. На рис. 9.26, а) дано изображение f зерен риса, на котором фон
в нижней части темнее, чем в верхней части изображения. Неравномерный фон
создает трудности при пороговой обработке изображений (см. § 10.3). Например,
на рис. 9.25, б) приведен результат пороговой обработки, на которой зерна из
верхней части хорошо отделены от фона, а из нижней части — плохо. Размыкание
изображения может дать правильное приближение фона, если структурообразу-
структурообразующий элемент достаточно велик, чтобы целиком поместиться внутри каждого
рисового зернышка. Например, командами
>> se = streK'disk' , 10);
>> fo = imopen(f, se) ;
совершается размыкание изображения на рис. 9.26, в). Если вычесть это изобра-
изображение из исходного, то получится изображение зерен на достаточно однородном
фоне:
>> f2 = imsubtract(f , f о) ;
Рис. 9.26, г) показывает результат этого действия, а на рис. 9.26, д) приведено
новое изображение после пороговой обработки. Налицо эффект улучшения.
Вычитание разомкнутого изображения из исходного называется преобразовани-
преобразованием «верха шляпы». Функция IPT imtophat выполняет эти действия за один шаг:
>> f2 = imtophat (f, se);
Глава 9. Морфологическая обработка изображений
Функцию imtophat можно вызывать командой g = imtophat (f, NHOOD), где
NHOOD — это массив из нулей и единиц, которые обозначает размер и форму
используемого структурообразующего элемента. Этот синтаксис схож с вызовом
этой функции в виде imtophat (f, strel (NHOOD) ).
Сопряженная функция imbothat совершает преобразование «дно шляпы», ко-
которое по определению есть замыкание изображения минус само изображение.
Ее форма вызова подобна синтаксису функции imtophat. Эти функции можно
употреблять в сочетании друг с другом, например, для усиления контрастности
командами вида
>> se = strel('disk', 3);
>> g = imsubtract(imadd(f, imtophat(f, se)), imbothat(f , se)); ?
Рис. 9.26. Преобразование «верх шляпы», а) Исходное изображение, б) Изображение
после пороговой обработки, в) Разомкнутое изображение, г) Преобразование
«верх шляпы», д) «Верх шляпы» после пороговой обработки. (Изображение
предоставлено компанией The MathWorks, Inc)
Пример 9.11. Гранулометрия.
Методы определения размеров рассыпанных объектов на изображении составля-
составляют важную часть гранулометрии. Для нахождения размеров объектов можно
воспользоваться неявным морфологическими подходом, т. е. без измерения раз-
размеров каждого отдельного объекта. Для объектов с регулярными формами, ко-
которые ярче, чем фон изображения, метод заключается в применении морфологи-
9.6. Полутоновая морфология
ческого размыкания с увеличивающимися размерами. Для каждого акта размы-
размыкания вычисляется сумма всех значений пикселов. Эта сумма иногда называется
площадью поверхности изображения. Следующие команды реализуют размыка-
размыкание с помощью (структурообразующего элемента) круга, радиус которого меня-
меняется от 0 до 35, применительно к изображению 9.25, а):
» i = imread('plugs.jpg');
>> sumpixels = zeros(l, 36);
>> for k = 0:35
se = strel('disk', k);
fo = imopen(f, se);
sumpixels(k + 1) = sum(fo(:));
end
>> plot @:35, sumpixels), xlabel('k'), ylabelC Surf ace area')
10
20
30
20
30
Рис. 9.27. Гранулометрия, а) Площадь поверхности как функция радиуса структурооб-
структурообразующего элемента, б) Уменьшение площади поверхности как функция ра-
радиуса структурообразующего элемента, в) Уменьшение площади поверхности
как функция радиуса для сглаженного изображения
На рис. 9.27, а) приведен график зависимости sumpixels от радиуса к. Более
наглядным является график уменьшения площади поверхности между последо-
Глава 9. Морфологическая обработка изображений
вательными размыканиями:2
>> plot(-dif f (sumpixels))
>> xlabel('k')
>> ylabelO Surface area reduction')
Пики на рис. 9.27, б) говорят о присутствии большого числа объектов, имеющих
этот радиус. Поскольку исходное изображение является достаточно зашумлен-
зашумленным, мы повторили эту процедуру применительно к его сглаженной версии на
рис. 9.25, г). Результат построен на рис. 9.27, в). Теперь имеется достаточно осно-
оснований, чтобы сделать вывод о присутствии двух характерных размеров объектов
на исходном изображении. ?
9.6.3. Реконструкция
Морфологическая реконструкция по-
полутоновых изображений определяет-
определяется с помощью итеративной процеду-
процедуры, описанной в § 9.5 для двоичных
изображений. Рис. 9.28 показывает, как
это преобразование работает в одно-
одномерном случае. Верхняя кривая на
рис. 9.28, а) является маской, а ниж-
нижняя (серая) кривая служит маркером.
В этом примере маркер построен про-
простым вычитанием некоторой констан-
константы из маски, однако в общем случае
любой сигнал может служить марке-
маркером при условии, что ни одно из его
значений не превосходит соответству-
соответствующей величины маски. Каждая ите-
итерация процедуры реконструкции раз-
размазывает пики на кривой-маркере, по-
пока они усиливаются снизу кривой-
маской [см. рис. 9.28, б)].
Окончательный результат рекон-
реконструкции показан на рис. 9.28, в). За-
Заметьте, что два малых пика исчезли
на реконструкции, в то время как два
высоких остались, но они стали ниже. Если маркерное изображение получается
путем вычитания константы h из изображения-маски, то такая реконструкция
называется преобразованием h-минимума. Преобразование ^-минимума выпол-
выполняется в IPT функцией imhmin. Она позволяет удалять малые локальные пики.
Рис. 9.28. Полутоновая морфологическая ре-
реконструкция в случае одного измерения, а) Кри-
Кривые маски (сверху) и маркера, б) Итеративное
вычисление при реконструкции, в) Результат ре-
реконструкции (черная кривая)
2Если v — это вектор, то diff (v) возвращает вектор короче исходного на один элемент, компо-
компоненты которого равны разностям соседних элементов. Если X — матрица, то diff (X) возвращает
матрицу разности строк XB: end,:) - XA: end-1,:).
9.6. Полутоновая морфология
Другая полезная техника реконструкции выполняется процедурой размыка-
размыкание реконструкцией, при которой исходное изображение сначала подвергается
эрозии, как при обычном морфологическом размыкании. Затем, однако, вместо
того, чтобы применять замыкание, полученное изображение используется в каче-
качестве маркера при выполнении реконструкции. А в качестве маски используется
само исходное изображение. На рис. 9.29, а) показан пример размыкания рекон-
реконструкцией, полученный после выполнения команд
>> f = imreadCplugs.jpg');
>> se = streK'disk' , 5);
>> fe = imerode(f, se) ;
>> fobr = imreconstruct (f e, f) ;
Рис. 9.29. а) Размыкание ре- а) 6)
конструкцией, б) Размыкание
реконструкцией, после которо-
которого выполняется замыкание ре-
реконструкцией .
Реконструкцию можно применять для дальнейшей подчистки изображения
fobr, применяя так называемую технику замыкания реконструкцией. Замыка-
Замыкание реконструкцией состоит из взятия дополнительного изображения, выполне-
выполнения размыкания реконструкцией и вычисления вновь дополнения. Эти шаги со-
совершаются командами
>> fobr с = imcomplement (f obr) ;
>> fobrce = imerode(f obrc, se) ;
>> fobrcbr = imcomplement(imreconstruct(fobrce, fobrc));
На рис. 9.29, б) показан результат размыкания реконструкцией, за которым при-
применено замыкание реконструкцией. Сравните его с результатами применения
фильтра размыкания-замыкания и альтернативного последовательного фильтра
на рис. 9.25.
Пример 9.12. Использование реконструкции для удаления сложного фона изоб-
изображения.
В заключение этой главы мы выполним несколько шагов полутоновой рекон-
реконструкции. Задача заключается в выделении текстовых символов на изображении
кнопок калькулятора, приведенного на рис. 9.30, а). Первый шаг состоит в уда-
удалении линий горизонтальных отблесков наверху каждой кнопки. Для этого мы
воспользуемся тем фактом, что эти отблески длиннее, чем любой текстовый сим-
символ изображения. Мы выполняем размыкание реконструкцией, используя струк-
структурообразующий элемент, представляющий длинный горизонтальный отрезок:
Глава 9. Морфологическая обработка изображений
» f = imread('calculator.jpg');
>> f_obr = imreconstruct(imerode(f, ones(l, 71)), f);
>> f_o = imopen(f, ones(l, 71)); °/e For comparison.
Результат размыкания реконструкцией показан на рис. 9.30, б). Для сравнения
на рис. 9.30. в) приведен результат стандартного размыкания (f _o). Размыкание
реконструкцией лучше извлекает фон между соседними кнопками по горизон-
горизонтали. Процесс вычитания результата размыкания реконструкцией из исходного
изображения называется преобразованием «верх шляпы» реконструкцией, и он
показан на рис. 9.30, г)
Рис. 9.30. Применение полутоновой реконструкции, а) Исходное изображение, б) Раз-
Размыкание реконструкцией, в) Размыкание, г) «Верх шляпы» реконструкцией.
д) «Верх шляпы», е) Размыкание реконструкцией г) с использованием горизон-
горизонтального отрезка, эю) Дилатация е) с использованием горизонтального отрезка.
з) Окончательный результат реконструкции
>> f.thr = imsubtract(f, f _obr) ;
>> f_th = imsubtract (f, f _o); °/0 Or imtoph.at(f, ones(l, 71))
Выводы 395
На рис. 9.30, д) дан результат обычной операции «верх шляпы» (т. е. изображе-
изображение f _th).
Теперь мы удалим линии вертикальных отблесков на правой стороне каждой
кнопки на рис. 9.30, г). Для этого мы воспользуемся размыканием реконструк-
реконструкцией с элементом, который есть короткий горизонтальный отрезок:
>> g_obr = imreconstruct(imerode(f_thr, ones(l, 11)), f_thr);
На полученном изображении [см. рис. 9.30, е)\ вертикальные отблески исчезли.
Однако это же случилось с символами, у которых имеются тонкие вертикальные
черточки, например, пропала косая черта у символа процента «%», и исчезла
вся буква «I» в слове ASIN. Тогда мы воспользуемся тем обстоятельством, что
буквы с удаленными по ошибке деталями будут близки к другим символам, если
сначала выполнить дилатацию [рис. 9.30, ж)],
>> g_obrd = imdilate(g_obr, ones(l, 21));
а затем уже совершить окончательную реконструкцию с изображением f _thr в
качестве маски и min(g_obrd) в качестве маркера:
>> f2 = imreconstruct(min(g_obrd, f_thr) , f_thr) ;
На рис. 9.30, з) приведен окончательный результат. Заметим, что на этом
изображении успешно удалены все тени на фоне изображения и все отблески
на кнопках. ?
Выводы
Изложенные в этой главе понятия и методы, связанные с морфологическим ана-
анализом изображений, образуют весьма эффективный набор инструментов для из-
извлечения различных свойств и характеристик изображений. Основные операции
дилатации, эрозии и реконструкции, определенные как для двоичных, так и для
полутоновых изображений, могут применяться в различных комбинациях для
решения весьма широкого спектра задач обработки изображений. В следующей
главе будет показано, как морфологический анализ используется при сегмента-
сегментации изображений. Кроме того, морфологические методы играют ключевую роль
в алгоритмах описания изображений, что будет обсуждаться в гл. 11.
ГЛАВА IО
СЕГМЕНТАЦИЯ
ИЗОБРАЖЕНИЙ
Введение
В предыдущей главе мы перешли от рассмотрения низкоуровневых методов об-
обработки изображений, когда на входе и выходе присутствуют изображения, к
изучению методов среднего и высокого уровня, где на вход подается изображе-
изображение, а выходом процесса обработки служат некоторые свойства и атрибуты, из-
извлеченные из изображения. Сегментация — это следующий важный шаг в этом
направлении.
Сегментация делит изображение на составные части и объекты. Степень де-
детализации этого деления зависит от решаемой задачи. Иными словами, сегмен-
сегментацию следует остановить, когда интересующие объекты уже выделены или изо-
изолированы. Например, при осуществлении автоматического контроля при сборке
узлов радиоэлектронной аппаратуры важно уметь выявлять определенные де-
дефекты изготавливаемых приборов, таких как отсутствие компонентов или на-
наличие разрывов контактных дорожек на плате. Однако если такие дефекты уже
обнаружены, нет необходимости производить сегментацию более мелкого уровня.
Сегментация сложных изображений является весьма нетривиальной задачей
обработки изображений. Точность сегментации во многом определяет успех ко-
конечных компьютеризованных процедур анализа изображений. По этой причине
повышенное внимание должно быть уделено надежности первичной сегмента-
сегментации. В некоторых случаях, например, в приложениях контроля промышленных
изделий, можно в определенной степени управлять условиями текущей съем-
съемки. В других прикладных задачах, например, при дистанционном зондировании,
разработчик может лишь сосредоточить свои усилия на выборе подходящих сен-
сенсоров и детекторов.
Как правило, алгоритмы сегментации монохромных изображений основаны
на одном из двух базовых свойствах яркости изображения: разрывности и од-
однородности. В первом случае подход состоит в разбиении изображения на части
исходя из резких перепадов значений яркости, которые происходят, например,
на границах объектов. Вторая группа методов осуществляет разделение изобра-
изображений на области, однородные в смысле определенных, заранее заданных кри-
критериев.
В этой главе мы рассмотрим некоторые методы, основанные на этих двух
подходах, применительно к монохромным изображениям (обнаружение краев и
сегментация цветных изображений обсуждается в § 6.6). Мы начнем с представ-
представления методов, которые пригодны для обнаружения разрывов яркости, напри-
например, точек, линий, краев и перепадов. Выделение контуров объектов долгие годы
10.1. Обнаружение точек, линий и перепадов
являлось основой алгоритмов сегментации. Помимо обнаружения перепадов яр-
яркости как таковых, мы рассмотрим подход к обнаружению прямых участков,
основанный на преобразовании Хафа. После обсуждения выделения контуров мы
рассмотрим методы пороговых преобразований. Пороговая обработка также яв-
является одним из фундаментальных подходов к сегментации изображений, заво-
завоевавших популярность в приложениях, требующих быстрое принятие решения.
Затем будут изложены некоторые подходы к сегментации, ориентированные на
выделение областей. В конце главы мы рассмотрим морфологический подход к
сегментации, который называется сегментацией по водоразделам. Этот подход
особенно привлекателен, поскольку он приводит к замкнутым и четким облас-
областям. Кроме того, он является достаточно общим, а также позволяет использовать
априорную информацию об изображениях в конкретных приложениях для улуч-
улучшения результатов сегментации.
10.1. Обнаружение точек, линий и перепадов
В этом параграфе рассматривается техника обнаружения трех основных видов
разрывов яркости, встречающихся в цифровых изображениях: точки, линии и пе-
перепады. Наиболее общий способ поиска таких разрывов заключается в обработке
изображения скользящей маской, подобно тому, как описывалось в §§ 3.4 и 3.5.
Для маски размерами 3x3 эта процедура использует вычисление линейной ком-
комбинации коэффициентов маски со значениями яркости элементов изображения,
накрываемых маской. Отклик R этой процедуры в каждой точке изображения
задается выражением
9
R = W\Z\ + W\Z\ + h WgZg —
где Zi — это значение яркости пиксела, соответствующего коэффициенту мас-
маски W{. Как обычно, отклик маски присваивается элементу, над которым распо-
расположен центр маски.
10.1.1. Обнаружение точек
Обнаружение изолированных точек на изображении не
представляет большой сложности. Используя маску, пока-
показанную на рис. 10.1, будем считать, что в пикселе под цен-
центром маски обнаружена точка, если
-1
-1
-1
-1
8
-1
_1
-1
-1
где Т — это неотрицательное пороговое значение. Обна-
Обнаружение точек реализовано в IPT с помощью функции
imf ilter, которая использует маску на рис. 10.1 или дру-
другую похожую маску. Важное требование заключается в том, Р"с* 101* Маска для
г обнаружения точек
что самый сильный отклик маски должен происходить, ко-
когда центр маски совмещен с изолированной точкой, а в областях постоянной
яркости отклик должен быть равен 0.
Глава 10. Сегментация изображений
Если порог Т задан, то следующая команда выполняет обнаружение изоли-
изолированных точек в соответствии с описанным выше подходом:
>> g = abs(imfilter (double(f) , w)) >= T;
где f — это входное изображение, w — подходящая маска для обнаружения точек
(например, маска с рис. 10.1), a g — результирующее изображение. Напомним,
что функция imfilter возвращает результат в формате входного файла изоб-
изображения, поэтому мы воспользовались функцией double (f) в операции фильт-
фильтрации для предотвращения преждевременного усечения значений, если изобра-
изображение g было класса uint8, а кроме того, функция abs не допускает целых аргу-
аргументов. Выходное изображение g принадлежит классу logical, т. е. его значения
есть 0 или 1. Если порог Т не задан, то его величина часто определяется по ре-
результату фильтрации, и в этом случае приведенная выше команда разбивается
на три основных шага:
A) вычисление фильтрованного изображения по команде
abs(imfilter(double(f), w)),
B) нахождение значения Т по значениям фильтрованного изображения и
C) сравнение результата фильтрации с порогом Т.
Этот подход иллюстрируется в следующем примере.
Пример 10.1. Обнаружение точек.
На рис. 10.2, а) показано изображение с едва различимой изолированной черной
точкой на затемненной области в северо-восточном квадранте. Пусть f обознача-
обозначает это изображение. Мы обнаружим положение изолированной точки с помощью
следующих команд:
>> w = [-1 -1 -1; -1 8 -1; -1 -1 -1];
>> g = abs (imfilter (double (f), w));
>> T = max(g(:));
>> g = g >= T;
>> imshow(g)
Рис. 10.2. а) Полутоновое
изображение с едва различи-
различимой изолированной черной
точкой на затемненной обла-
области в северо-восточном квад-
квадранте, б) Изображение, по-
показывающее обнаруженную
точку (она увеличена для луч-
лучшей видимости)
10.1. Обнаружение точек, линий и перепадов
Здесь мы выбрали в качестве порога Т максимальное значение фильтрованного
изображения g, а затем нашли элементы g, для которых g >= Т, что отвечает
максимальному отклику. Мы исходили из предположения, что все такие точки
являются изолированными точками, расположенными на однородном (или почти
однородном) фоне. Заметим, что пороговый тест выполнен с помощью операции
>= для совместимости обозначений. Поскольку в данном случае порог Т является
максимальным значением g, нет точек из g, значение яркости которых больше,
чем Т. Из рис. 10.2, б) видно, что имеется ровно одна точка, которая удовлетво-
удовлетворяет условию g >= Т, где Т равно max(g(: )). ?
Другой подход к обнаружению точек заключается в поиске точек во всех
окрестностях тхп, для которых разность максимального и минимального зна-
значения превосходит некоторую заданную величину Т. Такой подход можно реали-
реализовать с помощью функции ordf ilt2, введенной в § 3.5.2:
>> g = imsubtract(ordfilt2(f, m*n, ones(m, n)), ...
ordfilt2(f, 1, ones(m, n)));
>> g = g >= T;
Легко проверить что выбор Т = max(g(:)) приводит к тому же результату, что и
на рис. 10.2, б). Предложенное решение является более гибким, чем использова-
использование маски из рис. 10.1. Пусть, к примеру, мы хотим вычислить разность между
самой большой величиной пиксела и следующей за ней по порядку. Для этого
достаточно заменить 1 в правой части выражения на m*n - 1. Другие вариации
на эту тему можно сформулировать аналогичным образом.
10.1.2. Обнаружение линий
Следующий уровень сложности заключается в обнаружении линий. Рассмотрим
маски на рис. 10.3. Если первую маску перемещать по изображению, то наиболь-
наибольший отклик будет наблюдаться на горизонтальных линиях толщиной в один пик-
пиксел. Причем, если яркость фона одинакова, то отклик будет максимальным, ко-
когда линия проходит горизонтально через центр маски. Аналогично, вторая маска
на рис. 10.3 даст наибольший отклик на линиях, имеющих наклон +45°, третья
маска — на вертикальных линиях, а четвертая — на линиях, имеющих наклон
—45°. Эти направления выделены на масках коэффициентами с наибольшим ве-
весом (в данном случае, равным 2). Сумма коэффициентов каждой маски равна
нулю, что дает нулевой отклик на областях постоянной яркости.
Обозначим через i?i, i?2? Дз и R± отклики масок, показанных на рис. 10.3 (сле-
(слева направо), причем формулы для Ri аналогичны формуле для вычисления R в
параграфе § 10.1. Пусть изображение обрабатывается независимо каждой маской.
Если для некоторой точки изображения \Ri\ > \R{\ при всех j ф г, то эта точка,
по-видимому, лежит на линии, которое имеет направление маски г. Например,
если в какой-то точке \R\\ > \Ri\ для j = 2,3,4, то эта точка, скорее всего, при-
принадлежит горизонтальной линии. Альтернативная задача заключается в поиске
линий, идущих в заданном направлении. В этом случае можно обработать все
изображение соответствующей маской, применяя пороговое преобразование, как
это делалось в предыдущем параграфе. Другими словами, если необходимо обна-
Глава 10. Сегментация изображений
ружить все линии на изображении, идущие в заданном направлении, достаточно
пройтись этой маской по всему изображению, сравнивая абсолютные значения
откликов с заданным порогом. Выделенные таким способом точки, отвечающие
наибольшим откликам, будут ближе всего примыкать к линиям (толщиной в один
пиксел), направление которых задано выбранной маской. Следующий пример ил-
иллюстрирует эту процедуру.
-1
2
-1
-1
2
-1
-1
2
-1
-1
-1
2
-1
2
-1
2
-1
-1
-1
-1
-1
2
2
2
-1
-1
-1
2
_ 1
-1
1
2
-1
-1
-1
2
Горизонтальная +45° Вертикальная
Рис. 10.3. Маски для обнаружения линий
-45°
Пример 10.2. Обнаружение линий заданного направления.
На рис. 10.4, а) дано двоичное изображение шаблона для изготовления выводов
кристаллов интегральных микросхем. Это изображение имеет размеры 486x486
пикселов. Предположим, что требуется найти все линии, имеющие толщину в
один пиксел и идущие под углом —45°. Для этого мы воспользуемся последней
маской из рис. 10.3. Рис. 10.4 с б) по е) построены при выполнении следующих
команд применительно к изображению f на рис. 10.4, а)\
» w = [2 -1 -1 ; -1 2 -1; -1 -1 2];
>> g = imfilter (double(f) , w) ;
]) 7o рис. 10.4, 6)
imshow(g, [ ])
gtop = g(l:120, 1:120);
gtop = pixeldup(gtop, 4);
figure, imshow(gtop, [ ])
gbot = g(end-119:end, end-119:end)
gbot = pixeldup(gbot, 4);
figure, imshow(gbot, [ ]) °/0 рис
g = abs(g);
figure, imshow(g, [ ])
T = max(g(:));
g = g >= T;
figure, imshow(g)
7. рис. 10.4, в)
10.4, г)
°/, рис. 10.4, д)
7. рис. 10.4, e)
Точки, более темные, чем общий серый фон на рис. 10.4, б), соответствуют отри-
отрицательным значениям. Имеется два сегмента, ориентированные под углом —45°,
один — вверх слева, а другой — внизу справа. [На рис. 10.4, в) и г), показаны
увеличенные участки окрестностей этих двух сегментов]. Отметим, что прямой
участок на рис. 10.4, г) существенно ярче, чем сегмент на рис. 10.4, в). Причина
10.1. Обнаружение точек, линий и перепадов
заключается в том, что нижний правый сегмент на рис. 10.4, а) имеет толщину
в один пиксел, а верхний левый сегмент — толще. Отклики маски сильнее для
компонент, толщина которых равна в точности одному пикселу.
е)
Рис. 10.4. а) Двоичное изображение шаблона соединений, б) Результат обработки маской
обнаружения линий под углом —45°. в) Увеличенная часть верхнего левого
угла изображения б), г) Увеличенная часть нижнего правого угла изображе-
изображения б), д) Модуль пикселов изображения б), е) Все точки (белые), значения
которых удовлетворяют условию g >= Т, где g это изображение д) (Точки
на е) слегка увеличены для лучшей видимости)
Рис. 10.4, д) отображает абсолютные значения рис. 10.4, б). Поскольку мы
ищем самые сильные отклики, положим порог Т равным максимальному значе-
значению этого изображения. Белым цветом на рис. 10.4, е) показаны точки, значения
которых удовлетворяют условию g >= Т, где g — это изображение на рис. 10.4, д).
Ряд изолированных точек на этом изображении также имеет самые сильные от-
отклики для данной маски. На исходном изображении эти точки и их ближайшие
соседи ориентированы так, что процедура взятия маски выдает максимальные
значения в этих точках. Эти изолированные точки можно обнаружить с помо-
помощью маски на рис. 10.1, а затем удалить. Эти точки можно также удалить с
помощью морфологических операций, рассмотренных в предыдущей главе. ?
10.1.3. Обнаружение перепадов с помощью
функции edge
Несмотря на то, что обнаружение точек и линий всегда приводится при обсуж-
обсуждении сегментации изображений, методы нахождения краев являются едва ли не
Глава 10. Сегментация изображений
самыми важными при обнаружении значимых разрывов яркости на изображе-
изображении. При поиске таких перепадов используются производные первого и второ-
второго порядка. Первые производные у лее применялись при обработке изображений
градиентом в § 6.6.1. Мы напомним соответствующие уравнения для удобства
читателя. Градиентом двумерной функции f(x,y) называется вектор
Модуль вектора градиента равен
[]
Для упрощения вычислений эту функцию иногда приближают следующей фор-
формулой:
мул ой:
Эта величина ведет себя примерно как производные, т. е. она равна нулю в об-
областях с постоянной яркостью и ее амплитуда пропорциональна скорости изме-
изменения яркости там, где яркость пикселов непостоянна. Часто на практике эту
приближенную величину называют «градиентом», что не вполне строго.
Основное свойство вектора градиента заключается в том, что он указывает в
сторону максимального роста изменения функции / в точке {х,у). Угол наклона
этого вектора равен
а(х, у) = arctg ( —^ J .
Важно уметь приближать производные Gx и Gy численно. Различные подходы
приближения производных, заложенные в функцию edge, обсуждаются далее в
этом параграфе.
Вторые производные при обработке изображений работают при вычислении
оператора Лапласа, который вводился в § 3.5.1. Напомним, что лапласиан дву-
двумерной функции f(x,y) равен
Сам лапласиан довольно редко используется при обнаружении перепадов, так как
он слишком чувствителен к шуму, кроме того, его амплитуда порождает сдвоен-
сдвоенные перепады, что не позволяет точно установить истинное направление перепа-
перепада яркости. Однако он является весьма полезным инструментом в сочетании с
другими приемами обнаружения перепадов, что будет видно из дальнейшего из-
изложения. Например, несмотря на наличие сдвоенных перепадов, которые не дают
прямо обнаружить соответствующий край, это свойство можно использовать при
локализации перепада.
После этого краткого напоминания отметим, что основная идея обнаружения
перепадов базируется на поиске мест изображения, где яркость меняется быстро,
с помощью следующих двух общих критериев:
10.1. Обнаружение точек, линий и перепадов
1. Найти места, где первая производная яркости превосходит по модулю неко-
некоторый заранее заданный порог.
2. Найти места, где вторые производные яркости имеют пересечения нулевого
уровня.
Функция IPT edge реализует несколько оценок производных для использо-
использования в приведенных выше критериях. Для некоторых из этих оценок имеется
возможность указать, к каким именно перепадам чувствительна данная оценка: к
горизонтальным, вертикальным или к перепадам обоих типов. Общий синтаксис
этой функции выглядит следующим образом:
[g, t] = edge(f, 'method', parameters),
где f — это входное изображение, method — одна из оценок, перечисленных в
табл. 10.1, a parameters — дополнительные параметры, которые объясняются
ниже. Выходом функции служит логический массив g, в котором стоят единицы
там, где обнаружены точки перепада на f, и нули там, где перепады не обна-
обнаружены. Аргумент t является необязательным, в него записывается значение
порога, которое функция edge использовала для сравнения с градиентами точек
изображения.
Таблица 10.1. Детекторы краев, доступные в функции edge
Детектор краев Основные свойства
Собела Обнаруживает края с помощью приближений Собела первых про-
производных, заданных на рис. 10.5, б).
Превитта Обнаруживает края с помощью приближений Превитта первых
производных, заданных на рис. 10.5, в).
Робертса Обнаруживает края с помощью приближений Робертса первых
производных, заданных на рис. 10.5, г).
Лапласиан гауссиана Обнаруживает края, выполняя поиск пересечений нулевого уров-
уровня после фильтрации /(х, у) гауссианом.
Пересечения нулевого Обнаруживает края, выполняя поиск пересечений нулевого
уровня уровня после фильтрации /(ж, у) фильтром, заданным пользова-
пользователем.
Канни Обнаруживает края, выполняя поиск локальных максимумов гра-
градиента /(х, у). Градиент вычисляется от гауссиана. Метод исполь-
использует два порога для нахождения сильных и слабых краев. Слабые
края включаются в выход, если они связаны с сильными. Следо-
Следовательно, этот метод с большей вероятностью обнаруживает на-
настоящие слабые края.
Детектор Собела
Детектор Собела для обнаружения перепадов использует маски из рис. 10.5, б)
для численного приближения производных Gx иСу. Другими словами, градиент
в центральной точке окрестности вычисляется по формуле
1 /О
Zg) ~ (Zi + 222 + Z3)}2 + [(z3 + 2z6 + Zg) - (zi + 2z4 )]2}
404 Глава 10. Сегментация изображений
Мы скажем, что пиксел с координатами (х, у) является пикселом перепада, если
для него д > Т, где Т — это выбранный порог.
а)
Z\
Z4
Zl
Z2
Z5
*8
Z3
Z6
Z4
-1
0
1
-2
0
2
-1
0
1
(z7 + 2Zs + z9)
zi + 2z2 + z.O
-1
0
1
-1
0
1
-1
0
1
Ox = (z7 + zb + z9)
fa + z2 + z3)
-1
0
0
1
Рис. 10.5. Некоторые маски детекто-
детекторов и реализуемые ими формулы при-
приближения для первых производных
Окрестностные
маски детекторов
-1
-2
-1
0
0
0
1
2
1
Детектор
Собела
Gv
z9)"
-1
-1
-1
0
0
0
1
1
1
= (z3
(
z9) -
Детектор
Превитта
0
1
-1
0
Gv = zs ~
Детектор
Робертса
Из материалов § 3.5.1 известно, что обнаружение края методом Собела можно
реализовать фильтрацией изображения f (используя функцию imf ilter) левой
маской на рис. 10.5, б), затем фильтрацией f правой маской, после чего следует
возвести результаты фильтраций в квадрат, все сложить и извлечь квадратный
корень из полученной суммы. Аналогичный комментарий можно составить для
второй и третьей записи в табл. 10.1. Функция edge всего лишь объединяет опи-
описанные операции для их выполнения одним вызовом, а кроме того, добавляет
ряд дополнительных возможностей, а именно: задание порога или его автомати-
автоматическое определение самой функцией. Кроме того, функция edge имеет некоторые
технические особенности, которые не реализованы в функции imf ilter.
10.1. Обнаружение точек, линий и перепадов
Детектор Собела вызывается командой
[g, t] = edge(f, 'sobel', T, dir),
где f — это входное изображение, Т — заданный порог, а переменная dir обо-
обозначает предпочтительное направление для обнаружения края, которая имеет
следующие значения: 'horizontal', 'vertical', или 'both' (принято по умол-
умолчанию). Как уже сообщалось, g — это логический массив, в котором 1 стоят там,
где обнаружен край, а 0 - там, где его нет. Выходной параметр t не является
обязательным. Если он задан, то в него записывается значение порога, использо-
использованного функцией edge. Если входной параметр Т задан, то t = Т. В противном
случае, если Т не задан (или пуст, т.е. равен [ ]), то t равен автоматически
выбранному порогу, который и использовался при обнаружении края. Одна из
причин включения выходного параметра t заключается в задании начального
значения для порога. Функция edge использует детектор Собела по умолчанию,
если применен синтаксис [g, t] = edge(f) или просто g = edge(f).
Детектор Превитта
Детектор Превитта использует маску из рис. 10.5, в) для численного приближе-
приближения первых производных Gx и Gy. Его общая форма вызова имеет вид
[g, t] = edge(f, 'prewitt', T, dir).
Параметры этой функции имеют тот же смысл, что и в детекторе Собела. Де-
Детектор Превитта немного легче реализовывать с вычислительной точки зрения,
чем детектор Собела, однако при этом возрастает невязка (ошибка) вычислений.
(Можно показать, что коэффициенты 2 в масках Собела обеспечивает некоторое
сглаживание результата.)
Детектор Робертса
Детектор Робертса основан на маске из рис. 10.5, г) для приближения Gx и Gy.
Его форма вызова имеет вид
[g, t] = edge(f, 'roberts', T, dir).
Параметры этой функции имеют тот же смысл, что и в детекторе Собела. Де-
Детектор Робертса является одним из самых старых детекторов, используемых при
обработке цифровых изображений, и из рис. 10.5, г) видно, что он устроен проще
других. Однако этот детектор используется существенно реже всех остальных,
приведенных на рис. 10.5, по причине его ограниченной функциональности (на-
(например, он несимметричен, его нельзя обобщить для обнаружения краев, угол
наклона которых является кратным 45° и т. д.). Тем не менее, он все еще исполь-
используется во многих аппаратных реализациях, где простота и скорость являются
определяющими факторами обработки.
Детектор лапласиан гауссиана (LoG)
Рассмотрим функцию Гаусса
__р2_
h(r) = —е 2<т2 ?
Глава 10. Сегментация изображений
где г2 = х2 -\-у2, а а — это стандартное отклонение. Свертка этой сглаживающей
функции с изображением приводит к его расфокусировке. Степень расфокуси-
расфокусировки определяется значением а. Лапласиан функции Гаусса (вторая производ-
производная по г) равен
V2/i(r) = -
г2-а2
Эту функцию, по очевидным причинам, принято называть лапласианом гаусси-
ана (LoG). Поскольку взятие второй производной является линейной операцией,
то свертка (фильтрация) изображения с V2h(r) — это то же самое, что свертка
функции со сглаживающей функцией, а затем применение оператора Лапласа к
результату. В этих действиях проявляются ключевые свойства детектора LoG.
Свертка изображения с V2/i(r) даст два эффекта: она сглаживает изображение
(сокращает шум) и вычисляет лапласиан, что выявляет сдвоенные края на изоб-
изображении. Окончательная локализация краев состоит в нахождении пересечений
нулевого уровня между двойными краями.
Общая форма вызова детектора LoG имеет вид
[g, t] = edge(f, 'log', T, sigma),
где sigma — это стандартное отклонение, а остальные параметры объяснялись
выше. Значение sigma по умолчанию равно 2. Как и раньше, функция edge иг-
игнорирует перепады, значение которых меньше порога Т. Если Т не задано или
оно пусто, edge выбирает порог автоматически. Если положить Т = 0, то функ-
функция edge построит замкнутые контуры, что является обычной характеристикой
метода LoG.
Детектор пересечения нулевого уровня
Этот детектор основан на том же принципе, что и метод LoG, но свертка выпол-
выполняется с фильтром Н, который задается пользователем. Он имеет синтаксис
[g, t] = edge(f, 'zerocross', T, H).
Остальные параметры объяснены при описании детектора LoG.
Детектор Канни
Детектор Канни (см. [Canny, 1986]) является самым мощным детектором, зало-
заложенным в функцию edge. Этот метод молено кратко описать следующим образом:
1. Изображение сглаживается гауссовым фильтром с заданным стандартным
отклонением а для сокращения шума.
2. В каждой точке вычисляется градиент д{х,у) = [Gx + G2] и направле-
направление края а{х,у) = arctg (Gy/Gx). Для нахождения Gx и Gy можно исполь-
использовать любой метод из табл. 10.1. Точки перепада определяются как точки
локального максимума градиента.
3. Точки перепада, определенные в п. 2, вызывают рост гребней на изобра-
изображении модуля градиента. Затем алгоритм отслеживает верх этих гребней
и присваивает нулевое значение точкам, которые не лежат на гребне. В ре-
результате на выходе строится тонкая линия, а весь этот процесс называется
10.1. Обнаружение точек, линий и перепадов
немаксимальным подавлением. Затем пикселы гребня подвергаются поро-
пороговой обработке с использованием двух порогов Т1 и Т2, причем XI < Т2.
Пикселы гребня, величина которых больше Т2, называются «сильными»,
а пикселы, значения которых попадают в интервал [Т1,Т2], называются
«слабыми».
4. Наконец, алгоритм совершает соединение, добавляя к сильным пикселам
слабые, которые 8-связаны с сильными.
Синтаксис детектора Канни для обнаружения перепадов имеет вид
[g, t] = edge(f, 'canny', T, sigma),
где Т — это вектор [Tl, T2], состоящий из порогов, описанных в п.З, a sigma
обозначает стандартное отклонение сглаживающего фильтра. Если параметр t
включен в выходные аргументы, то он является вектором из двух компонент, ку-
куда записаны два порога, использованные алгоритмом. Все остальные параметры
имеют обычный смысл, объясненный для других методов, включая автоматиче-
автоматическое определение порогов, если вектор Т не задан. Значение sigma по умолчанию
равно 1.
Пример 10.3. Извлечение краев с помощью детектора Совела.
Мы можем получить и отобразить вертикальные края на изображении f из
рис. 10.6, а) с помощью следующих команд:
>> [gv, t] = edge(f, 'sobel', 'vertical');
>> imshow(gv)
>> t
t =
0.0516
Как показано на рис. 10.6, б), на результирующем изображении преобладают
вертикальные края (отображены также некоторые края, которые имеют и вер-
вертикальные, и горизонтальные компоненты). Мы можем подчистить слабые края,
выбрав более высокий порог. Например, рис. 10.6, в) построен командой
>> gv = edge(f, 'sobel', 0.15, 'vertical');
Используя то же значение Т в команде
>> gboth = edge(f, 'sobel', 0.15);
получим результат на рис. 10.6, г), на котором доминируют как вертикальные,
так и горизонтальные края.
Функция edge с опцией sobel не позволяет обнаружить края под углом ±45°.
Чтобы выделить такие перепады, необходимо задать специальную маску и вос-
воспользоваться функцией imf ilter. Например, рис. 10.6, д) построен с помощью
команд1
>> w45 = [-2 -1 0; -1 0 1; 0 1 2]
1 Величина порога Т подобрана экспериментально, чтобы результат молено было сравнить с
рис. 10.6, в) и г).
Глава 10. Сегментация изображений
w45 =
-2 -1 О
-10 1
0 12
>> g45 = imfilter(double(f), w45, 'replicate');
>> T = 0.3*max(abs(g45(:))) ;
>> g45 = g45 >= T;
>> figure, imshow(g45) ;
Самый сильный край на рис. 10.6, д) имеет наклон 45°. Аналогично, использо-
использование маски wm45 = [0 12; -101; -2-10] с той же последовательностью
команд дает возможность выделить края, ориентированные под углом —45°, что
показано на рис. 10.6, е). ?
Рис. 10.6. а) Исходное изображение, б) Результат функции edge с использованием верти-
вертикальной маски Собела и с автоматическим порогом, в) Результат с заданным
порогом, г) Результат выявления вертикальных и горизонтальных краев при
помощи заданного порога, д) Результат обнаружения краев под углом 45° с
использованием функции imf ilter с заданными маской и порогом, е) Резуль-
Результат обнаружения краев под углом —45° с использованием функции imf ilter с
заданными маской и порогом
10.1. Обнаружение точек, линий и перепадов
Пример 10.4. Сравнение результатов обнаружения краев с помощью детек-
детекторов Собела, LoG и Канни.
В этом примере мы сравним возможности детекторов Собела, LoG и Канни при
обнаружении краев и перепадов. Наша цель заключается в построении чистой
«карты» краев, выделив самые существенные детали на изображении здания f на
рис. 10.6, а) и удалив «несущественные» вроде особенности текстуры кирпичной
кладки стен или черепицы крыши. Основными линиями конструкции здания для
нас являются углы здания, вход, проемы окон, элементы окантовки окон и входа
из светлого кирпича, линии крыши, а также белая бетонная полоса, окружающая
здание примерно на расстоянии двух третей от его высоты.
Рис. 10.7. Левая колонка: результаты детекторов Собела, LoG и Канни с параметрами
по умолчанию. Правая колонка: результаты, полученные интерактивно, при
выявлении существенных деталей исходного изображения на рис. 10.6, а) и при
удалении лишних деталей. Самый лучший результат получается у детектора
Канни
Левая колонка изображений на рис. 10.7 показывает результаты обнаружения
краев при использовании опций 'sobel', 'log' и 'canny' в командах
>> [g_sobel_default, ts] = edge(f, 'sobel'); °/0 рис. 10.7, a)
» [g_log_default, tlog] = edge(f, 'log'); % рис. 10.7, в)
>> [g_ canny .default, tc] = edge(f, 'canny'); °/0 рис. 10.7, д)
Значения порогов в выходных аргументах при выполнении этих команд равня-
равнялись бедующим величинам: ts = 0.074, tlog = 0.0025, и tc = [0.019, 0.047].
Значение параметра sigma для опций 'log' и 'canny' было, соответственно, 2
и 1. За исключением изображения детектора Собела, параметры по умолчанию
у других детекторов не дали же лаемой чистой «карты» исходного изображения.
Глава 10. Сегментация изображений
Начав от значения по умолчанию, параметры для каждой опции были ин-
интерактивно проварьированы для получения самого лучшего обнаружения ука-
указанных выше деталей исходного изображения и удаления ненужных деталей,
насколько это было возможно. Результат показан в правой колонке изображений
на рис. 10.7. Он получен следующими командами:
>> g_sobel_best = edge(f, 'sobel', 0.05); Ув рис. 10.7, 6)
>> g_log_best = edge(f, 'log5, 0.003, 2.25); 7, рис. 10.7, г)
>> g_canny_best = edge(f, 'canny', [0.04 0.10], 1.5); °/в рис. 10.7, e)
На рис. 10.7, б) видно, что результат Собела, на самом деле, только ухудшается
при попытке выявить бетонную полосу и левую сторону входа здания. Результат
LoG на рис. 10.7, г) немного лучше Собела и значительно превосходит результат
LoG с параметрами по умолчанию. Однако и здесь не удается выявить полно-
полностью ни левую сторону входа, ни бетонную полосу. Результат детектора Канни на
рис. 10.7, е) превосходит все прочие результаты. Обратите внимание, что здесь
четко обозначен левый край входа в здание, видна бетонная полоса и другие
детали, например, контуры вентиляционной решетки над входом. Помимо выяв-
выявления всех деталей, детектор Канни позволяет получить самую ясную «карту»
изображения. ?
10.2. Обнаружение линий с помощью
преобразования Хафа
В идеале рассмотренные выше методы должны обнаруживать только пикселы,
принадлежащие краям и перепадам яркости. Однако на практике выделенные
пикселы редко относятся только к этой категории в силу многих причин: воз-
воздействия шума, разрыва краев из-за неравномерного освещения и других фак-
факторов, которые вносят ложные перепады яркости в изображения. Поэтому за
алгоритмом обнаружения краев обычно следует процедура компоновки выделен-
выделенных пикселов краев в настоящие, осмысленные линии и краевые сегменты. Один
из подходов к выполнению подобных действий основан на преобразовании Хафа
[Hough, 1962]).
Имея некоторое множество точек изображения (обычно двоичного), предпо-
предположим, что требуется найти подмножества этих точек, которые лежат на пря-
прямых линиях. Один возможный подход заключается в построении всевозможных
прямых, задаваемых парами этих точек, а потом в обнаружении точек, кото-
которые расположены близко к конкретным прямым. Проблема реализации такой
процедуры связана с необходимостью рассмотрения п(п — 1)/2 ~ п2 прямых, а
затем в выполнении порядка п(п(п — 1)) /2 ~ п3 операций сравнения всех точек
с каждой из этих прямых. Вычислительная сложность такого решения позволяет
применять его лишь в самых простых прикладных задачах.
Имея преобразование Хафа, возможен иной подход. Рассмотрим любую точку
(xi,yi) и все проходящие через нее прямые. Все такие прямые удовлетворяют
уравнению yi = ах{ + Ь для произвольных значений а и Ь. Однако если переписать
это уравнение в виде Ъ = —axi +yi и рассмотреть соответствующую аб-плоскость
10.2. Обнаружение линий с помощью преобразования Хафа
(называемую пространством параметров), то оно задаст единственную прямую
для каждой фиксированной координатной пары (х{,уг). Более того, другой точке
(xj,yj) соответствует своя прямая в пространстве параметров, и эти две прямые
пересекаются в некоторой точке (а7, 6'), где о! — это угловой коэффициент, а Ь1 —
точка пересечения с осью у прямой, проходящей через точки (x{,yi) и (xj,yj)
на ху-плоскости. На самом деле, у каждой точки этой прямой имеется прямая в
пространстве параметров, причем все такие прямые пересекаются в точке (о!, Ь').
Эти понятия иллюстрируются на рис. 10.8.
а)
б)
= -xia-yi
Рис. 10.8. а) Плоскость ху. б) Пространство параметров аЪ
В принципе, можно построить на графике все параметрические прямые, со-
соответствующие всем заданным точкам (х^У;) изображения, а затем все линии
изображения можно идентифицировать с помощью точек пересечения парамет-
параметрических прямых. При этом возникает вычислительная трудность, связанная с
тем, что число а (угловой коэффициент) стремится к бесконечности, когда пря-
прямая близка к вертикали. Один из способов справиться с этой проблемой состоит
в представлении уравнения прямой с помощью ее вектора нормали:
х cos в + у sin в = р.
На рис. 10.9, а) приведена геометрическая интерпретация параметров р и в. Гори-
Горизонтальная прямая имеет 0 = 0°, а параметр р равен (положительной) координате
пересечения прямой с осью х. Аналогично, вертикальная прямая имеет в = 90°,
а р равно координате пересечения с положительной полуосью у или в — —90°,
ар — координате пересечения с отрицательной полуосью у. Каждая синусои-
синусоидальная кривая на рис. 10.9, б) отвечает семейству прямых линий, проходящих
через некоторую точку (?г?2/г)- Точка пересечения кривых (р',0') соответствует
прямой, проходящей через обе точки (хг?2/г) и (xjiVj)-
Привлекательность преобразования Хафа с точки зрения вычислений проис-
происходит из возможности разбиения пространства параметров рв на так называемые
ячейки накопления, как показано на рис. 10.9, в), где (pmin7Pmax) и (9т\п,втах) —
предполагаемые диапазоны значений параметров. Обычно эти значения варьиру-
варьируются в интервалах —90° < в < 90° и — D < р < D, где D — это расстояние между
угловыми точками изображения. В ячейке с координатами (г, j) накапливается
Глава 10. Сегментация изображений
значение A(i,j) для квадрата в пространстве параметров, соответствующего точ-
точке (pi, Qj). Вначале значения всех ячеек накопления равны нулю. Затем для каж-
каждой точки (xkiVk) выбранного множества на изображении полагаем параметр в
равным каждому разрешенному дискретному значению Oj в ячейках 0-оси и нахо-
находим соответствующее ему значение, решая уравнение р = Xk cos6 + yk sin#. Затем
найденные величины р округляются до ближайшего разрешенного дискретного
значения pi из ячеек р-оси. После этого значение соответствующей ячейки накоп-
накопления увеличивается на единицу: A(i,j) := A(i,j) +1. В конце процедуры ячейка
A(i,j) равна числу Q, которое означает, что Q точек плоскости ху лежат на пря-
прямой xcosOj -\-ysmOj = pi. Точность попадания этих точек на прямую зависит от
числа ячеек накопления в пространстве рв.
а)
Pmin
„_.!__„!.„_.
•I-....
: :
-—!—4—
—:—i—i—:
- —s
! ! !
...4—-i-—i—-i
Рис. 10.9. а) Параметризация (р, в) прямых на плоскости ху. б) Синусоиды в плоско-
плоскости рв. Точка пересечения {р1,0') соответствует параметрам прямой, соединя-
соединяющей точки (xi, yi) и (хj, у3;). в) Разделение плоскости рв на ячейки накопления
Далее рассматривается М-функция для вычисления преобразования Хафа.
Эта функция использует операции с разреженными матрицами, которые имеют
малое число ненулевых элементов. Свойство разреженности позволяет получить
выигрыш как при хранении данных, так и при вычислениях. Имея матрицу А,
преобразуем ее в разреженный матричный формат с помощью функции sparse,
которая имеет синтаксис
S = sparse(А).
Например,
>> А = [ 0 0 0 5
0 2 0 0
13 0 0
0 0 4 0];
>> S = sparse (А)
S =
C,1)
B,2)
C,2)
D,3)
A,4)
1
2
3
4
5
10.2. Обнаружение линий с помощью преобразования Хафа
Здесь перечислены все ненулевые элементы S вместе с их индексами строк и
столбцов. Элементы упорядочены по столбцам.
Имеется форма обращения к функции sparse с пятью аргументами, которая
используется чаще всего:
S = sparse(г, с, s, m, n).
Здесь г и с — это векторы индексов строк и столбцов ненулевых элементов мат-
матрицы, которую мы хотим перевести в разреженный формат. Параметр s пред-
представляет собой вектор значений, отвечающих индексным парам (г, с), a m и
п обозначают число строк и число столбцов построенной матрицы. Например,
матрицу S из предыдущего примера можно прямо построить командой
>> S = sparse([3 2 3 4 1], [12234], [1 2 3 4 5] , 4, 4) ;
Существуют и другие синтаксические формы обращения к функции sparse, ко-
которые можно узнать из справочной информации по этой функции.
Имея разреженную матрицу S, порожденную любой формой функции sparse,
можно вернуться к стандартному матричному представлению, применяя функ-
функцию full, синтаксис которой имеет вид
А = full(S).
Чтобы использовать в MATLAB детектор линий на основе преобразования
Хафа, мы начнем с написания функции hough.m, которая совершает это преоб-
преобразование.
function [h, theta, rho] = hough(f, dtheta, drho)
'/.HOUGH Hough transform.
°/. [H, THETA, RHO] = HOUGH(F, DTHETA, DRHO) computes the Hough
°/0 transform of the image F. DTHETA specifies the spacing (in
°/o degrees) of the Hough transform bins along the theta axis. DRHO
°/o specifies the spacing of the Hough transform bins along the rho
°/o axis. H is the Hough transform matrix. It is NRHO-by-NTHETA,
'/. where NRHO = 2*ceil(norm(size(F))/DRH0) - 1, and NTHETA =
e/. 2*ceil(90/DTHETA). Note that if 90/DTHETA is not an integer, the
°/o actual angle spacing will be 90 / ceil (90/DTHETA) .
°/o
'/, THETA is an NTHETA-element vector containing the angle (in
°/o degrees) corresponding to each column of H. RHO is an
°/o NRHO-element vector containing the value of rho corresponding to
% each row of H.
°/o [H, THETA, RHO] = HOUGH(F) computes the Hough transform using
°/o DTHETA = 1 and DRHO = 1.
if nargin < 3
drho = 1;
end
if nargin < 2
Глава 10. Сегментация изображений
dtheta = 1;
end
f = double(f);
[M,N] = size(f);
theta = linspace(-90, 0, ceil(90/dtheta) + 1);
theta = [theta -fliplr(thetaB:end - 1))];
ntheta = length(theta);
D = sqrt((M - 1)~2 + (N - 1)~2);
q = ceil(D/drho);
nrho = 2*q - 1;
rho = linspace(-q*drho, q*drho, nrho);
[x, y, val] = find(f);
x=x-l;y=y-l;
°/e Initialize output,
h = zeros(nrho, length(theta));
°/o To avoid excessive memory usage, process 1000 nonzero pixel
e/e values at a time,
for к = 1:ceil(length(val)/1000)
first = (k - l)*1000 + 1;
last = min(first+999, length(x));
x.matrix = repmat(x(first:last), 1, ntheta);
y_matrix = repmat(y(first:last), 1, ntheta);
val_matrix = repmat(val(first:last), 1, ntheta);
thetajnatrix = repmat(theta, size(x_matrix, 1), l)*pi/180;
rho_matrix = x_matrix.*cos(theta_matrix) + ...
y_matrix.*sin(theta_matrix);
slope = (nrho - l)/(rho(end) - rho(l));
rho_bin_index = round(slope*(rho_matrix - rho(l)) + 1);
theta_bin_index = repmatA:ntheta, size(x_matrix, 1), 1);
°/0 Take advantage of the fact that the SPARSE function, which
°/e constructs a sparse matrix, accumulates values when input
У, indices are repeated. That's the behavior we want for the
У, Hough transform. We want the output to be a full (nonsparse)
% matrix, however, so we call function FULL on the output of
У. SPARSE.
h = h + full(sparse(rho_bin_index(:), theta_bin_index(:), ...
val.matrix(:), nrho, ntheta));
end
Пример 10.5. Иллюстрация преобразования Хафа.
Здесь мы продемонстрируем использование функции hough при обработке про-
простого двоичного изображения. Прежде всего, построим изображение, у которого
имеется несколько изолированных точек переднего плана.
>> f = zerosA01, 101);
» f(l, 1) = 1; fA01, 1) = 1; f(l, 101) = 1;
>> fA01, 101) = 1; fE1, 51) = 1;
10.2. Обнаружение линий с помощью преобразования Хафа 415
Рис. 10.10, а) показывает наше тестовое изображение. Теперь мы выполним пре-
преобразование Хафа и отобразим результат на графике.
а)
100
60
40
20
0
20
40
60
80
Рис. 10.10. а) Двоичное изображение с пятью точками (четыре точки находятся в уг-
углах изображения), б) Преобразование Хафа, показанное с помощью функции
imshow. в) Альтернативный график с размеченным осями. (Точки на рис. а)
были увеличен для лучшей видимости)
Глава 10. Сегментация изображений
» Н = hough(f);
>> imshow(H, [ ])
На рис. 10.10, б) приведен результат, отображенный на графике стандартной
функцией imshow. Однако более наглядная визуализация преобразования Ха-
Хафа получается на большем графике, на котором по осям отмечены координаты.
В следующем программном фрагменте функция hough вызывается с тремя аргу-
аргументами. Два вторых выходных аргумента содержат величины в и р, отвечающие
каждой соответствующей паре индексов строки и столбца матрицы преобразова-
преобразования Хафа. Эти векторы theta и rho можно передавать функции imshow в виде
дополнительных аргументов для разметки горизонтальных и вертикальных осей
на графике. Функции imshow также передается опция 'not rue size'. Команда
axis подается для включения отображения осей и представления графика в пря-
прямоугольной форме. Наконец, функции xlabel и ylabel (см. § 3.3.1) используются
для помещения возле координатных осей греческих букв, представленных в стиле
>> [Н, theta, rho] = hough(f);
>> imshow (theta, rho, H, [ ] , 'notruesize')
>> axis on, axis normal
>> xlabelO\theta>), ylabel('\rho')
На рис. 10.10, в) показан результирующий график с соответствующей разметкой
осей. Пересечение трех синусоид в точках ±45° указывает на то, что на исходном
изображении f имеется два множества, состоящие из трех колинеарных точек.
Пересечение двух синусоид в точках @, р) — (—90,0), (-90, -100), @,0) и @,100)
свидетельствует о присутствии четырех множеств колинеарных точек, которые
лежат вдоль вертикальных и горизонтальных осей. ?
10.2.1. Нахождение максимумов преобразования Хафа
Первый шаг использования преобразования Хафа для обнаружения линий и свя-
связывания состоит в нахождении локальных максимумов преобразования. Поиск
множества максимумов преобразованием Хафа может быть вполне перспектив-
перспективным. В силу квантования пространства цифрового изображения и пространства
параметров, а также по причине того, что края и перепады на типичных изоб-
изображениях не являются совершенно прямыми, максимумы преобразования Хафа
могут достигаться более чем в одной ячейке накопления. Эту сложность можно
преодолеть с помощью следующей стратегии.
1. Найти ячейку преобразования Хафа, в которой лежит наибольшая величи-
величина, и записать ее местоположение.
2. Опорожнить (обнулить) ячейки в ближайшей окрестности положения, най-
найденного на шаге 1.
3. Повторять шаги 1 и 2 до тех пор, пока желаемое число максимумов не будет
найдено, или после достижения заданного порога.
Функция houghpeaks реализует эту стратегию,
function [r, с, hnew] = houghpeaks(h, numpeaks, threshold, nhood)
10.2. Обнаружение линий с помощью преобразования Хафа
°/oHOUGHPEAKS Detect peaks in Hough transform.
'/. [R, C, HNEW] = HOUGHPEAKSCH, NUMPEAKS, THRESHOLD, NHOOD) detects
7o peaks in the Hough transform matrix H. NUMPEAKS specifies the
°/o maximum number of peak locations to look for. Values of H below
°/o THRESHOLD will not be considered to be peaks. NHOOD is a
°/0 two-element vector specifying the size of the suppression
7o neighborhood. This is the neighborhood around each peak that is
°/o set to zero after the peak is identified. The elements of NHOOD
°/o must be positive, odd integers. R and С are the row and column
°/0 coordinates of the identified peaks. HNEW is the Hough transform
°/o with peak neighborhood suppressed.
У.
°/o If NHOOD is omitted, it defaults to the smallest odd values >=
'/. size(H)/50. If THRESHOLD is omitted, it defaults to
°/o 0.5*max(H(:)) . If NUMPEAKS is omitted, it defaults to 1.
if nargin < 4
nhood = size(h)/50;
% Make sure the neighborhood size is odd.
nhood = maxB*ceil(nhood/2) + 1, 1);
end
if nargin < 3
threshold = 0.5 * max(h(:));
end
if nargin < 2
numpeaks = 1;
end
done = false;
hnew = h; r = [] ; с = [] ;
while ~done
[p, q] = find(hnew == max(hnew(:)));
p = p(l); q = q(l);
if hnew(p, q) >= threshold
r(end + 1) = p; c(end + 1) = q;
7o Suppress this maximum and its close neighbors.
pi = p - (nhood(l) - l)/2; p2 = p + (nhood(l) - l)/2;
ql = q - (nhoodB) - l)/2; q2 = q + (nhoodB) - l)/2;
[pp, qq] = ndgrid(pl:p2, ql:q2);
pp = pp(:); qq = qq(:);
°/0 Throw away neighbor coordinates that are out of bounds in
°/o the rho direction.
badrho = find((pp < 1) | (pp > size(h, 1)));
pp(badrho) = [] ; qq (badrho) = [] ;
°/0 For coordinates that are out of bounds in the theta
°/o direction, we want to consider that H is antisymmetric
°/o along the rho axis for theta = +/- 90 degrees.
theta_too_low = find(qq < 1) ;
Глава 10. Сегментация изображений
qq(theta_too_low) = size(h, 2) + qq(theta_too_low);
pp(theta_too_low) = size(h, 1) - pp(theta_too_low) + 1;
theta_too_high = find(qq > size(h, 2));
qq(theta_too_high) = qq(theta_too_high) - size(h, 2);
pp(theta_too_high) = size(h, 1) - pp(theta_too_high) + 1;
% Convert to linear indices to zero out all the values.
hnew(sub2ind(size(hnew), pp, qq)) = 0;
done = length(r) == numpeaks;
else
done = true;
end
end
Функция houghpeaks иллюстрируется в примере 10.6.
10.2.2. Преобразование Хафа при обнаружении линий
и связывании
После обнаружения множества локальных максимумов преобразования Хафа
остается определить, есть ли сегменты краев, проходящие по соответствующим
линиям, а также где они начинаются и заканчиваются. Для каждого максимума
сначала следует найти положения всех ненулевых пикселов изображения, кото-
которые лежат на соответствующих прямых. Для этих целей написана следующая
функция houghpixels.
function [г, с] = houghpixels(f, theta, rho, rbin, cbin)
°/eHOUGHPIXELS Compute image pixels belonging to Hough transform bin.
°/o [R, C] = HOUGHPIXELS(F, THETA, RHO, RBIN, CBIN) computes the
°/o row-column indices (R, C) for nonzero pixels in image F that map
% to a particular Hough transform bin, (RBIN, CBIN). RBIN and CBIN
% are scalars indicating the row-column bin location in the Hough
% transform matrix returned by function HOUGH. THETA and RHO are
% the second and third output arguments from the HOUGH function.
[x, y, val] = find(f);
x=x-l;y=y-l;
theta.c = theta(cbin) * pi / 180;
rho_xy = x*cos(theta_c) + y*sin(theta_c);
nrho = length(rho);
slope = (nrho - l)/(rho(end) - rho(l));
rho_bin_index = round(slope*(rho_xy - rho(l)) + 1);
idx = find(rho_bin_index == rbin);
r = x(idx) + 1; с = y(idx) + 1;
Пикселы, обнаруженные функцией houghpixels, необходимо сгруппировать в
сегменты. Для этого можно воспользоваться следующей стратегией:
1. Повернуть пикселы на угол 90° — в так, чтобы они легли примерно вдоль
вертикальной прямой.
10.2. Обнаружение линий с помощью преобразования Хафа
2. Упорядочить пикселы в порядке возрастания величин их повернутых а>ко-
ординат.
3. Использовать функцию dif f для определения зазоров (щелей). Заполнить
малые зазоры. Это дает эффект слияния примыкающих сегментов линий,
которые разделены малыми промежутками.
4. Возвратить информацию о сегментах линий, которые длиннее некоторой
минимальной пороговой длины.1
function lines = houghlines(f,theta,rho,rr,cc,fillgap,minlength)
'/oHOUGHLINES Extract line segments based on the Hough transform.
°/, LINES = HOUGHLINES(F, THETA, RHO, RR, CC, FILLGAP, MINLENGTH)
°/o extracts line segments in the image F associated with particular
e/o bins in a Hough transform. THETA and RHO are vectors returned by
°/e function HOUGH. Vectors RR and CC specify the rows and columns
°/e of the Hough transform bins to use in searching for line
°/o segments. If HOUGHLINES finds two line segments associated with
°/o the same Hough transform bin that are separated by less than
e/e FILLGAP pixels, HOUGHLINES merges them into a single line
°/« segment. FILLGAP defaults to 20 if omitted. Merged line
°/e segments less than MINLENGTH pixels long are discarded.
7, MINLENGTH defaults to 40 if omitted.
У,
7o LINES is a structure array whose length equals the number of
7, merged line segments found. Each element of the structure array
7, has these fields:
7.
У, pointl End-point of the line segment; two-element vector
Ус point2 End-point of the line segment; two-element vector
% length Distance between pointl and point2
°/o theta Angle (in degrees) of the Hough transform bin
°/e rho Rho-axis position of the Hough transform bin
if nargin < 6
fillgap = 20;
end
if nargin < 7
minlength = 40;
end
numlines = 0; lines = struct;
for k = l:length(rr)
rbin = rr(k); cbin = cc(k);
°/o Get all pixels associated with Hough transform cell.
[r, c] = houghpixels(f, theta, rho, rbin, cbin);
if isempty(r)
continue
end
1 Функция В = inv(A) вычисляет обратную матрицу для А.
Глава 10. Сегментация изображений
% Rotate the pixel locations about A,1) so that they lie
% approximately along a vertical line.
omega = (90 - theta(cbin)) * pi / 180;
T = [cos(omega) sin(omega); -sin(omega) cos(omega)];
xy = [r - 1 с - 1] * T;
x = sort(xy(:,1));
% Find the gaps larger than the threshold.
diff.x = [diff(x); Inf];
idx = [0; find(diff_x > fillgap)] ;
for p = 1:length(idx) - 1
xl = x(idx(p) + 1); x2 = x(idx(p + 1));
linelength = x2 - xl;
if linelength >= minlength
point1 = [xl rho(rbin)]; point2 = [x2 rho(rbin)];
°/o Rotate the end-point locations back to the original
°/o angle.
Tinv = inv(T);
point1 = point1 * Tinv; point2 = point2 * Tinv;
numlines = numlines + 1;
lines(numlines).point1 = pointl + 1;
lines(numlines).point2 = point2 + 1;
lines(numlines).length = linelength;
lines(numlines).theta = theta(cbin);
lines(numlines).rho = rho(rbin);
end
end
end
Пример 10.6. Использование преобразования Хафа для обнаружения линий и
связывания.
В данном примере вы воспользуемся функциями hough, houghpeaks и houghlines
для обнаружения сегментов линий на двоичном изображении f, приведенном
на рис. 10.7, е). Прежде всего, мы вычислим и покажем преобразование Хафа,
используя меньший шаг угловой дискретизации, чем принятый по умолчанию
(Д0 = О.5 вместо 1.0).
>> [Н, theta, rho] = hough(f, 0.5);
>> imshow(theta, rho, H, [ ], 'notruesize'), axis on, axis normal
>> xlabel('\theta'), ylabel('\rho')
Затем с помощью функции houghpeaks мы находим 5 локальных максимумов
преобразования Хафа, которые, скорее всего, имеют существенный смысл.
>> [г, с] = houghpeaks(H, 5);
>> hold on
>> plot(theta(c), rho(r), 'linestyle', 'none', ...
'marker', 's', 'color', 'w')
10.3. Пороговая обработка
На рис. 10.11, а) изображено преобразование Хафа с указанием положения най-
найденных максимумов. Наконец, применяем функцию houghlines для нахождения
и связывания сегментов линий, а найденные сегменты помещаем на исходное
двоичное изображение с помощью функций imshow, hold on и plot:
>> lines = houghlines (f, theta, rho, r, c)
>> figure, imshow(f) , hold on
>> for k = 1 :length(lines)
xy = [lines(k).pointl ; lines(k).point2];
plot(xy(:,2), xy(:,l), 'LineWidth', 4, 'Color3, [.6 .6 .6]);
end
На рис. 10.11, б) показано результирующее изображение с обнаруженными сег-
сегментами, которые обозначены жирными серыми линиями. ?
а) б)
50 0 50
Рис. 10.11. а) Преобразование Хафа с пятью локальными максимумами, б) Сегменты
линий, соответствующие максимумам преобразования Хафа
10.3. Пороговая обработка
Методы пороговой обработки занимают центральное место в прикладных зада-
задачах сегментации изображений благодаря интуитивно понятным свойствам и про-
простоте реализации. Простое пороговое преобразование уже упоминалось в § 2.7.2
и обсуждалось в последующих главах. В этом параграфе мы рассмотрим методы
автоматического выбора пороговых величин, а также способы изменения порогов
в соответствии с локальными свойствами изображений.
Предположим, что гистограмма на рис. 10.12 соответствует некоторому изоб-
изображению /(х, у), которое содержит светлые объекты на темном фоне, причем яр-
яркости всех пикселов сосредоточены вблизи двух преобладающих значений. Оче-
Очевидный способ выделения объектов из окружающего фона состоит в выборе по-
порога Т, который разделяет эти две моды яркости. Тогда любая точка (х,у), для
Глава 10. Сегментация изображений
которой /(х, у) > Т, называется точкой объекта, а в противном случае она назы-
называется точкой фона. Иными словами, изображение д(х,у), которое получается в
результате этого порогового преобразования,
определяется следующим образом:
Рис. 10.12. Выбор порога на основа-
основании визуального анализа бимодаль-
бимодальной гистограммы
О при/(х,у) <Т.
Таким образом, пикселы со значениями 1 от-
отвечают объектам, а пикселы, которым присво-
присвоено значение 0, соответствуют фону исходно-
исходного изображения. Если Т является константой
(т.е. не зависит от координат (х,?/)), то такой
порог называется глобальным. Методы выбо-
выбора глобальных порогов обсуждаются в § 10.3.1.
В § 10.3.2 рассматриваются способы вариации
порогов, которые в этом случае называются ло-
локальными или адаптивными.
10.3.1. Обработка с глобальным порогом
Один способ выбора порога заключается в визуальном изучении гистограммы
изображения. Гистограмма на рис. 10.12 имеет две отчетливые моды, поэтому
легко выбрать разделяющий их порог. Другой подход к выбору Т основан на ме-
методе проб и ошибок, когда выбираются различные пороги и проверяются до тех
пор, пока результат пороговой обработки не станет удовлетворять наблюдателя.
Такой метод особенно эффективен при наличии хорошей интерактивной среды
исследования, которая позволяет пользователю «двигать» параметры обработки
в ручном графическом режиме и наблюдать немедленный результат этих изме-
изменений.
Для автоматического выбора порога в работе [Gonzalez, Woods, 2002] предло-
предложена следующая интерактивная процедура:
1. Выбрать некоторую начальную оценку для значения порога Т. (Предлагае-
(Предлагаемая величина равна среднему значению между максимумом и минимумом
яркости изображения).
2. Совершить сегментацию с помощью порога Т. В результате образуются две
группы пикселов: G\ и G<i- Область G\ состоит из пикселов, яркость кото-
которых больше или равно Т, а яркость пикселов из G\ меньше Т.
3. Вычислить среднюю яркость пикселов ц\ и ^ по областям G\ и(?2.
4. Вычислить новое значение порога:
5. Повторять шаги с 2-го по 4-ый до тех пор, пока разность порогов Т для
соседних итераций не станет меньше наперед заданного значения То.
В примере 10.7 эта процедура реализуется средствами MATLAB.
10.3. Пороговая обработка
В пакете IPT имеется функция gray thresh, которая вычисляет пороги по
методу Отсу из [Otsu, 1979]. Чтобы проверить этот метод, основанный на анализе
гистограмм, мы представим нормализованную гистограмму в виде дискретной
функции распределения вероятностей
где п — это общее число пикселов изображения, nq обозначает число пикселов,
яркость которых равна величине rg, a L — число различных уровней яркости
изображения. Пусть теперь порог к выбран так, что Со обозначает множество
пикселов с уровнями яркости из [0,1,..., к — 1], а Со — это множество пикселов с
уровнями яркости из [/с, к +1,..., L — 1]. Метод Отсу заключается в выборе порога
к так, что он максимизирует межклассовую дисперсию о\, которая равна
где
k-\ L-1
q=0 q=k
к-1 fc-1 L-1
Mo = ^Z ЧРя(Гя)/ио, Vi=^2 Wr<z)M> Мт = JZ
q=0 q=0 q=0
Функция graythresh принимает входное изображение, вычисляет его гистограм-
гистограмму, а затем находит пороговую величину, которая максимизирует о\. Функция
возвращает порог в нормализованном виде из интервала [0,1], поэтому его сле-
следует правильно масштабировать перед использованием. Форма вызова функции
имеет вид
Т = graythresh(f),
где f — это входное изображение, а Т — результирующий порог. При сегмента-
сегментации изображения мы используем порог Т в функции im2bw, введенной в § 2.7.2.
Поскольку величина порога отнормирована к диапазону от 0 до 1, ее следует пре-
преобразовать перед использованием. Например, если f — это изображение класса
uint8, то нужно сначала умножить Т на 255, а потом применять для пороговой
обработки.
Пример 10.7. Вычисление глобальных порогов.
В этом примере иллюстрируется описанная выше итеративная процедура, а так-
также метод Отсу применительно к полутоновому изображению f отсканированного
текста на рис. 10.13. Итеративный метод реализуется следующим способом:
>> Т = 0.5*(double(min(f(:))) + double(max(f(:))));
>> done = false;
>> while ~done
g = f >= T;
Tnext = 0.5*(mean(f(g)) + mean(f(~g)));
424 Глава 10. Сегментация изображений
done = abs(T - Tnext) < 0.5;
Т = Tnext;
end
Для этого конкретного изображения цикл while совершается четыре раза и пре-
прерывается, когда Т равно 101.47.
Рис. 10.13. а) Отсканирован-
Отсканированный текст, б) Результат поро-
пороговой обработки текста функ-
функцией graythresh
Теперь вычислим порог с использованием функции gray thresh:
>> Т2 = graythresh(f)
Т2 =
0.3961
>> Т2 * 255
ans =
101
Результаты обработки этими двумя порогами практически неотличимы друг от
друга. На рис. 10.13, б) приведено изображение после порогового преобразования
с величиной Т2. ?
10.3.2. Обработка с адаптивным порогом
Глобальная пороговая обработка может не дать желаемого результата, если фон
изображения сильно неоднороден по яркости, например, как на рис. 9.26, а) и б).
В таких случаях необходимо применять предварительную обработку для компен-
компенсации перепадов фоновой яркости, после чего можно совершать глобальное поро-
пороговое преобразование. Результат улучшающей пороговой обработки на рис. 9.26, д)
был вычислен применением преобразования «верх шляпы», за которым исполь-
использовалась функция graythresh. Можно показать, что этот процесс эквивалентен
пороговому преобразованию с переменной пороговой функцией Т(х,у):
= J
\
При -f(x'2/) -
где
Изображение fo(x,y) представляет собой морфологическое размыкание /, а кон-
константа То равна результату применения функции graythresh к изображению /о.
10.4- Сегментация на отдельные области
10.4. Сегментация на отдельные области
Конечной целью процесса сегментации является разбиение изображения на обла-
области. В §§ 10.1 и 10.2 эта задача решалась путем обнаружения границ областей на
основе разрывов яркости, а в § 10.3 для этой цели совершались пороговые пре-
преобразования, которые используют распределение определенных характеристик
пикселов, например, яркостей или цветов. В этом параграфе рассматриваются
методы сегментации, основанные на прямом поиске подходящих областей.
10.4.1. Постановка задачи
Пусть R обозначает всю область изображения. Сегментацией называется процесс
разбиения области R на п подобластей R\, i?2, • • •, Rn таких, что
а) U Rz = Я;
г=1
б) Ri является связной областью для любого г — 1,2,..., п.
в) R\ DRj = 0 для всех г и j, г ф j.
г) P(Ri) = TRUE при г = 1,2,..., п.
д) P(Ri U Rj) — FALSE для любых двух смежных областей Д$ и Rj1.
Здесь Р — это некоторый логический предикат2, определенный на точках
множества Ri, a, 0 обозначает пустое множество.
Условие (а) означает, что сегментация должна быть полной, т. е.- каждый пик-
пиксел изображения принадлежит какой-то области. Условие (б) говорит о том, что
точки каждой области должны быть связными в некотором оговоренном смыс-
смысле (например, они 4- или 8-связны). Условие (в) указывает на то, что области
не должны пересекаться. Условие (г) относится к свойствам, которые должны
соблюдаться для каждого пиксела из одной области, например, P(Ri) = TRUE,
если все пикселы в Ri имеют одинаковую яркость. Наконец, условие (д) означает,
что прилегающие области Ri и Rj различаются в смысле предиката Р.
10.4.2. Выращивание областей
Как ясно из названия, выращивание областей представляет собой процедуру, ко-
которая группирует пикселы или подобласти в более крупные области по заранее
заданным критериям роста. Основной подход состоит в том, что вначале берется
множество точек, играющих роль «центров кристаллизации», а затем на них
наращиваются области путем добавления к каждому центру тех соседних пик-
пикселов, которые по своим свойствам близки к центру кристаллизации (например,
имеют яркость или цвет в определенном диапазоне).
Выбор множества, состоящего из одной или более начальных точек, часто
зависит от природы задачи, как будет видно из примера 10.8. При отсутствии
априорной информации процедура состоит в вычислении одного и того же набо-
набора свойств для каждого пиксела. В конечном счете, эти свойства будут использо-
1В контексте § 9.4, две различные области Ri и Rj называются примыкающими, если их объе-
объединение является компонентой связности.
2Логическим предикатом называется функция, принимающая только два значения: истина
(TRUE) и ложь (FALSE).
Глава 10. Сегментация изображений
ваться для отнесения пиксела к той или иной области в процессе выращивания.
Если в результате вычислений обнаруживаются кластеры значений, то пикселы,
близкие по своим свойствам к центроидам таких кластеров, могут выбираться в
качестве центров кристаллизации.
Выбор критериев сходства зависит не только от конкретной рассматривае-
рассматриваемой задачи, но и от вида имеющихся данных, из которых состоит изображение.
Например, анализ данных спутниковой съемки земной поверхности основан на
цветовой информации, и он стал бы значительно затруднен или невозможен при
отсутствии цветовых данных. Если изображения монохромные, анализ областей
делается с использованием дескрипторов, которые основаны на значениях ярко-
яркости и пространственных характеристиках (таких, как текстура или статистиче-
статистические моменты). Дескрипторы, применяемые для описания областей изображения,
обсуждаются в гл. 11.
Использование при выращивании областей одних лишь дескрипторов может
привести к ошибочным результатам, если это делается в отрыве от информации о
смежности или связности областей. Например, представим себе случайную схему
расположения пикселов, принимающих только три значения яркости. Если стро-
строить «области», группируя вместе пикселы с одинаковой яркостью и не обращая
внимания на их связность, то это приведет к сегментации, лишенной смысла в
контексте нашего обсуждения.
Другая проблема при выращивании областей состоит в том, чтобы сформу-
сформулировать правило остановки этого процесса. По идее, выращивание некоторой
области следует прекратить, когда в изображении больше нет пикселов, удовлет-
удовлетворяющих критериям присоединения к данной области. Такие критерии, как яр-
яркость, текстура и цвет, являются по своей природе локальными и не учитывают
«историю» выращивания области. Можно повысить производительность алго-
алгоритма выращивания областей за счет привлечения дополнительных критериев,
использующих, например, такие понятия, как размеры и форма выращиваемой
области, а также сходство между пикселом-кандидатом и пикселами, объеди-
объединенными к данному моменту (скажем, путем сравнения значений яркости нового
кандидата и средней яркости уже выращенной области). Использование дескрип-
дескрипторов такого типа основано на предположении, что имеется хотя бы грубая мо-
модель ожидаемых результатов.
Чтобы проиллюстрировать основные принципы сегментации областей в систе-
системе MATLAB, мы напишем функцию regiongrow, которая делает выращивание
областей. Ее общий синтаксис имеет вид
textlg, NR, SI, TI] = regiongrow(f, S, T),
где f — это сегментируемое изображение, а параметр S может быть массивом
(с размерами как у i) или скаляром. Если S — массив, то он должен содержать 1
в тех позициях, где расположены центры кристаллизации и 0 — во всех остальных
местах. Этот массив можно определить с помощью визуальной оценки изобра-
изображения или применяя какую-то дополнительную внешнюю функцию построения
центров кристаллизации. Если параметр S является скаляром, то он задает зна-
значение яркости пикселов, которые становятся центрами кристаллизации. Анало-
Аналогично, Т может быть массивом (с размерами, как у f) или скаляром. Если Т —
10.4- Сегментация на отдельные области
массив, то его элементы трактуются как локальные пороговые значения для f.
В противном случае, скаляр Т определяет глобальный порог. Значение(я) по-
рога(ов) применяется для проверки соседних (8-связных) пикселов для центров
кристаллизации на предмет того, достаточно ли они «похожи» на них.
Например, если S = аиТ = Ъ,и мы сравниваем яркости, то пиксел называет-
называется похожим на а (в смысле прохождения данного теста), когда модуль разности
их значений не больше Ь. Кроме того, если рассматриваемый пиксел является
8-связным с одним или несколькими центрами кристаллизации, то этот пиксел
рассматривается как возможный элемент одного или нескольких областей. Такой
же подход применяется в случае, когда S и Т являются массивами, и сравнение
выполняется с привязкой центров кристаллизации и пороговых значений к кон-
конкретным положениям тестируемых пикселов.
Выходом g служит сегментированное изображение, причем элементы каждой
области помечаются одним и тем же целым числом. Параметр NR равен числу
выделенных областей. Параметр SI является изображением, на котором отоб-
отображены центры кристаллизации, a TI — это изображение, содержащее пикселы,
которые прошли пороговый тест до их обработки на предмет связности. Оба
изображения SI и TI имеют размеры, как у f.
Текст программы regiongrow следующий. Обратите внимание на использова-
использование функции bwmorph из гл. 9 для сокращения до одного числа связных центров
кристаллизации в каждой области S (когда S есть массив), а также на примене-
применение функции imreconstruct для нахождения всех пикселов, связанных с каждым
центром кристаллизации.3
function [g, NR, SI, TI] = regiongrow(f, S, T)
VeREGIONGROW Perform segmentation by region growing.
У. [G, NR, SI, TI] = REGIONGROWCF, SR, T). S can be an array (the
7, same size as F) with a 1 at the coordinates of every seed point
e/« and Os elsewhere. S can also be a single seed value. Similarly,
e/o T can be an array (the same size as F) containing a threshold
°/e value for each pixel in F. T can also be a scalar, in which
e/e case it becomes a global threshold.
У.
e/e On the output, G is the result of region growing, with each
e/e region labeled by a different integer, NR is the number of
e/e regions, SI is the final seed image used by the algorithm, and TI
e/e is the image consisting of the pixels in F that satisfied the
e/, threshold test.
f = double(f);
% If S is a scalar, obtain the seed image.
if numel(S) == 1
SI = f == S;
SI = S;
else
7o S is an array. Eliminate duplicate, connected seed locations
3true эквивалентно logical A), a false - это logical @).
Глава 10. Сегментация изображений
% to reduce the number of loop executions in the following
°/0 sections of code.
SI = bwmorph(S, 'shrink', Inf);
J = find(SI);
SI = f(J); % Array of seed values,
end
TI = false(size(f));
for К = l:length(Sl)
seedvalue = S1(K);
S = abs(f - seedvalue) <= T;
TI = TI | S;
end
% Use function imreconstruct with SI as the marker image to
% obtain the regions corresponding to each seed in S. Function
% bwlabel assigns a different integer to each connected region,
[g, NR] = bwlabel(imreconstruct(SI, TI));
Пример 10.8. Применение метода выращивания областей при контроле каче-
качества швов при сварке.
На рис. 10.14, а) приводится рентгеновское изображение сварного шва (горизон-
(горизонтальная темная область), в котором имеется несколько трещин и раковин (бе-
(белые яркие полосы, идущие горизонтально посередине изображения). Мы хотим
воспользоваться методом выращивания областей для сегментации участков изоб-
изображения с дефектами сварки. Эти выделенные признаки могут применяться в
целях технического контроля, включаться в базу хронологических данных, ис-
использоваться для управления автоматическим сварочным оборудованием и во
многих других прикладных задачах.
Рис. 10.14. а) Изображение де-
дефектного сварного шва. б) Цен-
Центры кристаллизации, в) Дво-
Двоичное изображение, показываю-
показывающее (белым цветом) все пиксе-
пикселы, прошедшие пороговый тест.
г) Результат анализа всех пик-
пикселов на предмет 8-связности с
центрами кристаллизации. (Ис-
(Исходное изображение предостав-
предоставлено компанией Х-ТЕК Systems
Ltd)
10.4- Сегментация на отдельные области
Прежде всего, необходимо определить исходные центры кристаллизации. В этой
конкретной задаче было установлено, что пикселы в районе дефектной сварки
имеют значения яркости, близкие к максимальному (в нашем случае — это 255).
Исходя из этой информации, мы положим S = 255. Следующий шаг состоит в
выборе скалярного порога или порогового массива. В данном примере мы поло-
положили Т = 65. Это число выбрано на основе анализа гистограммы изображения,
которая приведена на рис. 10.15, и оно равно разности между максимальным
значением 255 и положением ближайшей слева значительной впадины. Одно-
Одновременно, эта точка отображает максимальное значение яркости в темной части
сварного шва. Как уже отмечалось ранее, пиксел должен быть 8-связным с неко-
некоторым пикселом области, чтобы попасть в эту область. Если оказывается, что
пиксел связан более чем с одной областью, то эти области автоматически слива-
сливаются в одну функцией regiongrow.
На рис. 10.14, б) показаны центры кристаллизации (изображение SI). Этих
точек оказалось много, так как в качестве центов были просто выбраны все точ-
точки изображения со значением яркости 255. На рис. 10.14, в) показано изображе-
изображение TI. Ему принадлежат все точки, прошедшие пороговый тест: это все точки,
яркости которых Zi удовлетворяют неравенству |zj — 5| < Т. На рис. 10.14, г)
показан результат выделения всех точек, которые связаны с центрами кристал-
кристаллизации. Это и есть сегментированное изображение. При наложении этого изоб-
изображения на исходное можно убедиться в том, что процедура выращивания обла-
областей действительно приводит к сегментации дефектов сварки с хорошей степенью
точности.
Рис. 10.15. Гистограмма
рис. 10.14, а)
IZ.VJVKJ
10000
8000
6000
4000
2000
0
-
-
-
Ill
.„.Illlllll
III
1 III
-
-
-
-
-
l.j.
50
100
150
200
250
В завершение отметим, что изучение гистограммы на рис. 10.15 приводит к
выводу, что было бы невозможно получить то же или эквивалентное решение
применением любого порогового метода, изложенного в § 10.3. В нашем случае
решающим оказалось применение свойства связности. ?
Глава 10. Сегментация изображений
10.4.3. Разделение и слияние областей
Описанная только что процедура выращивает области из множества центров
кристаллизации. Альтернативный подход разделения на области состоит в том,
чтобы провести первичное разбиение изображения на множество произвольных
непересекающихся областей и в дальнейшем осуществлять слияние и/или раз-
разделение этих областей, стремясь к выполнению условий, сформулированных в
§ 10.4.1. Далее излагается итеративный алгоритм разделения и слияния, кото-
который соблюдает эти ограничения.
Пусть вся область изображения обозначена R и выбран предикат Р. Один
из возможных подходов к сегментации R состоит в том, чтобы последовательно
разбивать эту область на все более и более мелкие квадратные подобласти Ri,
пока выполняется условие P(Ri) = TRUE. Процесс начинается со всей области
изображения. Если P(R) = FALSE, то изображение делится на четверти вер-
вертикальной и горизонтальной прямыми, проходящими через середину. Если для
какой-то четверти предикат Р принимает значение FALSE, то она аналогичным
способом делится на более мелкие четверти, и так далее. Такой метод разбие-
разбиения удобно представлять в форме так называемого квадродерева (т. е. дерева, у
которого вершины, не являющиеся листьями, имеют в точности четыре потом-
потомка), как показано на рис. 10.16 (подизображения, которые соответствуют узлам
квадродерева, иногда называются квадрообластями или квадроизображениями).
Отметим, что корень дерева соответствует целому изображению, а каждая дру-
другая вершина — какой-то из его подобластей. В данном случае только область R±
подверглась дальнейшему разбиению.
Если использовать только операцию разделения, то в окончательном разбие-
разбиении изображения могут присутствовать соседние области, имеющие одинаковые
свойства. Этот недостаток можно устранить, применяя наряду с разделением
также операцию слияния. Для соблюдения ограничений из § 10.4.1 требуется,
чтобы слиянию подвергались только соседние области, пикселы которых в сово-
совокупности удовлетворяют предикату Р. Другими словами, две соседних области
Rj и Rk сливаются только в том случае, если P(Rj Uflfe) = TRUE.
а)
R2
*43
R42
*44
Рис. 10.16. а) Деление изображения на части, б) Соответствующее квадродерево
Проведенное обсуждение можно кратко суммировать в виде процедуры, на
каждом шаге которой выполняются следующие действия:
10.4- Сегментация на отдельные области
1. Любая область Rj, для которой P(Rj) = FALSE, разделяется на четыре
непересекающиеся четверти.
2. Любые две соседние области Rj и Rk, для которых P(Rj U Rk) = TRUE,
объединяются в одну.
3. Если невозможно выполнить ни одной операции слияния или разделения,
то процедура завершается.
Возможны различные варианты изложенной основной схемы. Например, изоб-
изображение вначале разбивается на множество блоков; дальнейшее разделение про-
проводится, как описано выше, но слияние допускается только внутри группы из че-
четырех блоков, являющихся потомками в квадродереве и удовлетворяющих пре-
предикату Р. Когда дальнейшее слияние такого вида оказывается невозможным,
процедура заканчивается однократным слиянием областей, для которых соблю-
соблюдаются условия вышеуказанного шага 2; при этом объединяемые области уже
могут быть разных размеров. Главное достоинство такого подхода состоит в ис-
использовании одного и того же квадродерева для разделения и слияния на всех
шагах, кроме заключительного шага слияния.
В пакете IPT выполнение разложения по квадродереву реализовано М-функ-
цией qtdecomp. Интересующая нас форма вызова этой функции имеет вид4
S = qtdecomp(f, Qsplit_test, parameters),
где f — это исходное изображение, a S — разреженная матрица, которая представ-
представляет структуру квадродерева. Если элемент S(k, m) не равен нулю, то (k, m)
является верхним левым углом квадратного блока в разложении и сторона это-
этого блока равна S(k, m). Функция split_test (см. функцию splitmerge в сле-
следующем примере) определяет, надо ли разделять данную область на части, а
paramet ers — любые параметры, которые могут понадобиться функции spl it _t est.
Механика обращения с такими параметрами аналогична той, которая рассмат-
рассматривалась в § 3.4.2 применительно к функции coltf ilt.
Чтобы получить настоящие значения пикселов квадрообластей на квадроде-
квадродереве разложения, применяется функция qtgetblk, которая имеет синтаксис
[vals, г, с] = qtgetblk(f, S, m),
где vals — это массив, содержащий величины блоков размерами mxm на дереве
разложения изображения f, a S — это разреженная матрица, которую возвращает
функция qtdecomp. Параметры г и с являются векторами, в которые записаны
координаты строк и столбцов верхних левых углов этих блоков.
Проиллюстрируем использование функции qtdecomp, написав основную М-
функцию разделения и слияния, которая совершает упрощение, обсуждавшееся
ранее, когда две области сливаются в одну при выполнении предиката каждой
из них по отдельности. Функция, которую мы назвали splitmerge, имеет следу-
следующую форму вызова:
g = splitmerge(f, mindim, ©predicate),
4Другие формы функции qtdecomp обсуждаются в § 11.2.2.
Глава 10. Сегментация изображений
где f — это входное изображение, g — выходное изображение, в котором все связ-
связные области помечены разными целыми числами. Параметр mindim определяет
размер самого маленького блока, допускаемого при разложении; этот параметр
должен быть положительной степенью числа 2.
Функция predicate задается пользователем, и ее местоположение должно
быть известно системе (указано в переменной среды MATLAB). Она имеет син-
синтаксис
flag = predicate(region).
Эта функция должна возвращать значение true (логическую 1), когда пикселы
в области region удовлетворяют предикату, задаваемому этой функцией, в про-
противном случае значение flag должно быть равно false (логическому 0). В при-
примере 10.9 имеется иллюстрация применения этой функции.
Функция splitmerge имеет простую структуру. Вначале изображение делится
функцией qtdecomp. Функция split_test использует predicate для определе-
определения, нужно ли разделять область на части. Поскольку при разделении области
на четыре подобласти заранее неизвестно, какая из них индивидуально пройдет
тест предиката, далее выполняется этот тест. Здесь еще раз используется функ-
функция predicate. Каждая квадрообласть, прошедшая тест, заполняется единица-
единицами. Этот массив используется вместе с разделенным изображением для опре-
определения связности (смежности) области. Для этих целей применяется функция
imreconstruct.
Далее приводится код функции splitmerge. Простая предикатная функция,
описанная в закомментированном справочном блоке функции, используется в
примере 10.9. Обратите внимание на то, что размеры входного изображения при-
приводятся к наименьшему объемлющему квадрату, сторона которого есть степень
числа 2. В этом заключается требование функции qtdecomp гарантировать воз-
возможность разделения изображения вплоть до единичного размера.5
function g = splitmerge(f, mindim, fun)
7oSPLITMERGE Segment an image using a split-and-merge algorithm.
% G = SPLITMERGE(F, MINDIM, ©PREDICATE) segments image F by using a
°/0 split-and-merge approach based on quadtree decomposition. MINDIM
% (a positive integer power of 2) specifies the minimum dimension
°/o of the quadtree regions (subimages) allowed. If necessary, the
°/0 program pads the input image with zeros to the nearest square
°/o size that is an integer power of 2. This guarantees that the
% algorithm used in the quadtree decomposition will be able to
% split the image down to blocks of size 1-by-l. The result is
°/o cropped back to the original size of the input image. In the
% output, G, each connected region is labeled with a different
У. integer.
°/o
У. Note that in the function call we use ©PREDICATE for the value of
°/0 fun. PREDICATE is a function in the MATLAB path, provided by the
5Команда feval(fun, param) вычисляет функцию fun с параметрами param. См. другие формы
обращения к f eval на справочной странице этой функции.
10.4- Сегментация на отдельные области
°/о user. Its syntax is
°/o
°/o FLAG = PREDICATE (REGION) which must return TRUE if the pixels
% in REGION satisfy the predicate defined by the code in the
7o function; otherwise, the value of FLAG must be FALSE.
°/o
°/o The following simple example of function PREDICATE is used in
e/. Example 10.9 of the book. It sets FLAG to TRUE if the
°/o intensities of the pixels in REGION have a standard deviation
°/0 that exceeds 10, and their mean intensity is between 0 and 125.
°/0 Otherwise FLAG is set to false.
У.
°/o function flag = predicate (region)
7o sd = std2 (region);
°/o m = mean2 (region) ;
°/, flag = (sd > 10) & (m > 0) & (m < 125) ;
°/o Pad image with zeros to guarantee that function qtdecomp will
°/o split regions down to size 1-by-l.
Q = 2~nextpow2(max(size(f)));
[M, N] = size(f);
f = padarray(f, [Q - M, Q - N], 'post');
°/0 Perform splitting first.
S = qtdecomp(f, @split_test, mindim, fun);
°/o Now merge by looking at each quadregion and setting all its
°/o elements to 1 if the block satisfies the predicate.
°/o Get the size of the largest block. Use full because S is sparse.
Lmax = full(max(S(:)));
°/o Set the output image initially to all zeros. The MARKER array is
°/o used later to establish connectivity.
g = zeros(size(f));
MARKER = zeros(size(f)) ;
°/o Begin the merging stage.
for К = l:Lmax
[vals, r, c] = qtgetblk(f, S, K);
if ~isempty(vals)
°/o Check the predicate for each of the regions
% of size K-by-K with coordinates given by vectors
°/o r and с.
for I = 1:length(r)
xlow = r(I); ylow = c(I);
xhigh = xlow + К - 1; yhigh = ylow + К - 1;
region = f(xlow:xhigh, ylow:yhigh);
flag = fevaKfun, region);
if flag
g(xlow:xhigh, ylow:yhigh) = 1;
MARKER(xlow, ylow) = 1;
Глава 10. Сегментация изображений
end
end
end
end
% Finally, obtain each connected region and label it with a
e/e different integer value using function bwlabel.
g = bwlabel(imreconstruct(MARKER, g));
% Crop and exit
g = g(l:M, 1:N);
I y,
function v = split_test(B, mindim, fun)
7. THIS FUNCTION IS PART OF FUNCTION SPLIT-MERGE. IT DETERMINES
7, WHETHER QUADREGIONS ARE SPLIT. The function returns in v
7e logical Is (TRUE) for the blocks that should be split and
7o logical Os (FALSE) for those that should not.
7o Quadregion B, passed by qtdecomp, is the current decomposition of
7o the image into к blocks of size m-by-m.
7o к is the number of regions in В at this point in the procedure.
к = size(B, 3);
7e Perform the split test on each block. If the predicate function
7e (fun) returns TRUE, the region is split, so we set the appropriate
7o element of v to TRUE. Else, the appropriate element of v is set to
7. FALSE.
v(l:k) = false;
for I = l:k
quadregion = B(:, :, I);
if size (quadregion, 1) <= mindim
v(I) = false;
continue
end
flag = feval(fun, quadregion);
if flag
v(I) = true;
end
end
Пример 10.9. Сегментация изображения методом разделения и слияния.
На рис. 10.17, а) показан снимок в рентгеновском диапазоне так называемой Пет-
Петли Лебедя6. Изображение имеет размеры 256x256 пикселов. Целью этого приме-
примера является выделение из этого изображения «кольца» менее плотной материи,
которая окружает плотную центральную часть. Интересующая нас область име-
имеет несколько очевидных характеристик, которые могут помочь при сегментации.
Во-первых, данные имеют случайный характер, т. е. их стандартное отклонение
яркости будет больше стандартного отклонения фона (равного 0) и стандартного
6Петля Лебедя представляет собой ударную волну от сверхновой в космосе, которая взорвалась
20000 лет назад в созвездии Лебедя.
10.4- Сегментация на отдельные области
отклонения большой яркой центральной области. Аналогично, среднее значение
(яркости) области с выделяемыми данными больше среднего значения фона (рав-
(равного 0) и меньше среднего значения центральной области. Значит, можно попро-
попробовать совершить сегментацию, основываясь на этих двух параметрах. На самом
деле, предикатная функция, приведенная в качестве иллюстрации в заголовоч-
заголовочной документации функции splitmerge, использует именно эту информацию.
Параметры определяются при вычислении среднего значения и стандартного от-
отклонения различных областей на рис. 10.17, а).
а)
г)
Рис. 10.17. Сегментация изображения методом разделения и слияния, а) Исходное изоб-
изображение. б)—е) Результаты сегментации функцией splitmerge со значениями
mindim, которые равны 32, 16, 8, 4 и 2 соответственно. (Исходное изображение
предоставлено Агентством NASA)
Рис. 10.17 с б) по е) показывают результаты сегментации рис. 10.17, а) с ис-
использованием splitmerge со значениями параметра mindim, равными, соответ-
соответственно, 32, 16, 8, 4 и 2. Видно, что степень детализации на изображениях обратно
пропорциональна величине mindim.
Все результаты сегментации на рис. 10.17 вполне приемлемы. Если одно из
этих изображений нужно использовать в качестве маски для извлечения интере-
интересуемого объекта на исходном изображении, то наилучшим выбором будет изобра-
изображение 10.17, г), поскольку оно представляет собой сплошную область с хорошей
детализацией границ. Важный критический момент этого метода заключается
в том, что функция predicate должна «поймать» адекватную информацию о
проблемной области, которая поможет при ее сегментации. ?
Глава 10. Сегментация изображений
10.5. Сегментация преобразованием водораздела
В географии термин водораздел обозначает условную линию, которая разделя-
разделяет области водосборов разных речных систем. Водосборный бассейн определяет
географическую область, вода с которой собирается в одну реку или водохрани-
водохранилище. Преобразование водораздела применяет эту идею к обработке монохромных
изображений при решении различных типов задач сегментации.
Рис. 10.18. а) Полутоновое изоб-
изображения темных сгустков, б) Изоб-
Изображение, представленное в виде по-
поверхности, на которой отмечены ли-
линия водораздела и водосборные бас-
бассейны
Водораздельные бассейны
Чтобы понять преобразование водораздела, необходимо представить себе по-
полутоновое изображение в виде поверхности уровней, на которой величины f(x,y)
интерпретируются как высоты. Например, простое изображение на рис. 10.18, а)
можно представить в виде трехмерной поверхности, показанной на рис. 10.18, б).
Если представить себе дождь, идущий над этой поверхностью, то, очевидно, вода
будет собираться в двух областях, помеченных как водосборные бассейны. Капли
дождя, падающие точно на линию, помеченную как линия водораздела, будут с
одинаковой вероятностью собираться и в левый, и в правый бассейн. Преобразо-
Преобразование водораздела находит водосборные бассейны и строит линию водораздела
на полутоновом изображении. Если использовать терминологию по сегментации,
то ключевым моментом является изменение исходного изображения и преобра-
преобразование его в такое изображение, что водосборными бассейнами на нем являлись
как раз области и объекты, которые мы хотим сегментировать.
Метод вычисления преобразования водораздела детально обсуждается в кни-
книгах [Gonzalez, Woods, 2002] и [Soille, 2003]. В частности, алгоритм, используемый
в IPT, взят из работы [Vincent, Soille, 1991].
10.5.1. Сегментация по водоразделам с помощью
преобразования расстояния
Инструмент, который часто используется при сегментации по водоразделу, назы-
называется преобразованием расстояния. Преобразование расстояния двоичного изоб-
изображения является довольно простой функцией: оно равно расстоянию от каждого
пиксела до ближайшего пиксела с ненулевым значением. На рис. 10.19 иллю-
иллюстрируется это преобразование. На рис. 10.19, а) показана матрица маленького
двоичного изображения, а на рис. 10.19, б) приведено соответствующее преобра-
преобразование расстояния. Отметим, что ненулевые пикселы имеют нулевые значения
преобразования расстояния. Это преобразование вычисляется в пакете функцией
bwdist, которая имеет следующий синтаксис вызова:
D = bwdist(f).
10.5. Сегментация преобразованием водораздела 437
Пример 10.10. Сегментация двоичного изобрасисения по водоразделу с помощью
преобразования расстояния.
В этом примере показывается, как пре-
преобразование расстояния может быть а)
использовано при сегментации в соче- j
тании с преобразованием водораздела
в пакете IPT применительно к изоб- 1
ражению кругов, некоторые из ко- о
торых касаются друг друга. Точнее,
мы хотим сегментировать изображе-
изображение f деревянных шпонок, прошед- о
шее предварительную обработку на
рис. 9.29. б). Сначала мы преобразу- Рис*]0'19'^ MajieHb^ двоичное изображе-
^ 7 г г j ние fij Преобразование расстояния
ем изображение в двоичный формат с
помощью функций im2bw и graythresh, как это описано в § 10.3.1.
>> g = im2bw(f, graythresh(f)) ;
а) б) в)
1
1
0
0
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
б)
0.00
0.00
1.00
1.41
1.00
0.00
0.00
1.00
1.00
0.00
1.00
1.00
1.41
1.00
0.00
2.00
2.00
2.00
1.00
0.00
3.00
3.00
2.24
1.41
1.00
Рис. 10.20. а) Двоичное изображение, б) Дополнение изображения а), в) Преобразование
расстоянием, г) Линии водораздела преобразования расстояния от дополне-
дополнения, д) Линии водоразделов, нанесенные черным цветом на исходное двоичное
изображение. Видна некоторая избыточная сегментация
На рис. 10.20, а) показан результат. Следующий шаг состоит в получении нега-
негативного (дополнительного) изображения, вычислении преобразования расстоя-
расстояния и нахождении преобразования водораздела от изображения, полученного с
помощью функции watershed. Эта функция вызывается командой
L = watershed(f),
где L — это размечающая матрица (см. § 9.4). Положительные целые значения L
Глава 10. Сегментация изображений
соответствуют водосборным бассейнам, а нулевые значения обозначают пикселы
линий водоразделов.
>> gc = ~g;
>> D = bwdist(gc) ;
>> L = watershed(-D) ;
>> w = L == 0;
На рис. 10.20, б) и в), приведено негативное изображение и его преобразова-
преобразование расстоянием. Поскольку нулевые значения в L обозначают линии водораз-
водоразделов, в последней командной строке строит двоичное изображение w, выделя-
выделяющее только эти пикселы. Соответствующая картина водоразделов приведена
на рис. 10.20, г). Наконец, логическое AND исходного двоичного изображения с
дополнением к w дает полную сегментацию, которая показана на рис. 10.20, д).
» g2 = g & ~w;
Заметим, что некоторые объекты на рис. 10.20, д) разделены неправильно. Та-
Такое явление называется избыточной сегментацией, которая часто проявляет-
проявляется при использовании метода сегментации по водоразделам. В следующих двух
параграфах рассматриваются различные подходы, позволяющие преодолеть эту
трудность. ?
10.5.2. Сегментация по водоразделам с помощью
градиентов
Модуль градиента часто используется при предварительной обработке полуто-
полутоновых изображений перед сегментацией по водоразделам. Пикселы изображе-
изображения градиента с большими значениями располагаются вблизи границ объектов,
а остальным участкам соответствуют нулевые значения пикселов. В идеале, вы-
выполняя затем преобразование водораздела, можно получить линии водоразделов
вдоль границ объектов. В следующем примере иллюстрируется этот подход.
Пример 10.11. Сегментация полутонового изображения с помощью градиента
и преобразования по водоразделу.
На рис. 10.21, а) приведено изображение f, которое содержит несколько затем-
затемненных сгустков или пятен. Мы начнем с вычисления модуля градиента, исполь-
используя или метод линейной фильтрации, описанный в § 10.1, или применяя морфо-
морфологический градиент, подобно тому, как это делалось в § 9.6.1.
>> h = fspecial('sobel') ;
>> fd = double (f);
>> g = sqrt(imfilter(fd, h, 'replicate') .~2 + ...
imfilter(fd, h', 'replicate') .~2);
Рис. 10.21, б) показывает изображение модуля градиента g. Затем мы вычисляем
преобразование по водоразделам от градиента и находим границы водоразделов.
>> L = watershed(g) ;
>> wr = L == 0;
10.5. Сегментация преобразованием водораздела
а) б)
Рис. 10.21. а) Полутоновое изображение малых сгустков, б) Изображение модуля гра-
градиента, в) Преобразование водораздела от б) с избыточной сегментацией.
г) Преобразование водоразделом от сглаженного изображения градиента. Из-
Избыточная сегментация уменьшена. (Исходное изображение представлено д-
ром С.Бёше, CMM/Ecole de Mines de Paris)
Как видно на рис. 10.21, в), результат такой сегментации не слишком хорош.
На нем имеется много линий водоразделов, которые не окружают интересующие
нас объекты. Это другой случай избыточной сегментации. Молено попытаться
справиться с этой проблемой, сгладив изображение градиента перед выполнением
преобразования водоразделов. Здесь мы применяем замыкание размыканием, как
описано в гл. 9.
>> g2 = imclose(imopen(g, onesC,3)), onesC,3));
>> L2 = watershed(g2) ;
» wr2 = L2 == 0;
>> f2 = f;
>> f2(wr2) = 255;
Последние две строки программного кода помещают изображение wr2 линий во-
водоразделов поверх исходного изображения. Результат показан на рис. 10.21, г).
Налицо улучшение по сравнению с рис. 10.21, в), хотя и здесь имеются лиш-
лишние линии, поэтому трудно выделить водосборные бассейны интересующих нас
объектов. В следующем параграфе рассматривается дальнейшее усовершенство-
усовершенствование сегментации по водоразделам, которое поможет справиться с избыточной
сегментацией. ?
Глава 10. Сегментация изображений
10.5.3. Использование маркеров при сегментации
по водоразделам
Непосредственное применение алгоритма сегментации по водоразделам в том ви-
виде, как описывалось в предыдущем параграфе, обычно приводит к избыточной
сегментации, вызванной шумом или другими локальными неоднородностями на
градиентном изображении. Избыточная сегментация может быть настолько зна-
значительной, что сделает результат обработки практически бесполезным. В контек-
контексте нашего обсуждения это означает огромное число областей, выделенных при
сегментации. Практическое решение этой проблемы состоит в том, чтобы огра-
ограничить допустимое число областей путем включения в состав процедуры шага
предварительной обработки, служащего для привнесения добавочной информа-
информации в процедуру сегментации.
Подход, применяемый для управления избыточной сегментацией, основан на
идее маркеров. Маркер представляет собой связную компоненту, принадлежащую
изображению. Будем различать внутренние маркеры, относящиеся к интересу-
интересующим нас объектам, и внешние маркеры, соответствующие фону изображения.
Затем эти маркеры используются для подправления градиентного изображения
при выполнении процедуры, описанной в примере 10.12. Разработаны различ-
различные методы для построения внутренних и внешних маркеров, многие из которых
используют линейную или нелинейную фильтрацию, а также морфологическую
обработку, описанную в предыдущих главах. Какой метод выбрать, зависит в
высокой степени от природы конкретных изображений, которые будут обраба-
обрабатываться данной программой.
Пример 10.12. Иллюстрация использования маркеров при сегментации по во-
водоразделам.
В этом примере рассматривается сегментация, контролируемая маркерами, кото-
которая применяется к изображению гели электрофореза на рис. 10.22, а). Сначала
приведем результат, который получается преобразованием водораздела от гра-
градиентного изображения без предварительной обработки.
>> h = f special ('sobel');
>> fd = double (f);
>> g = sqrt(imfilter(fd, h, 'replicate') .~2 + ...
imfilter(fd, h', 'replicate') .~2);
>> L = watershed(g) ;
>> wr = L == 0;
Результат дан на рис. 10.22, б), на котором наблюдается избыточная сегмен-
сегментация, причина которой заключается в большом числе локальных минимумов.
Функция imregionalmin определяет все локальные минимумы изображения. Она
вызывается в виде
rm = imregionalmin(f),
где f — это полутоновое изображение, a rm обозначает двоичное изображение, в
котором единицей отмечают положения локальных минимумов. Мы можем про-
проверить функцию imregionalmin на градиентном изображении, чтобы понять,
почему функция watershed порождает такие маленькие водосборные бассейны:
10.5. Сегментация преобразованием водораздела
» rm = imregionalmin(g);
Большинство локальных минимумов, показанных на рис. 10.22, в), являются очень
мелкими. Они отображают маленькие детали, которые не играют роли в задаче
сегментации. Чтобы исключить такие дополнительные минимумы, используется
функция из IPT imextendedmin, которая находит «низкие» пятна на изображе-
изображении, лежащие глубже некоторого заданного порогового уровня по сравнению с их
ближайшим окружением. (См. [Soille, 2003], где детально рассматривается преоб-
преобразование расширенного минимума и связанные с ним операции.) Эта функция
имеет форму вызова
im = imextendedmin(f, h),
где f — это полутоновое изображение, h — пороговый уровень, a im обозначает
двоичное изображение, на котором пикселы переднего плана отмечают положе-
положения глубоких минимумов. Теперь можно применить функцию imextendedmin,
которая задаст наше множество внутренних маркеров:
>> im = imextendedmin(f, 2);
>> fim = f;
» fim(im) = 175;
Последние две строки помещают положения расширенного множества миниму-
минимумов в виде сероватых пятен на исходное изображение [см. рис. 10.22, г)]. Видно,
что полученные пятна хорошо «отмечают» объекты, которые мы желаем сегмен-
сегментировать.
Теперь необходимо построить внешние маркеры или пикселы, про которые
мы уверены, что они принадлежат фону изображения. Здесь мы следуем подхо-
подходу, согласно которому фон отмечается пикселами, которые расположены точно
посередине между внутренними маркерами. Как ни странно, но это можно сде-
сделать, решив другую задачу водораздела, а именно: нужно вычислить преобра-
преобразования водораздела от преобразования расстояния изображения im внутренних
маркеров:
>> Lim = watershed(bwdist(im)) ;
>> em = Lim == 0;
Рис. 10.22, д) изображает результирующие линии водоразделов на двоичном изоб-
изображении em. Поскольку эти линии расположены посередине между темными пят-
пятнами, отмеченными im, они подходят для роли внешних маркеров.
Имея внутренние и внешние маркеры, мы их используем для модифициро-
модифицирования градиентного изображения с помощью процедуры, которая называется
минимальным подъемом. Техника минимального подъема (см. подробности в
[Soille, 2003]) модифицирует полутоновое изображение так, что локальные мини-
минимумы достигаются только в отмеченных положениях. Другие величины пикселов
повышаются для исчезания всех прочих точек локального минимума. Функция
IPT imimposemin реализует этот подход. Она вызывается командой
mp = imimposemin(f, mask),
442 Глава 10. Сегментация изображений
а) б) в)
г) д) е)
ж)
Рис. 10.22. а) Изображение гели, б) Избыточная сегментация в результате применения
преобразования водораздела к изображению модуля градиента, в) Локальные
минимумы модуля градиента, г) Внутренние маркеры, е) Внешние маркеры.
ою) Модифицированный модуль градиента, з) Результат сегментации. (Исход-
(Исходное изображение представлено д-ром С. Бёше, CMM/Ecole de Mines de Paris)
где f — это исходное полутоновое изображение, a mask — двоичное изображе-
изображение, пикселы переднего плана которого отмечают желаемое положение локаль-
локальных минимумов на выходном изображении тр. Мы модифицируем градиентное
изображение, приподнимая локальные минимумы в положениях внутренних и
внешних маркеров:
>> g2 = imimposemin(g, im | em) ;
Выводы 443
Рис. 10.22, е) показывает результат. Наконец, мы готовы совершить преобразова-
преобразование водораздела отмеченного и модифицированного градиентного изображения
и взглянуть на полученные линии водоразделов:
>> L2 = watershed(g2) ;
» f2 = f;
>> f2(L2 == 0) = 255;
Последние две команды помещают линии водоразделов на исходное изображение.
В результате получается значительно улучшенная сегментация, как показано на
рис. 10.22, ж). ?
Выбор подходящих маркеров может простираться от рассмотренных выше
простых процедур до существенно более сложных методов, которые вовлека-
вовлекают размеры, форму, положение, относительные расстояния, текстуру и т. д. (см.
гл. 11 в связи с описаниями изображений). Ключевое место во всех этих методах
заключается в том, что использование маркеров добавляет априорную инфор-
информацию для облегчения задачи сегментации. Априорные знания часто помогают
при сегментации и при решении задач более высокого уровня, и самым попу-
популярным методом является использование контекста. Таким образом, тот факт,
что сегментация по водоразделам предлагает подход, который позволяет эффек-
эффективно использовать этот тип информации, означает существенное преимущество
данного метода.
Выводы
Сегментация изображения является важным предварительным шагом большин-
большинства задач автоматического распознавания зрительных образов и анализа сцен.
Как показывают рассмотренные в этой главе примеры, выбор того или иного
метода сегментации часто зависит от специфических особенностей изучаемой за-
задачи. Хотя набор методов, изложенных в этой главе, далек от исчерпывающего,
он является характерным инструментарием сегментации, применяемой на прак-
практике.
ГЛАВА I I
ПРЕДСТАВЛЕНИЕ
И ОПИСАНИЕ
Введение
После сегментации изображения на области, например, с помощью методов, опи-
описанных в гл. 10, выделенные «грубые» совокупности пикселов обычно описыва-
описываются и представляются в форме, удобной для последующей компьютерной обра-
обработки. При выборе способа представления имеется две возможности:
A) область можно представить ее внешними характеристиками (т. е. границей)
или
B) область можно представить внутренними характеристиками (т. е. совокуп-
совокупностью элементов изображения, составляющих эту область).
Однако выбор способа представления является только частью задачи преобра-
преобразования данных в форму, удобную для компьютерной обработки. Следующая
задача состоит в том, чтобы описать область, исходя из выбранного способа
представления. Например, область может быть представлена своей границей, а
граница — описана с помощью таких характеристик, как ее длина, направление
прямых, соединяющих угловые точки, и число вогнутостей границы.
Внешнее представление обычно выбирается в тех случаях, когда основное вни-
внимание обращено на характеристики формы области. Внутреннее представление
выбирается, если интерес представляют свойства самой области, например, цвет
или текстура. Иногда приходится использовать оба способа представления од-
одновременно. В любом случае, выбранные для описания признаки (дескрипторы)
должны быть как можно менее чувствительными к изменению размеров обла-
области и ее перемещению по полю изображения (сдвигу или повороту). За редким
исключением, рассматриваемые в этой главе дескрипторы обладают одним или
несколькими из этих свойств.
I I. I. Предварительные сведения
Областью называется компонента связности, а границей области (называемой
также обводом или контуром) является множество пикселов этой области, ко-
которые имеют один или несколько соседних пикселов, не принадлежащих обла-
области. Точки, не принадлежащие области или ее границе, называются фоновыми.
Сначала мы будем рассматривать только двоичные изображения, поэтому точки
области или ее границы имеют значение 1, а значение фоновых точек равно 0.
Позже в этой главе рассматриваются также недвоичные значения пикселов.
11.1. Предварительные сведения
Из приведенных выше определений следует, что граница образует замкнутое
множество точек. Точки границы называются ориентированными, если они об-
образуют последовательность, которая обходится по или против часовой стрелки.
Граница называется минимально связной, если любая из ее точек имеет в точ-
точности двух соседей величины 1, которые не являются 4-связными. Внутренней
точкой области является любая ее точка, не лежащая на границе.
Материал этой главы существенно отличается от материалов, обсуждавшихся
в предыдущих главах, в том смысле, что нам придется оперировать со смесью
различных типов данных, таких как области, границы, топологические формы
и так далее. Поэтому перед тем, как двигаться далее, мы сделаем отступление
и определим некоторые базовые понятия и функции MATLAB и IPT, которые
будут использоваться в дальнейшем.
11.1.1. Смешанные массивы и структуры
Мы начнем с обсуждения смешанных массивов и структур, которые были корот-
коротко введены в § 2.10.6.
Смешанные массивы
Смешанные массивы позволяют комбинировать и смешивать объекты разных ти-
типов (как-то: числа, символы, матрицы и другие смешанные массивы), присваивая
таким переменным общие имена. Например, пусть мы работаем
A) с некоторым изображением f класса uint8 размерами 512x512;
B) с последовательностью b двумерных вещественных координат, представлен-
представленной в форме массива 188x2; и
C) со смешанным массивом, который содержит две символьные строки
char.array = {'area', 'centroid'}.
Эти три непохожих объекта можно объединить в одну переменную С с помощью
особого типа данных, называемого смешанным массивом:
С = {f, Ъ, char_array},
где фигурные скобки обозначают содержимое смешанного массива. Если в ко-
командной строке набрать команду С, то это вызовет следующий отклик системы:
>> С
С =
[512x512 uint8] [188x2 double] {1x2 cell}
Другими словами, выходом служат не значения различных переменных, а пе-
перечисление некоторых их свойств. Чтобы обратиться к содержимому некото-
некоторого элемента массива, необходимо заключить индекс (числовое местоположе-
местоположение) этого элемента в фигурные скобки. Например, чтобы увидеть содержимое
char_array, следует набрать
» С{3}
ans =
'area' 'centroid'
Глава 11. Представление и описание
или воспользоваться функцией celldisp:
» celldisp(C{3})
ans{l} =
area
ans{2} =
centroid
Если вместо фигурных скобок подставить круглые, то это вызовет описание этой
переменной, как было выше:
>> СC)
ans =
{1x2 cell}
Мы можем работать с содержимым смешанного массива, преобразуя эти дан-
данные в числовую или другую уместную форму. Например, для извлечения f из С
мы выполним команду
» f = С{1};
Функция size дает размер смешанного массива:
>> size(C)
ans =
1 3
Функция cellf un, имеющая синтаксис
D = cellfun('fname' ,C),
применяет функцию f name к элементам смешанного массива С и возвращает ре-
результат в виде массива D класса double. Каждый элемент D содержит величину,
которая возвращается функцией fname, примененной к соответствующему эле-
элементу С. Размер D совпадает с размером С. Например,1
>> D = cellfun('length', С)
D =
512 188 2
Другими словами, здесь отображены следующие величины: length(f) = 512,
length (b) = 188 и length (char.array) = 2. Из материалов § 2.10.3 мы знаем,
что length (А) дает размер самой длинной размерности многомерного массива А.
Наконец, помните о комментарии, сделанном в § 2.10.6 о том, что смешанные
массивы содержат копии своих аргументов, а не указатели на них. Поэтому, ес-
если любой из аргументов массива С в предыдущем примере был изменен после
создания переменной С, то это не вызовет изменения в самой С.
хСм. справочную страницу для cellfun, где перечислены допустимые входные данные для
аргумента fname.
11.1. Предварительные сведения
Пример 11.1. Простые иллюстрации работы со сметанным массивом.
Мы хотим написать функцию, выходом которой является средняя яркость изоб-
изображения, его размер, средняя яркость по строкам и средняя яркость по столбцам.
Это можно сделать, следуя «стандартным» путем, сконструировав следующую
функцию:
function [AI, dim, Alrows, AIcols] = image_stats(f)
dim = size(f);
AI = mean2(f);
Alrows = mean(f, 2);
AIcols = mean(f, 1);
где f — это исходное изображение, а выходные аргументы соответствуют опи-
описанным выше величинам. Используя смешанный массив, можно написать так:
function G = image.stats(f)
G{1} = size(f);
G{2} = mean2(f);
G{3} = mean(f, 2);
G{4> = mean(f, 1);
Запись G(l) = {size(f)} (и аналогично для других элементов) также допусти-
допустима. Смешанные массивы могут быть многомерными. Например, предыдущую
функцию можно определить следующим образом:
function Н = image_stats2(f)
НA, 1) = {size(f)};
НA, 2) = {mean2(f)};
НB, 1) = {mean(f, 2)};
НB, 2) = {mean(f, 1)};
Или можно использовать запись вида Н{1,1} = size(f) и аналогично для всех
других компонентов. Добавочные размерности обрабатываются совершенно ана-
аналогично.
Предположим, что f имеет размер 512x512. Набрав G и Н после системного
приглашения, получим
G = image_stats(f)
>> Н = image_stats2(f);
» G
G =
[1x2 double] [1] [512x1 double] [1x512 double]
>> H
н =
[1x2 double] [1]
[512x1 double] [1x512 double]
Если необходимо работать с переменной, содержащейся в G, то мы ее извлекаем,
обратившись к нужному элементу смешанного массива, как раньше. Например,
если мы хотим получить размер f, то пишем
Глава 11. Представление и описание
или
>> v = Н{1,1}
где v — это вектор 1x1. Заметьте, что мы не воспользовались привычной коман-
командой [М, N] = G{1} для получения размера изображения. Это вызвало бы ошиб-
ошибку, поскольку только функции могут производить многомерные выводы. Чтобы
получить М и N, следует написать М = v(l) hN = vB). ?
Очевидная экономия в обозначениях предыдущего примера становится еще
более значительной, когда число выходных параметров велико. Однако при этом
наблюдается существенный недостаток, который заключается в потере ясности
и наглядности при использовании числовой адресации в отличие от присвоения
имен переменным. В этом месте могут помочь структуры.
Структуры
Структуры похожи на смешанные массивы в том смысле, что они позволяют
группировать данные различной природы, назначая им единую переменную. Од-
Однако в отличие от смешанных массивов, к составляющим которых обращаются с
помощью числовых адресов, элементам структур присваиваются имена, которые
называются полями.
Пример 11.2. Простая иллюстрация структур.
Продолжение темы из примера 11.1 прояснит эту концепцию. С помощью струк-
структур можно написать
function s = image_stats(f)
s.dim = size(f) ;
s.AI = mean2(f);
s.AIrows = mean(f, 2);
s.AIcols = mean(f, 1);
где s — это структура. Полями этой структуры являются AI (скаляр), dim (век-
(вектор 1x2), Alrows (вектор Мх2) и AIcols (вектор lxTV), где М и N обозначают
число строк и столбцов изображения. Обратите внимание на употребление точки
при отделении имени структуры от именем ее различных полей. Именем поля
может служить любая последовательность букв и цифр, начинающаяся с буквы.
Используя то же изображение, что и в примере 11.1, и набрав s и size(s)
после командного приглашения, получим следующие выходы:
>>
S =
>>
ans
s =
dim:
AI:
Alrows:
AIcols:
size(s)
=
1 1
[512 512]
1
[512x1
[1x512
double]
double]
11.1. Предварительные сведения
Заметим, что сама переменная s является скаляром, с которым, в нашем случае,
ассоциированы еще четыре поля.
Из этого примера видно, что логика кода такая же, как и раньше, но орга-
организация вывода данных намного нагляднее. Как и со смешанными массивами,
преимущество использования структур становится еще яснее при большом числе
различных выходных данных. ?
В предыдущем примере использовалась одна структура. Однако, если вместо
одного изображения их имеется Q штук, которые организованы в виде массива
размерами М xTVxQ, то функция приняла бы следующий вид:
function s = image_stats(f)
К = size(f);
for k = 1:KC)
s(k).dim = size(f(:, :, k));
s(k).AI = mean2(f(:, :, k));
s(k).AIrows = mean(f(:, :, k), 2);
s(k).AIcols = mean(f(:, :, k), 1);
end .
Другими словами, сами структуры можно индексировать. Несмотря на то, что
структуры, как и смешанные массивы, могут иметь произвольное число раз-
размерностей, наиболее употребительной формой является вектор, как показано в
предыдущей функции.
При извлечении данных из полей необходимо помнить размерность как пере-
переменной s, так и ее полей. Например, следующая команда извлекает все перемен-
переменные из Alrows и сохраняет их в v:
for k = l:length(s)
v(:, k) = s(k).Alrows;
end .
Отметим, что в v двоеточие стоит на первом месте, а индекс к на втором, посколь-
поскольку s имеет размерность lxQ, а размерность Alrows равна MxQ. Тогда, раз к
пробегает от 1 до Q, размерность v будет MxQ. Если бы нам потребовалось
извлекать данные из Alrows, то мы бы написали в цикле v(k, :).
Квадратные скобки можно использовать при записи информации в вектор
или матрицу, если поля структуры содержат скаляры. Например, пусть D.Area
содержит площадь каждой из 20 областей изображения. Запись
>> w = [D.Area] ;
порождает вектор w размером 1x20, каждый элемент которого является площа-
площадью одной области.
Как и в случае со смешанным массивом, когда величина присваивается полю
структуры, MATLAB помещает в структуру копию этой величины. Если исход-
исходная величина меняется после этого действия, то это изменение не отражается в
поле структуры.
Глава 11. Представление и описание
11.1.2. Некоторые дополнительные функции
MATLAB и IPT
Функция imf ill кратко упоминалась в табл. 9.3ив§ 9.5.2. Эта функция действу-
действует по-разному на двоичные и полутоновые изображения, поэтому для лучшего
понимания обозначений этого параграфа мы обозначим через fB и f I, соответ-
соответственно, двоичное и полутоновое изображение. Если выходом служит двоичное
изображение, то мы его обозначаем gB, а в противном случае оно обозначается
просто через g. Синтаксис
textgB = imfill(fB, locations, conn)
совершает операцию «затопления-заполнения» применительно к фоновым пик-
пикселам (т.е. она меняет значения этих пикселов на 1) входного двоичного изоб-
изображения fВ, начиная от точек, позиции которых обозначены в locations. Этот
параметр может быть вектором nxl (п — число позиций точек), и тогда в нем
записаны линейные индексы (см. § 2.8.2) координат начальных позиций точек.
Кроме того, параметр locations может быть матрицей пх2, в которой каж-
каждая строка состоит из двумерных координат одной из начальных позиций точек
в fB. Параметр conn обозначает тип связности, который применяется к пиксе-
пикселам фона: 4 (по умолчанию) и 8. Если параметры location и conn опущены,
то команда gB = imf ill (f В) отображает двоичное изображение f В на экране и
позволяет пользователю выбрать положение начальные позиции с помощью мы-
мыши. Нажатие левой кнопки добавляет точку. Нажатие Backspace или Delete
удаляет точку, выбранную на предыдущем шаге. Нажатие левой кнопки мыши
с удерживаемой клавишей Shift, правой кнопки или двойной щелчок задает по-
последнюю точку и дает старт процедуре заполнения. Нажатие Return завершает
выбор точек без добавления последней точки.
Использование синтаксиса
gB = imfill(fB, conn, 'holes')
приводит к заполнению дыр на двоичном изображении. Дырой называется мно-
множество фоновых пикселов, которых нельзя достигнуть путем заполнения фона,
начиная от края изображения. Как и раньше, conn обозначает тип связности: 4
(по умолчанию) и 8.
Синтаксис
g = imfill(fl, conn, 'holes')
заполняет дыры на полутоновом изображении f I. В этом случае дырой считается
участок темных пикселов, окруженный более яркими пикселами. Параметр conn
обозначает то же, что и раньше.
Функция find может использоваться в сочетании с bwlabel2 для возвра-
возвращения векторов координат пикселов, которые образуют специфический объект.
Например, если [gB, num] = bwlabel(fВ) выдает более одной связной области
(т.е. пшп > 1). то для получения, скажем, второй области, следует набрать
[г, с] = find(g == 2).
2См. обсуждение функция find и bwlabel в § 5.2.2 и § 9.4 соответственно.
11.1. Предварительные сведения
Двумерные координаты областей или границ в этой главе представлены в
виде массивов прх2, где каждая строка - это пара координат (ж, у), а пр обозна-
обозначает число точек области или границы. В некоторых случаях бывает необходимо
упорядочить эти массивы. Для этой цели применяется функция
z = sortrows(S).
Эта функция упорядочивает строки S по возрастанию. Аргументом S может слу-
служить или матрица, или вектор-столбец. В этой главе функция sortrows применя-
применяется исключительно к массивам прх2. Если несколько строк имеют одинаковые
первые координаты, то они упорядочиваются по возрастанию второй координа-
координаты. Если мы хотим упорядочить строки S и одновременно удалить повторные
строки, то следует применять функцию unique, которая имеет следующий син-
синтаксис:
[z, m, n] = unique(S, 'rows'),
где z — это отсортированный массив без повторов строк, a m и п имеют следующий
смысл: z = S(m, :) hS = z(n, :). Например, если S = [1 2; 6 5; 1 2; 4 3],
то z = [12; 4 3; 6 5], m = [3; 4; 2] и n = [1; 3; 1; 2]. Заметим, что z
упорядочен по возрастанию, и m обозначает, какие строки исходного массива были
сохранены в новом массиве z.
Часто бывает нужно сдвинуть строки массива вверх, вниз или в сторону на
заданное число позиций. Для этого можно использовать функцию circshif t:
z = circshift(S, [ud lr]),
где ud — это число элементов, на которое следует сдвигать вверх или вниз. Если ud
больше нуля, то все сдвигается вниз, а если меньше нуля, то — вверх. Аналогично,
если 1г положительно, то массив сдвигается вправо на 1г позиций, а в противном
случае он сдвигается влево. Если требуется сдвиг вверх или вниз, то имеется
упрощенная форма вызова функции
z = circshift(S, ud).
Если S — это изображение, то circshif t — это не что иное, как обычная про-
прокрутка (вверх и вниз) или панорамирование (влево и вправо) зацикленного изоб-
изображения.
11.1.3. Некоторые основные утилитные М-функции
В этой главе будут часто использоваться следующие типичные операции: пре-
преобразование областей и границ, упорядочение граничных точек в смежные цепи
и подвыборка границы для упрощения ее представления и описания. Здесь мы
рассмотрим некоторые утилитные М-функции, которые применяются для этих
целей. Чтобы излишне не углубляться в особенности организации этих процедур
и не отвлекаться от основных идей главы, мы обсудим лишь основной синтак-
синтаксис этих функций. Задокументированные коды всех этих функций имеются в
приложении В. Как отмечалось ранее, границы представляются в виде массивов
Глава 11. Представление и описание
прх2, в которых каждая строка соответствует паре двумерных координат. Мно-
Многие из этих функций автоматически конвертируют координатные массивы 2хпр
в массивы с размерами прх2.
Функция
В = boundaries(f, conn, dir)
отслеживает внешние границы объектов изображения f, которое предполагается
двоичным с нулевым фоном. Параметр conn обозначает используемую связность
выходных границ: его значение может быть равно 4 или 8 (по умолчанию). Пара-
Параметр dir указывает направление, в котором отслеживаются границы; его значе-
значение может быть 'cw' (по умолчанию) или 'ccw', что, соответственно, означает
направление по часовой стрелке или против. Итак, если выбрана 8-связность и
направление ' cw', то используется упрощенный синтаксис
В = boundaries(f).
Выходом обеих форм вызова функции является смешанный массив В, элементами
которого служат координаты точек обнаруженной границы. Первая и последняя
точки границы, возвращаемые функцией boundaries, совпадают. Этот приводит
к замкнутой границе.
Для закрепления этого материала предположим, что мы хотим найти границу
объекта с самой длинной границей на изображении i (для простоты предполо-
предположим, что имеется единственная такая граница). Это можно совершить, применяя
следующую последовательность команд:3
>> В = boundaries(f) ;
>> d = cellfun(>length', В);
>> [max_d, k] = max(d) ;
» v = B{k(l)};
Вектор v содержит координаты самой длинной границы входного изображения,
а к соответствует номеру области. Массив v имеет размеры прх2. Последняя
команда просто выбирает первую границу максимальной длины, если таковых
имеется много. Как отмечалось в предыдущем абзаце, первая и последняя точ-
точки каждой границы, выделенной функцией boundaries, совпадают, т.е. строка
v(l, :) равна строке v(end, :).
Функция bound2eight, имеющая форму вызова
Ь8 = bound2eight(b),
удаляет из b пикселы, которые необходимы для 4-связности, но не нужны для 8-
связности, и оставляет границу, чьи пикселы являются только 8-связными. Вход-
Входная матрица b должна иметь размер прх2, и в каждой ее строке записаны коор-
координаты (ж, у) граничных пикселов. Требуется, чтобы граница b была замкнута,
связна, и необходимо, чтобы пикселы границы были ориентированы по часовой
стрелке или против. Те же условия применяются к функции bound2f our:
Ь4 = bound2four(b).
3См. § 2.10.2, в котором объясняется такое использование функции max.
11.1. Предварительные сведения
Эта функция вставляет дополнительные пикселы в тех местах границы, где име-
имеется диагональная связность, тогда получается выходная граница, в которой пик-
пикселы являются 4-связными. Листинги программ этих функций приведены в при-
приложении В.
Функция
g = bound2im(b, M, N, хО, уО)
строит двоичное изображение g размерами MxiV, в котором 1 стоят на месте
точек границ и 0 на заднем плане. Параметры хО и уО обозначают положения
минимальных х- и у-координат b на изображении. Граница b должна быть ко-
координатным массивом размерами прх2 (или 2хгф), где пр - это число точек.
Если параметры хО и у0 опущены, то граница примерно центрируется в массиве
MxN. Если, в свою очередь, параметры М и N отсутствуют, то вертикальный и
горизонтальный размеры выходного изображения полагаются равными высоте и
ширине границы Ь. Если функция boundaries обнаруживает кратные границы,
то можно получить все эти координаты для использования в функции bound2im
путем связывания различных элементов смешанного массива В:4
Ъ = catU, B{:}),
где 1 обозначает связывание вдоль первой (вертикальной) размерности массива.
Функция
[s, su] = bsubsamp(b, gridsep)
совершает укрупняющую подвыборку (одинарной) границы b по решетке, линии
которой отстают друг от друга на gridsep пикселов. Выходом s является граница
с меньшим числом точек, чем было у Ь, число этих точек определяется значением
gridsep, a su — это множество граничных точек, перемасштабированных так, что
перемещения их координат образуют единое целое. Такое представление полезно
при кодировании границы с помощью цепных кодов, что обсуждается в § 11.1.2.
Требуется также, чтобы точки b были упорядочены по или против направления
часовой стрелки.
После совершения подвыборки границы функцией bsubsamp ее точки пере-
перестают быть связными. Их можно связать обратно, применив функцию
z = connectpoly(s(:,1), s(:,2)),
где строки s являются координатами границы после подвыборки. Необходимо,
чтобы точки s были упорядочены по или против часовой стрелки. Строки выхо-
выхода z являются координатами связанной границы, которая получается соединени-
соединением точек s самыми короткими путями, состоящими из 4- или 8-связных прямых
сегментов. Эта функция бывает полезной при построении связного граничного
многоугольника, который является более гладким (более простым) по сравне-
сравнению с исходной границей Ь, по которой он построен. Функция connectpoly так-
также довольно удобна при работе с функциями, которые строят только вершины
многоугольников, например, с функцией minperpoly, которая рассматривается в
11.2.3.
4См. § 6.1.1 для объяснения оператора cat. См. также пример 11.13.
Глава 11. Представление и описание
Вычисление целочисленных координат отрезков, соединяющих две точки, являет-
является базовым инструментом при работе с границами (например, функции connect poly
требуется как раз такая подфункция). Для этих целей хорошо подходит функция
из IPT intline, которая имеет синтаксис5
[х, у] = intline(xl, x2, yl, у2),
где (xl, у1)и(х2, у2) — это целочисленные координаты двух точек, которые
необходимо соединить прямой линией. Выходами х и у служат вектор-столбцы,
состоящие из целых х- и у-координат соединяющего отрезка.
I 1.2. Представление
Методы сегментации, обсуждавшиеся в гл. 10, дают на выходе необработанные
данные в форме множества пикселов, расположенных вдоль границы или внут-
внутри области. Хотя эти данные иногда непосредственно используются для получе-
получения дескрипторов (например, при определении текстурных признаков области),
обычная практика состоит в применении методов компактного представления
данных сегментации. Полученные компактные представления оказываются зна-
значительно более эффективными для вычисления дескрипторов. В этом разделе
мы рассмотрим различные подходы к описанию областей.
11.2.1. Цепные коды
С помощью цепных кодов граница представляется в виде последовательности со-
соединенных отрезков, для которых указаны длина и направление. Как правило,
такое представление основывается на отрезках с 4- или 8-связностью. Направ-
Направление каждого отрезка кодируется числом в соответствии со схемой нумерации,
например, как изображено на рис. 11.1, а) и б). Коды, построенные по этой схеме,
называются цепными кодами Фримана.
а)
б)
Рис. 11.1. Номера направ-
направлений а) для цепных кодов
с 4 направлениями и б) для
цепных кодов с 8 направле-
направлениями
Цепной код границы области зависит от начальной точки, но с помощью
простой процедуры его можно сделать инвариантным к ее выбору. Для этого
5Функция intline является недокументированной утилитой IPT. Ее программный код приве-
приведен в приложении В.
11.2. Представление
цепной код просто рассматривается как циклическая последовательность номе-
номеров направлений отрезков, и исходная точка переопределяется таким образом,
чтобы при начале отсчета с нее получалась линейная запись, соответствующая
целому числу наименьшей величины. Цепной код также можно сделать инва-
инвариантным относительно поворота [на углы с шагом 90° или 45°, как показано
на рис. 11.1, а) и б)], если вместо самого кода рассматривать его первую раз-
разность, которая формируется путем вычитания значений направления для всех
пар соседних элементов кодовой последовательности. Эта разность определяется
подсчетом числа смен направлений (против часовой стрелки на рис. 11.1), ко-
которые разделяют два смежных элемента кода. Например, для цепного кода с 4
направлениями 10103322 первая разность задается последовательностью 3133030.
Инвариантность по отношению к поворотам достигается путем ориентирования
границы по отношению к некоторым доминирующим характеристикам описыва-
описываемого объекта, например, вдоль его главных осей, как это делается в § 11.3.2.
Функция f chcode с синтаксисом
с = fchcode(b, conn, dir)
вычисляет циклические коды Фримана для множества точек ориентированной
границы, которое хранится в виде массива Ъ с размерами прх2. Выходом слу-
служит структура с со следующими полями, где числа внутри скобок определяют
размеры массивов:
с.f ее =цепной код Фримана A хпр)
c.diff ^первая разность кода с.fee (lxnp)
с.mm =целые числа наименьшей величины (lxnp)
c.diffmm=пepвaя разность кода с.mm (lxnp)
с.хОуО =координаты начала кода Ax2) .
Параметр conn задает связность кода; его значения могут быть 4 или 8 (по умол-
умолчанию). Величина 4 допустима, только если граница не содержит диагональных
переходов.
Параметр dir обозначает направление выходного кода: если он равен ' same',
то код имеет то же направление, что и у точек Ь. Если dir равен 'reverse', то
выбрано противоположное направление. По умолчанию принимается значение
'same5. Значит, при выполнении команды с = fchcode(b, conn) направление
выбирается по умолчанию, а команда с = f chcode (b) определяет по умолчанию
и направление, и связность.
Пример 11.3. Цепной код Фримана и некоторые его вариации.
На рис. 11.2, а) приведено изображение f замкнутого обхода, на которое нало-
наложен некоторый шум. Целью этого примера является построение цепного кода
и первой разности для границы объекта. При взгляде на рис. 11.2, а) становит-
становится очевидно, что шумовые фрагменты, касающиеся интересующего нас объекта,
приводят к весьма нерегулярной границе, которая не будет правильно отражать
общие формы объекта. Сглаживание является обычным процессом при работе с
зашумленной границей. На рис. 11.2, б) приведен результат g применения усред-
усредняющей маски 9x9 к исходному изображению:
456 Глава 11. Представление и описание
» h = fspecial('average', 9);
>> g = imf ilter(f, h, 'replicate');
Двоичное изображение на рис. 11.2, в) получено последующей пороговой обра-
обработкой:
>> g = im2bw(g, 0.5);
Граница этого изображения выделена с помощью функции boundaries, которая
обсуждалась в предыдущем параграфе:
>> В = boundaries (g) ;
Как и в иллюстрации к § 11.1.3, мы интересуемся самой длинной границей:
Рис. 11.2. а) Зашумленное изображение, б) Изображение, сглаженное усредняющей мас-
маской 9x9. в) Изображение после пороговой обработки, г) Граница двоичного
изображения, д) Укрупняющая подвыборка границы, е) Соединенные точки
из д)
» d = cellfun('length', В);
>> [max_d, k] = max(d) ;
>> b = B{1>;
Граница изображения на рис. 11.2, г) построена следующими командами:
>> [М N] = size(g);
>> g = bound2im(b, M, N, min(b(:, 1)), min(b(:, 2)));
11.2. Представление 457JJ1
Если строить цепной код непосредственно для Ь, то это приведет к длинной
последовательности с малыми изменениями, которые не обязательно полезны
для общего представления формы объекта. Поэтому в качестве естественной и
типичной процедуры при построении цепных кодов совершается укрупняющая
подвыборка границы с использованием функции bsubsamp, которая вводилась в
предыдущем параграфе:
>> [s, su] = bsubsamp(b, 50);
Здесь мы воспользовались разделяющей сеткой с шагом примерно в 10% от ши-
ширины изображения, которое в нашем случае имеет размеры 570x570 пикселов.
Полученный результат отображен в виде белых точек на рис. 11.2, д):
» g2 = bound2im(s, M, N, min(s(:, 1)), min(s(:, 2)));
или в виде соединяющих их отрезков на рис. 11.2, е), который получен командами
>> en = connectpoly(s(: , 1), s(:, 2));
>> g2 = bound2im(cn, M, N, min(cn(:, 1)), min(cn(:, 2)));
Преимущество такого представления с точки зрения цепного кодирования ста-
становится очевидным при сравнении рис. 11.2, г) и е). Цепной код получается из
укрупненной последовательности su:
>> с = f chcode(su) ;
Эта команда дает следующие результирующие выводы:
>> с.хОуО
ans =
7 3
>> с.fee
ans =
22022020000606666666644444424222
>> с.mm
ans =
00006066666666444444242222202202
>> c.diff
ans =
06206260006260000000600000626000
>> c.diffmm
ans =
00062600000006000006260000620626
Проверяя с.fee, рис. 11.2, e) и с.хОуО, видим, что код начинается слева от изоб-
изображения и обрабатывается в направлении по часовой стрелке, что совпадает с
направлением координат границы. ?
Глава 11. Представление и описание
11.2.2. Приближение ломаной линией минимальной
длины
Дискретная граница может быть сколь угодно точно приближена ломаной лини-
линией. В случае замкнутой границы аппроксимация является точной, когда число
отрезков ломаной равно числу точек границы, и каждую пару соседних точек
соединяет свой отрезок. На практике цель аппроксимации ломаной состоит в
том, чтобы с помощью как можно меньшего числа отрезков приблизить «самое
существенное» в форме границы.
Хороший практический метод приближения заключается в нахождении ло-
ломаной линии минимальной длины МРР (Minimum-Perimeter Polygon) для гра-
границы области. Теоретическое обоснование, а также алгоритм нахождения МРР
имеются в классической книге [Sklansky et al., 1972] (см. также [Kim, Sklansky,
1982]). В этом параграфе мы рассмотрим основы этого метода, а также приве-
приведем реализацию алгоритма в виде М-функции. Метод ограничивается поиском
простых ломаных линий (т.е., не имеющих самопересечений). Кроме того, из
рассмотрения исключаются области, имеющие выступы и отростки шириной в
один пиксел. Такие аномалии молено отделить от области с помощью морфоло-
морфологических методов, а затем добавить к построенной аппроксимирующей линии в
соответствующих местах.
Некоторые основы
Основную идею аппроксимации мы рассмотрим на простом примере. Предполо-
Предположим, что граница области заключена внутри множества соединенных в цепочку
ячеек, как показано на рис. 11.3, а). Это позволяет визуально представить гра-
границу области как резиновую ленту, находящуюся между двумя стенками, соот-
соответствующими внутренней и внешней границам указанной цепочки ячеек. При
стягивании ленты она примет форму, приведенную на рис. 11.3, б), образуя мно-
многоугольник с минимальным периметром, который отвечает геометрической фор-
форме данной цепочке ячеек.
б)
/
/
/
L
-
/
/
1
j
1
7
1
\
\
\
/
\
Рис. 11.3. а) Граница объ-
объекта, заключенная в клетки.
б) Ломаная линия минималь-
минимальной длины
Подход Склански основан на так называемом клеточном комплексе (или кле-
клеточной мозаике), который в нашем случае является множеством квадратных
11.2. Представление
клеток, покрывающим границу изучаемой области, как показано на рис. 11.3, а).
На рис. 11.4, а) изображена (серая) область, заключенная в клеточный комплекс.
Отметим, что граница этой области образована 4-связными путями. При обхо-
обходе по этим путям в направлении по часовой стрелке мы отметим закрашенным
кружком (•) выпуклые углы (имеющие внутренний угол 90°), а незакрашенным
кружком (о) — вогнутые углы (имеющие внешний угол 270°). На рис. 11.4, б)
черные кружки помещены прямо на выпуклые вершины, а белые расположены
по диагонали рядом с вогнутыми вершинами. Такая картина соответствует кле-
клеточному комплексу и формулировке алгоритма с помощью вершин.
Рис. 11.4. а) Область, отнесенная внеш- а) б)
ней стенкой клеточного комплекса из
рис. 11.3, а), б) Маркеры выпуклых (•)
и вогнутых (о) вершин для границы об-
области из а). Маркеры вогнутых вершин
расположены по диагонали рядом с со-
соответствующими вершинами
Следующие свойства образуют основу подхода при построении МРР:
1. Ломаная МРР соответствует простому связному клеточному комплексу без
самопересечений. Пусть Р обозначает МРР.
2. Каждая выпуклая вершина Р совпадает с некоторым кружком • (но не
каждый кружок • является вершиной Р).
3. Каждая вогнутая вершина Р совпадает с некоторым кружком о (но не
каждый кружок о является вершиной Р).
4. Если кружок • принадлежит Р, но не является выпуклой вершиной Р, то
этот кружок лежит на стороне Р.
В нашем обсуждении вершина ломаной называется выпуклой, если величина
его внутреннего угла в лежит в диапазоне 0 < в < 180° х; в противном случае,
вершина называется вогнутой. Как и в предыдущем абзаце, выпуклость опреде-
определяется для внутренней области при обходе границы по часовой стрелке.
Алгоритм для нахождения МРР
Свойства с 1 по 4 являются основой при построении ломаной минимальной дли-
длины МРР. Имеется несколько способов сделать это построение (см., например,
[Sklansky et al., 1972] и [Kim, Sklansky, 1982]). Подход, которому мы здесь следу-
следуем, разработан с учетом возможностей двух ключевых функций IPT/MATLAB.
Первая из них с именем qtdecomp выполняет разложение по квадродереву, кото-
которое приводит к окружению интересующих данных клеточным комплексом. Вто-
Вторая функция называется inpolygon. Она используется для определения точек,
1Угол в = 0° исключается, а случай в = 180° рассматривается как особый.
Глава 11. Представление и описание
которые лежат вне или внутри границы ломаной линии, заданной своими вер-
вершинами.
Полезно разрабатывать процедуру построения МРР, имея перед глазами неко-
некоторую иллюстрацию. Для этого мы воспользуемся рис. 11.3 и 11.4. Построе-
Построение 4-связной границы затемненной области на рис. 11.4, а) будет обсуждаться
несколько позже в этом параграфе. После того, как эта граница установлена,
следующий шаг заключается в нахождении ее вершин. Эта процедура делается
построением их цепного кода Фримана. Изменения кодовых направлений указы-
указывают на углы границы. Анализируя изменения направлений, мы двигаемся по
часовой стрелке вдоль границы. Тогда достаточно несложно установить и раз-
разметить выпуклые и вогнутые вершины, как это сделано на рис. 11.4, б). Особый
способ построения этих маркеров задокументирован в М-функции minperpoly,
которая будет обсуждаться далее в этом параграфе. Разметка вершин таким спо-
способом также отражена на рис. 11.4, б), которую мы повторяем на рис. 11.5, а).
Затемненная область, а также линии квадратной решетки добавлены для нагляд-
наглядности. Граница области не показана, чтобы избежать путаницы при построении
ломаных границ на остальных схемах рис. 11.5.
Теперь строим исходную ломаную линию, используя для этого только выпук-
выпуклые вершины (черные кружки), как показано на рис. 11.5, б). Из свойства 2 мы
знаем, что множество выпуклых вершин МРР является подмножеством этого
исходного множества выпуклых вершин. Видно, что все вогнутые вершины (бе-
(белые кружки), лежащие вне начального многоугольника, не образуют вогнутости
многоугольника. Чтобы эти особые вершины стали выпуклыми на следующих
стадиях алгоритма, ломаная должна пройти через эти точки. Но мы знаем, что
они никогда не смогут стать выпуклыми, поскольку все возможные выпуклые
вершины уже учтены к этому моменту (может случиться, что позже их углы
могут стать равными 180°, но это не скажется на форме многоугольника). Сле-
Следовательно, все белые кружки, расположенные вне исходного многоугольника,
можно удалить перед дальнейшем анализом, что и сделано на рис. 11.5, в).
Вогнутые вершины (белые кружки), расположенные внутри многоугольника,
ассоциированы с вогнутостями на границе, которые были проигнорированы на
первом проходе процедуры. Следовательно, их нужно добавить к ломаной, что
сделано на рис. 11.5, г). К этому моменту имеются черные вершины, которые
перестали быть выпуклыми в новом многоугольнике [они отмечены стрелками
на рис. 11.5, г)]. Имеется две причины для этого. Первая причина состоит в том,
что эти вершины являлись частью исходного многоугольника на рис. 11.5, б),
в который были включены все выпуклые (черные) вершины. Другая причина
состоит в том, что черные вершины стали вогнутыми в результате добавления
(белых) вершин, как это произошло на рис. 11.5, г). Значит, все черные кружки
многоугольника необходимо проверить, чтобы выяснить, не стали ли величины
соответствующих внутренних углов больше 180°. Все такие вершины необходимо
удалить, а затем повторить процедуру.
На рис. 11.5, д) показана лишь одна черная вершина, которая потеряла вы-
выпуклость на втором шаге обработки. Процедуру проверки и удаления следует
остановить, как только все вершины перестанут менять выпуклость. После этого все
вершины с углами 180° можно также удалить, поскольку они лежат на сторонах
11.2. Представление
г) д) е)
ж)
Рис. 11.5. а) Выпуклые (черные) и вогнутые (белые) вершины границы на рис. 11.4, а),
б) Начальная ломаная, соединяющая все выпуклые вершины, в) Результат по-
после удаления выпуклых вершин вне многоугольника, г) Присоединение остав-
оставшихся вогнутых вершин к многоугольнику (стрелками отмечены черные вер-
вершины, которые стали вогнутыми; они будут удалены), д) Результат удаления
вогнутых черных вершин (стрелкой обозначена черная вершина, ставшая те-
теперь вогнутой), е) Окончательный результат, отображающий МРР. сне) Лома-
Ломаная МРР, наложенная на клеточный комплекс границы
Глава 11. Представление и описание
ломаной и не влияют на форму окончательного многоугольника. Граница, изоб-
изображенная на рис. 11.5, е), представляет собой ломаную минимальной длины МРР
нашего примера. Она же приведена на рис. 11.3, б). Наконец, на рис. 11.5, ж)
представлена МРР с наложением на исходный клеточный комплекс.
Предыдущие рассуждения суммируются в следующих шагах построения МРР
области:
1. Построить клеточный комплекс (метод построения будет изложен далее в
этом параграфе).
2. Выделить внутреннюю область комплекса.
3. Построить для выделенной на шаге 2 области ее границу с помощью функ-
функции boundaries, представив границу в виде 4-связной последовательности
координат с направлением обхода по часовой стрелке.
4. Для этой 4-связной последовательности получить цепной код Фримана с
помощью функции f encode.
5. Отметить выпуклые (черные кружки) и вогнутые (белые кружки) вершины
на цепном коде.
6. Построить исходный многоугольник, используя все черные кружки как его
вершины. Удалить из дальнейшего анализа все белые кружки, лежащие
вне этого многоугольника (сохраняя белые кружки, лежащие на границе
многоугольника).
7. Построить многоугольник из оставшихся черных и белых кружков-вершин.
8. Удалить все черные кружки, которые стали вогнутыми.
9. Повторять шаги 7 и 8 до тех пор, пока не прекратятся изменения выпук-
выпуклости вершин. После этого удалить все вершины с величиной угла 180°.
Оставшиеся вершины образуют ломаную минимальной длины МРР.
Некоторые М-функции, используемые в алгоритме МРР
Функция qtdecomp, рассмотренная в § 10.4.2, используется на первом шаге при
построении клеточного комплекса, покрывающего границу. Как обычно, мы рас-
рассматриваем область В, которая составлена из 1-иц и фоновых 0-ей. Мы восполь-
воспользуемся следующей формой вызова функции qtdecomp:
Q = qtdecomp(В, threshold, [mindim maxdim]),
где Q — это разреженная матрица, содержащая структуру квадродерева. Если
Q(k, m) не равно нулю, то (k, m) является верхним левым углом блока разло-
разложения и размер блока равен Q(k, m).
Блок разделяется, если максимальное значение элементов блока минус их ми-
минимальное значение больше, чем threshold. Величина этого параметра заключе-
заключена между 0 и 1 независимо от класса входного изображения. При указанном син-
синтаксисе функция qtdecomp не производит блоки с размерами меньше, чем mindim
и больше, чем maxdim. Блоки, размеры которых превосходят maxdim разделяют-
разделяются, даже если они не удовлетворяют пороговому условию. Частное maxdim/mindim
должно быть степенью числа 2.
Если в аргументе функции qtdecomp в конце присутствует лишь одна вели-
величина (без квадратных скобок), то она считается равной maxdim. В таком виде
11.2. Представление
эта функция используется в данном параграфе. Изображение В должно иметь
размеры КхК, так что частное K/mindim является степенью числа 2. Ясно, что
наименьшее возможное значение К равно наибольшей размерности В. Для вы-
выполнения этого требования обычно матрица В дополняется нулями с помощью
функции padarray при выборе опции 'post'. Например, пусть матрица В име-
имеет размер 640x480 и задана величина mindim = 3. Параметр К должен удовле-
удовлетворять условиям К >= max(size(B)) и K/mindim = 2Лр или К = mindim* BЛр).
Разрешая эти соотношения относительно р, получаем р = 8 и, следовательно,
К = 768.
Для нахождения величин блоков при разложении на квадродерево мы вос-
воспользуемся функцией qtgetblk, которая обсуждалась в § 10.4.2:
[vals, г, с] = qtgetblk(В, Q, mindim),
где vals — это массив, состоящий из значений mindimxmindim блоков разло-
разложения по квадродереву матрицы В, a Q — разреженная матрица, возвращаемая
функцией qtdecomp. Параметры г и с являются векторами, в которые записаны
координаты сторон и столбцов верхних левых углов блоков.
Пример 11.4. Построение клеточной стенки границы области.
Чтобы увидеть реализацию шагов с 1 по 4 алгоритма МРР, рассмотрим изоб-
изображение на рис. 11.4, а) и предположим, что параметр mindim = 2. Пикселы
представлены маленькими квадратиками для облегчения объяснения функции
qtdecomp. Изображение имеет размер 32x32 пикселов, и легко проверить, что
для выбранного значения mindim не требуется делать расширение изображения.
4-связная граница этой области получается с помощью следующей команды2:
>> В = bwperim(B, 8);
На рис. 11.6, б) показан результат. Отметим, что В стало изображением, на кото-
котором отображена только 4-связная граница (напомним, что маленькие квадратики
обозначают отдельные пикселы).
На рис. 11.6, в) показано разложение по квадродереву для В, которое получе-
получено командой
>> Q = qtdecomp(В, 0, 2);
Здесь 0 — это порог, который допускает разложение блоков вплоть до мини-
минимального размера 2x2 независимо от расположения в них 0 и 1 (каждый из этих
блоков может содержать от 0 до 4 пикселов). Заметьте, что имеется много блоков,
размеры которых больше, чем 2x2, но все они образованы фоновыми пикселами.
Теперь мы воспользуемся командой qtgetblk (В, Q, 2) для извлечения вели-
величин и координат верхних левых углов для всех блоков с размером 2x2. После
2Синтаксис функции bwperim имеет вид g = bwperim(f, conn), где conn обозначает желаемую
связность: 4 (по умолчанию) или 8. Связность определяется относительно фоновых пикселов.
Поэтому, для получения 4-связной границы объекта мы выбрали conn = 8. Наоборот, для по-
построения 8-связной границы следует положить conn = 4. Выходом g служит двоичное изобра-
изображение границ объектов изображения f. Эта функция рассматривается подробно в § 11.3.1.
Глава 11. Представление и описание
этого все блоки, содержащие не менее одного пиксела со значением 1, полно-
полностью заполняются единицами. Результат, который мы обозначили BF, показан на
рис. 11.6, г). Серые клетки на этом изображении образуют клеточный комплекс.
Другими словами, эти клетки покрывают границу на рис. 11.6, б).
а) б) в)
е)
Рис. 11.6. а) Исходное изображение, где пикселы обозначены маленькими квадратами.
б) 4-связная граница, в) Разложение по квадродереву с использованием бло-
блоков с минимальным размером сторон в 2 пиксела, г) Результат заполнения
1-ми всех блоков размерами 2x2, которые содержат не менее одного единич-
единичного элемента. Это и есть клеточный комплекс, д) Внутренняя область для г),
е) 4-связные граничные точки, полученные с помощью функции boundaries.
Цепной код построен функцией f encode
Область, ограниченная клеточным комплексом на рис. 11.6, г), построена ко-
командой
>> R = imfilKBF, 'holes') & ~BF;
Рис. 11.6, д) дает результат. Теперь мы хотим выделить 4-связную границу этой
области, которая получается командами
>> Ъ = boundaries(b, 4, 'cw');
>> b = b{l};
Рис. 11.6, e) отображает результат. Цепной код Фримана, показанный на этом
рисунке, получен функцией f encode. На этом завершаются шаги с 1 по 4 алго-
алгоритма МРР. ?
11.2. Представление
Функция inpolygon используется функцией minperpoly (которая обсуждает-
обсуждается в следующем параграфе) для выяснения, лежит ли точка внутри, на границе
или вне многоугольника. Она имеет синтаксис
IN = inpolygon(X, Y, xv, yv),
где X и Y — это векторы, состоящие из х- и у-координат тестируемых точек, a xv
и yv — векторы, образованные из х- и у-координат вершин многоугольника, рас-
расположенные в последовательности по или против направления часовой стрелки.
Массив IN является вектором, длина которого равна числу тестируемых точек.
Его значение равно 1 для точек, лежащих внутри или на границе многоугольни-
многоугольника, и 0 — для точек, расположенных вне границ многоугольника.
М-функция для построения МРР
Все шаги алгоритма с 1 по 9 реализованы функцией minperpoly, программный
код которой приведен в приложении В. Она имеет синтаксис
[х, у] = minperpoly(В, cellsize),
где В — это входное двоичное изображение, содержащее единственную область
или границу, a cellsize — это размер квадратных ячеек клеточного комплек-
комплекса для покрытия границы. Векторы-столбцы х и у содержат х- и у-координаты
вершин МРР.
Пример 11.5. Использование функции minperpoly.
На рис. 11.7, а) показано изображение В кленового листа, а на рис. 11.7, б) при-
приведена его граница, выделенная командами
>> b = boundaries (В, 4, Jcw');
» b = b{l};
» [М, N] = size(B);
>> xmin = min(b(:, 1));
>> ymin = min(b(:, 2));
>> bim = bound2im(b, M, N, xmin, ymin);
>> imshow(bim)
С этой эталонной границей будут сравниваться различные ломаные МРР в дан-
данном примере. На рис. 11.7, в) приведен результат команд
>> [х, у] = minperpoly (В, 2);
>> Ь2 = connectpoly(x, у);
>> В2 = bound2im(b2, M, N, xmin, ymin);
>> imshow(B2)
Аналогично, на рис. 11.7 с г) по е) показаны различные МРР, построенные по
квадратным ячейкам с размерами 3, 4 и 8 пикселов соответственно. Тонкий сте-
стебель был утрачен при использовании клеток, крупнее чем 2x2, в силу уменьше-
уменьшения разрешения. Вторая основная характеристика формы листа связана с тремя
основными его долями. Эти особенности прослеживаются достаточно отчетливо
даже для ячеек со стороной 8, как показано на рис. 11.7, е). При дальнейшем
Глава 11. Представление и описание
увеличении размеров ячеек до 10 и даже до 16 эти характеристики все еще со-
сохраняются, как видно на рис. 11.8, а) и б). Однако на рис. 11.8, в) и г), видно,
что эти характерные черты теряются для 20 и для больших значений.
Стрелками на рис. 11.7, в) и д), отмечены узлы, образованные самопересека-
самопересекающимися линиями. Такие узлы могут возникать, если размер отступа на границе
по отношению к размеру ячейки такой, что при разметке вогнутых вершин их
положения «пересекают» друг друга, изменяя направление последовательности
по часовой стрелке. Один способ в разрешении этой коллизии состоит в уда-
удалении одной из вершин. Другой путь — это увеличить или уменьшить размер
ячейки. Например, рис. 11.7, г), отвечающий размеру 3, не обнаруживает эту
особенность, которая проявилась для размеров ячеек 2 и 4. ?
е)
Рис. 11.7. а) Исходное изображение, б) 4-связная граница, в) Ломаная МРР, построенная
по ячейкам с размером сторон в 2 пиксела. г)-е) МРР, построенные, соответ-
соответственно, по ячейкам со сторонами 3, 4 и 8
11.2.3. Сигнатуры
Сигнатура есть описание границы объекта с помощью одномерной функции, ко-
которая может строиться различными способами. Один из простейших методов
состоит в нахождении зависимости расстояния от центроида (т. е. от некоторой
средней точки объекта, например, от его центра тяжести) до границы объекта в
виде функции угла, что иллюстрирует рис. 11.9. Независимо от способа построе-
построения сигнатуры, основная идея состоит в том, чтобы свести представление грани-
11.2. Представление
цы к одномерной функции, которую предположительно описать легче, чем исход-
исходную двумерную границу. Имейте в виду, что такой метод сигнатурного описания
годится, только если известно, что вектор, проведенный из начала координат до
границы, пересекает эту границу только один раз, что приводит к однозначно
определенной функции от возрастающего угла. Это условие исключает границы
с самопересечениями, а также границы, имеющие глубокие узкие вогнутости или
тонкие длинные выступы.
Рис. 11.8. МРР, построен- а)
ные по еще большим ячей-
ячейкам с размерами а) 10, б) 16,
в) 20 и г) 32
Сигнатуры, построенные описанным выше способом, инвариантны по отно-
отношению к параллельному переносу, однако они зависят от поворота и изменения
масштаба. Инвариантности к повороту можно достичь, найдя способ выбора од-
одной и той же начальной точки для построения сигнатуры независимо от ориен-
ориентации фигуры. Один из способов сделать это заключается в выборе в качестве
начальной максимально удаленную от центроида точку (см. § 11.3.1) при усло-
условии, что такая точка единственна и не зависит от искажений, возникающих при
поворотах интересующих фигур.
Другой способ может заключаться в выборе максимально удаленной от цент-
центроида точки на собственной оси фигуры (см. § 11.5). Такой метод требует больше-
большего объема вычислений, но является и более устойчивым, поскольку направление
оси фигуры определяется с учетом всех точек ее контура. Еще один способ осно-
основан на получении цепного кода границы и на последующем применении метода,
описанного в § 11.1.2, полагая, что поворот можно аппроксимировать дискрет-
дискретными углами в кодовых направлениях, определенных в § 11.1.
Если исходить из предположения, что изменение масштаба производится оди-
одинаково по обеим осям и дискретизация по углу 9 является равномерной, то
Глава 11. Представление и описание
масштабирование фигуры отражается на изменении амплитуды соответствую-
соответствующей сигнатуры. Этот результат можно пронормировать путем масштабирования
функций сигнатуры таким образом, чтобы они всегда охватывали один и тот
же диапазон значений, например, [0,1]. Достоинством данного метода является
простота, однако его серьезный недостаток кроется в том, что масштабирование
всей функции определяется всего двумя значениями — минимальным и макси-
максимальным. Если в изображении присутствует шум, эта зависимость может стать
источником расхождений между объектами. Более устойчивый (но также требу-
требующий больших вычислений) метод состоит в делении каждого углового отсче-
отсчета на дисперсию сигнатурной функции в предположении, что эта дисперсия не
равна нулю [как на рис. 11.9, а)] и не очень мала (тогда не возникнут вычис-
вычислительные трудности). Учет дисперсии приводит к переменному коэффициенту
масштабирования, который обратно пропорционален изменениям размеров и дей-
действует аналогично автоматической регулировке расхождения. Какой бы способ
ни применялся, следует иметь в виду, что основная идея состоит в устранении
зависимости от масштаба при сохранении формы кривой в целом.
а)
б)
Рис. 11.9. Два объекта: а) круг
и б) квадрат, в) и г) — соответ-
соответствующие сигнатурные функции
расстояния в зависимости от угла
r(u)
А —
V2A
А
4 2
Зр р
4 „
5р Зр 7р
4 2 4
2р
р р Зр р 5р Зр 7р 2р
4 2 4 4 2 4
Функция signature, включенная в приложение В, находит сигнатуру задан-
заданной границы. Она имеет синтаксис
[st, angle, хО, уО] = signature(b, xO, yO),
где b — это массив прх2, состоящий из #?/-координат границы, ориентирован-
ориентированной по или против направления часовой стрелки. Сигнатура является функцией
угла angle, которая записывается в массив st. Координаты (хО, уО) обознача-
обозначают начало вектора, который продолжается до границы. Если эти координаты не
включены в аргументы, функция использует по умолчанию координаты цент-
центроида границы. В любом случае, координаты начала использованного вектора
(хО, уО) включаются функцией в выходные данные. Размеры массивов st и
angle равны 360x1, т. е. разрешение составляет 1°. Входом должна служить гра-
граница толщиной в один пиксел, которая получена, например, с помощью функции
boundaries (см. § 11.1.3). Как всегда предполагается, что граница является замк-
замкнутой кривой.
RHO
11.2. Представление
Функция signature использует функцию MATLAB
cart2pol для перехода от декартовых координат к по-
полярным. Она вызывается командой
[THETA, RHO] = cart2pol(X, Y),
где X и Y — это векторы, содержащие декартовы ко-
координаты точек, а векторы ТНЕТА и RH0 образованы со-
соответствующими значениями угла и длины в полярных
координатах. Если X и Y являются векторами-строками,
то ими же являются векторы ТНЕТА и RH0. То же самое
относится и к векторам-столбцам. На рис. 11.10 показа-
показано общепринятое соотношение для преобразования ко-
координат, которое принято и в MATLAB. Обратите вни-
внимание, что при таких обозначениях координаты (X, Y) связаны с координатами
нашего изображения по формулам: X = у и Y = -х [см. рис. 2.1, а)]. Функция
pol2cart совершает обратное преобразование в декартовы координаты:
[X, Y] = pol2cart(ТНЕТА, RH0).
ТНЕТА
Рис. 11.10. Соотношение
декартовых и полярных ко-
координат
Рис. 11.11. а) и б) Грани- а)
цы искривленного квадрата
и треугольника, в) и г) Соот-
Соответствующие им сигнатуры
250
100 200 300 400
Пример 11.6. Сигнатуры.
На рис. 11.11, а) и б), изображены границы bs и bt, соответственно, искривлен-
искривленного квадрата и треугольника, которые помещены в массив размерами 674x674
пиксела. На рис. 11.11, в) построена сигнатура квадрата, вычисленная парой ко-
команд
Глава 11. Представление и описание
» [st, angle, хО, уО] = signature(bs);
>> plot (angle, st)
Координаты хО и у0 начала вектора определены функцией самостоятельно.
Они равны [342, 326]. Аналогичные команды порождают график на рис. 11.11, г),
а центроид имеет координаты [416,335]. Обратите внимание на то, что для раз-
различения этих двух границ достаточно просто подсчитать количество пиков на
графиках двух сигнатур. ?
11.2.4. Сегменты границы
Часто оказывается полезным разбить границу на сегменты. При такой деком-
декомпозиции уменьшается сложность границы и тем самым упрощается процесс ее
описания. Такой подход особенно привлекателен, когда граница содержит одну
или несколько хорошо выраженных выпуклых или вогнутых участков, несущих
информацию о форме объекта. В этом случае мощным инструментом для устой-
устойчивой декомпозиции границы является использование выпуклой оболочки обла-
области, находящейся внутри границы.
Выпуклой оболочкой Н произвольного множества 5 называется наименьшее
выпуклое множество, содержащее 5. Разность множеств H\S называется дефек-
дефектом выпуклости D множества 5. Чтобы проиллюстрировать, как эти понятия
могут использоваться для разбиения границы на содержательные сегменты, рас-
рассмотрим рис. 11.12, а), на котором изображен объект (множество 5) со своим
дефектом выпуклости (он закрашен в темный цвет). Границу области 5 можно
разбить на части, обходя ее контур и отмечая точки входа в область и выхода из
области дефекта выпуклости. На рис. 11.12, б) показаны положения этих точек
в рассматриваемом случае. Заметим, что результат такого разбиения, в принци-
принципе, не зависит от изменения размеров и ориентации области. При практической
реализации этот тип обработки предшествует существенному сглаживанию изоб-
изображения с целью удаления «несущественных» участков выпуклости/вогнутости
границы. Инструмент декомпозиции границы в MATLAB содержится в функции
regionprops, которая будет разбираться в § 11.4.1.
Рис. 11.12. а) Область 5 и ее
дефект выпуклости (темный).
б) Разбиение границы
11.2.5. Остовы областей
Важный подход представления формы плоской области основан на ее сведении к
графу. Такое сокращенное представление можно получить, выделяя остов обла-
11.2. Представление
сти с помощью подходящей процедуры утончения (этот процесс иначе называют
скелетонизацией).
Остов области можно определить с помощью преобразования к главным осям
MAT (Medial Axis Transformation). Преобразование МАТ области R с границей
b выполняется следующим образом. Для каждой точки р области R находим
ближайшую к ней точку границы 6. Если таких точек имеется больше одной,
то говорят, что точка р лежит на серединной оси (т. е. она принадлежит остову)
области R.
Хотя понятие МАТ очень понятно и наглядно, прямое нахождение остова
сталкивается со значительными вычислительными трудностями, поскольку в этой
операции задействовано вычисление расстояния от каждой внутренней точки до
каждой точки границы области. Было предложено много разных алгоритмов
для повышения вычислительной эффективности МАТ. Одновременно с этим де-
делались попытки приближенного представления области ее остовом.
Как отмечалось в § 9.3.4, IPT позволяет строить остов всех областей, имею-
имеющихся на двоичном изображении В, с помощью функции bwmorph, которая имеет
следующий синтаксис:
S = bwmorph(В, 'skel', Inf).
Эта функция удаляет пикселы с границ объектов, но не дает им разваливать-
разваливаться на части. Оставшиеся в результате пикселы образуют остов изображения.
Такой подход сохраняет эйлерову характеристику объекта (она определяется в
табл. 11.1).
Пример 11.7. Построение остова области..
На рис. 11.13, а) приведено изображение f хромосомы человека. Так она выгля-
выглядит после предварительной обработки фотографии, полученной на электронном
микроскопе с увеличением в 30000 раз. Целью данного примера является нахож-
нахождение остова хромосомы.
Ясно, что первым шагом процесса должно стать отделение хромосомы от фо-
фона, содержащего несущественные детали. Подход заключается в сглаживании
изображения, а затем в совершении пороговой обработки. На рис. 11.13, б) дан
результат сглаживания f посредством гауссовой пространственной маски разме-
размерами 25x25 с величиной sig = 15:
>> f = im2double(f);
>> h = f special( 'gaussian', 25, 15);
>> g = imf ilter(f, h, 'replicate');
>> imshow(g) °/o рис. 11.13, 6) )
На следующем шаге совершается пороговое преобразование изображения:
>> g = im2bw(g, 1.5*graythresh(g)) ;
>> figure, imshow(g) °/0 рис. 11.13, в),
где автоматически вычисленный порог graythresh(g) увеличивается в полто-
полтора раза для повышения на 50% доли отбракованных пикселов. Причина заклю-
заключается в том, что повышение порога увеличивает долю выбрасываемых пиксе-
Глава 11. Представление и описание
лов границы, с помощью чего достигается дополнительное сглаживание. Остов
рис. 11.13, г) был получен командой
>> s = bwmorph(g, 'skel', Inf); '/. рис. 11.13, г)
Лишние отростки на остове были отсечены командой
>> si = bwmorph(s, 'spur', 8); °/в рис. 11.13, д),
а) б)
Рис. 11.13. а) Выделенная хромосома человека, б) Изображение, сглаженное гауссовой
маской 25x25 при sig = 15. в) Изображение после порогового преобразова-
преобразования, г) Остов, д) Остов после восьмикратного удаления отростков, е) Резуль-
Результат еще 7 повторов операции удаления отростков
причем соответствующая операция повторялась 8 раз, что примерно равно по-
половине величины sig фильтра сглаживания. Некоторые маленькие отростки все
еще остались на остове. Однако если применить эту операцию еще 7 раз (пол-
(полное значение sig), то в результате получится изображение на рис. 11.13, е), что
является вполне приемлемым остовом исходного изображения. Имеется эмпири-
эмпирическое правило, по которому величина sig фильтра гауссовой маски является
хорошим приближением числа итераций алгоритма для полного удаления лиш-
лишних отростков. ?
11.3. Дескрипторы границ
I 1.3. Дескрипторы границ
В этом параграфе рассматриваются некоторые подходы, применяемые для опи-
описания границы области. Ряд подходов в равной мере применим и к границам, и
к областям, поэтому при их группировании в пакете IPT в соответствующие М-
функции не делается разграничение между возможными приложениями. Неко-
Некоторые из этих дескрипторов появятся вновь в § 11.4 при обсуждении описания
областей.
11.3.1. Некоторые простые дескрипторы
Одним из простейших дескрипторов границы является ее длина. Длиной 4-связ-
ной границы называется число пикселов этой границы. Для 8-связной границы
при подсчете ее длины для вертикальных и горизонтальных переходов к общей
сумме добавляются единицы, а для диагональных переходов добавляется у/2.
Чтобы выделить границы объектов на изображении f, следует воспользовать-
воспользоваться функцией bwperim, которая описана в § 11.2.2:
g = bwperim(f, conn),
где g — это двоичное изображение, в котором отображены границы всех объек-
объектов из f. Для плоской связности, что является предметом нашего исследования,
параметр conn принимает значения 4 или 8, в зависимости от типа связности (по
умолчанию используется 8-связность) (см. сноску в примере 11.4, где объясняет-
объясняется смысл этого параметра). Объекты на f могут иметь любые значения пикселов,
допустимые классом изображения, но фоновые пикселы должны иметь нулевые
значения. По определению, пикселы периметра объекта не равны нулю и связаны
по крайней мере с одним другим ненулевым пикселом объекта.
Связность можно определить в IPT более общим способом с помощью матри-
матрицы 3x3 из нулей и единиц, которая подставляется в аргумент conn. Единичные
элементы задают окрестность относительно центрального элемента conn. Напри-
Например, conn = onesC) задает 8-связность. Матрица conn должна быть симмет-
симметричной относительно своего центрального элемента. Входное изображение мо-
может быть любого класса. Выходное изображение, содержащее границу каждого
объекта входного изображения, имеет класс logical.
Диаметр границы В определяется как евклидово расстояние между двумя
самыми отдаленными друг от друга точками границы. Эта пара точек не все-
всегда определяется однозначно, как, например, для круга или квадрата, однако в
общем случае предполагается, что его наилучшее применение в качестве дескрип-
дескриптора связано с описанием границ, у которых такая пара наиболее разнесенных
точек является единственной1. Отрезок, соединяющий две такие точки, называ-
называется большой осью границы. Малая ось границы определяется как отрезок, пер-
перпендикулярный большой оси и имеющий такую (минимальную) длину, что про-
проведенный через концы обеих осей прямоугольник со сторонами, параллельными
1Если имеется несколько таких пар, то они должны лежать близко друг от друга и служить
доминирующим фактором, позволяющим отличить форму границы.
Глава И. Представление и описание
этим осям, полностью накрывает границу. Упомянутый прямоугольник называ-
называется базовым прямоугольником, а отношение длины большой оси к длине малой
носит название эксцентриситета границы.
Функция diameter (см. ее листинг в приложении В) вычисляет диаметр, боль-
большую и малую оси, а также базовый прямоугольник границы или области. Она
имеет форму вызова
s = diameter(L),
где L — это размечающая матрица (см. § 9.4), as — структура со следующими
полями:
s.Diameter
s.MajorAxis
s.MinorAxis
s.BasicReсtangle
Скаляр, обозначающий максимальное расстояние меж-
между любыми двумя пикселами соответствующей области.
Матрица 2x2, в которой по строкам записаны коорди-
координаты концевых точек большой оси соответствующей об-
области.
Матрица 2x2, в которой по строкам записаны координа-
координаты концевых точек малой оси соответствующей области.
Матрица 2x2, в которой по строкам записаны коорди-
координаты четырех углов базового прямоугольника области.
11.3.2. Нумерация фигур
Номер фигуры границы строится на ос-
основе 4-направленного цепного кода Фри-
мана и определяется как первая раз-
разность с минимальным численным зна-
значением (см. [Bribiesca, Guzman 1980] и
[Bribiesca, 1981]). Порядком номера фи-
фигуры по определению называется число
цифр в его записи. Таким образом, но-
номер фигуры границы задается парамет-
параметром с .dif fmm в функции f chcode, кото-
которая обсуждалась в § 11.2.1, а порядок
номера фигуры вычисляется по форму-
формуле length(с.diffmm).
Как отмечалось в § 11.2.1, 4-направ-
ленный цепной код Фримана можно сде-
сделать инвариантным относительно выбо-
выбора начальной точки с помощью исполь-
использования целой минимальной величины.
А чтобы добиться инвариантности по
отношению к поворотам, надо, чтобы
они (повороты) были кратны 90° при ис-
использовании первых разностей. Значит,
номера фигур инвариантны относительно начальной точки и относительно по-
поворотов на углы, кратные 90°. Один из часто используемых способов стандар-
стандартизации произвольных поворотов состоит в совмещении одной из координатных
Цепной код:
Разность:
Номер фигуры:
00003003223222 12 11
30003 10330 1 3003 1 30
000310330 1 3003 1 303
Рис. 11.14. Шаги при вычислении номеров
фигур
11.3. Дескрипторы границ
осей с направлением главной оси, а затем строительстве цепного кода исходя из
повернутой фигуры. Эта процедура проиллюстрирована на рис. 11.14.
Инструменты, которые позволят реализовать в одной М-функции процеду-
процедуру определения номеров фигур, были разработаны нами ранее. Они состоят
из функции boundaries, которая находит границу, функции diameter, которая
определяет главную ось, функции bsubsamp, которая понижает разрешение ре-
решетки дискретизации и функции f encode, которая вычисляет номера фигур.
Следует помнить, что при извлечении 4-связной границы функцией boundaries
входное изображение должно быть размечено функцией bwlabel, в которой за-
задана 4-связность. Как указано на рис. 11.14, компенсация движения основана
на совмещении одной из координатных осей области или границы с помощью
функции x2majoraxis. Эта функция имеет следующую форму вызова (ее про-
программный код находится в приложении В):
[В, theta] = x2majoraxis(A, В).
Здесь А = s.MajorAxis взято из функции diameter, а В — входное (двоичное)
изображение или список точек границы (как обычно, мы предполагаем, что гра-
граница является связной замкнутой кривой). На выход В поступают данные в той
же форме, что и на вход (т. е. двоичное изображение или координатная последо-
последовательность). В силу возможных ошибок округления, повороты могут привести
к разрывам границы, поэтому может потребоваться дополнительная обработка
для заполнения возникших разрывов (например, с помощью функции bwmorph).
11.3.3. Фурье-дескрипторы
На рис. 11.15 приведена К-точечная дискретная
граница на плоскости ху. Начиная с произволь- jy
ной точки (я(ь2/о)> обойдем границу, скажем, про-
против часовой стрелки, и обозначим координаты
встречающихся точек границы (х(ь2/о)> (#i?2/i)?
(я2,2/2)> •••> {хк-1,Ук-\)- Эти координаты мож-
можно записать в форме x(k) = Xk и у (к) = ук-
При использовании этих обозначений саму гра-
границу можно представить в виде последователь-
последовательности координатных пар s(k) = [x(fc),y(fc)], где
к = 0,1, 2,..., К — 1. Далее, каждую пару коор-
координат можно представить комплексным числом
ас
s(k) = x{k)+jy(k).
Как мы знаем из § 4.1, дискретное преобразование
Фурье (DFT) конечной последовательности s(k)
задается уравнением
а[и) =
Е
А;=0
Действительная ось
Рис. 11.15. Дискретная грани-
граница и ее представление в виде ком-
комплексной последовательности. На-
Начальная точка (жо,уо) выбрана про-
произвольно
s(k)e
-j2nuk/K
при u = 0,l,2,...,/fT — 1. Комплексные коэффициенты а (и) называются фуръе-
дескрипторами границы. Обратное преобразование Фурье, примененное к этим
476 Глава 11. Представление и описание
коэффициентам, позволяет восстановить границу s(k):
и=0
при к — 0,1,2,..., if — 1. Предположим, однако, что вместо всех коэффициен-
коэффициентов Фурье используются только первые Р из них. Это равносильно тому, что в
последнем уравнении принимается а (и) = 0 при и > Р — 1. Результатом восста-
восстановления окажется следующее приблиэюение последовательности s(k):
u=0
при к = 0,1,2,..., AT — 1. Несмотря на то, что при вычислении каждой ком-
компоненты используется лишь Р членов, параметр к по-прежнему пробегает весь
диапазон от 0 до К — 1. Значит, в приближенной границе будет то же самое
число точек, хотя для восстановления их координат используется меньшее число
членов. Вспомним из рассмотрения преобразования Фурье в гл. 4, что высоко-
высокочастотные составляющие описывают мелкие детали, тогда как низкочастотные
компоненты определяют общую форму границы. Следовательно, чем меньше Р,
тем больше деталей границы теряется.
Следующая функция f rdescp вычисляет фурье-дескрипторы границы s. Ана-
Аналогично, имея множество фу рье-дескрипторов, исходная замкнутая простран-
пространственная кривая получается с помощью обратной функции if rdescp. В доку-
документации каждой из этих функций объясняется их синтаксис.
function z = frdescp(s)
°/0FRDESCP Computes Fourier descriptors.
°/o Z = FRDESCP(S) computes the Fourier descriptors of S, which is an
°/o np-by-2 sequence of image coordinates describing a boundary.
°/o
°/0 Due to symmetry considerations when working with inverse Fourier
% descriptors based on fewer than np terms, the number of
% points in S when computing the descriptors must be even. If the
°/0 number of points is odd, FRDESCP duplicates the end point and
% adds it at the end of the sequence. If a different treatment is
% desired, the sequence must be processed externally so that it has
°/0 an even number of points.
7.
% See function IFRDESCP for computing the inverse descriptors.
% Preliminaries
[np, nc] = size(s);
if nc ~= 2
error OS must be of size np-by-2.');
end
if np/2 ~= round(np/2);
s(end + 1, :) = s(end, :);
11.3. Дескрипторы границ
np = np + 1;
end
Уо Create an alternating sequence of Is and -Is for use in centering
°/o the transform,
x = 0:(np - 1);
m = ((-1) .~x)';
°/o Multiply the input sequence by alternating Is and -Is to
°/o center the transform.
s(:, 1) = m .* s(:, 1) ;
s(:, 2) = m .* s(:, 2);
°/o Convert coordinates to complex numbers,
s = s(: , 1) + i*s(:, 2);
°/o Compute the descriptors.
z = fft(s);
Функция if rdescp имеет следующий текст:
function s = ifrdescp(z, nd)
e/0IFRDESCP Computes inverse Fourier descriptors.
°/o I = IFRDESCP(Z, ND) computes the inverse Fourier descriptors of
e/o of Z, which is a sequence of Fourier descriptor obtained, for
% example, by using function FRDESCP. ND is the number of
°/o descriptors used to computing the inverse; ND must be an even
% integer no greater than length(Z). If ND is omitted, it defaults
°/o to length(Z) . The output, S, is an ND-by-2 matrix containing the
°/o coordinates of a closed boundary.
% Preliminaries.
np = length(z);
% Check inputs.
if nargin == 1 | nd > np
nd = np;
end
% Create an alternating sequence of Is and -Is for use in centering
У, the transform,
x = 0:(np - 1);
m = ((-1) .~x)>;
°/o Use only nd descriptors in the inverse. Since the
У, descriptors are centered, (np - nd)/2 terms from each end of
°/o the sequence are set to 0.
d = round((np - nd)/2); °/0 Round in case nd is odd.
z(l:d) = 0;
z(np - d + l:np) = 0;
°/o Compute the inverse and convert back to coordinates.
zz = ifft(z);
s(:, 1) = real(zz);
s(:, 2) = imag(zz);
% Multiply by alternating 1 and -Is to undo the earlier
Глава 11. Представление и описание
Уо centering.
s(: , 1) = m.*s(:, 1);
s(:, 2) = m.*s(:, 2);
Пример 11.8. Фурье-дескрипторы.
На рис. 11.16, а) приведено изображение f, похожее на рис. 11.13, ej, но постро-
построенное с помощью гауссовой маски 15x15 с параметром sig = 9 и с последующим
пороговым преобразованием с порогом 0.7. В этом случае мы хотели иметь не
очень гладкое изображение, чтобы было легче продемонстрировать эффекты,
возникающие при уменьшении числа дескрипторов и влияющие на форму гра-
границы. Изображение на рис. 11.16, б) построено с помощью команд
>> Ъ = boundaries(f);
>> Ъ = Ъ{1};
>> bim = bound2im(b, 344, 270);
Рис. 11.16. а) Двоичное изоб-
изображение, б) Граница, получен-
полученная функцией boundaries. Она
состоит из 1090 точек
где размеры изображения совпадают с размерами f. Рис. 11.16, б) дает изобра-
изображение bim. Построенная граница содержит 1090 точек. Теперь мы вычисляем
фурье-дескрипторы
>> z = frdescp(b) ;
а затем применяем обратное преобразование, но с использованием примерно 50%
от 1090 возможных дескрипторов:
>> z546 = ifrdescp(z, 546);
>> z546im = bound2im(z546, 344, 270);
Изображение z546im [рис. 11.17, а)} демонстрирует близкое соответствие с ис-
исходной границей на рис. 11.16, б). Некоторые слабоуловимые детали, например,
мельчайшая впадинка глубиной в 1 пиксел на нижней «ноге» хромосомы, были
утеряны, но с практической точки зрения эти два изображения идентичны. На
рис. 11.17 с б) по е) показаны результаты при использовании, соответственно,
11.3. Дескрипторы границ
110, 56, 28, 14 и 8 дескрипторов, что составляет примерно 10%, 5%, 2.5%, 1.25%
и 0.7% от 1090 имеющихся дескрипторов. Если использовать всего 110 дескрипто-
дескрипторов [рис. 11.17, б)], то наблюдается дальнейшее сглаживание границы, но общая
форма остается весьма близкой к исходной. Рис. 11.17, д) демонстрирует, что да-
даже при 14 дескрипторах, что меньше 1.25% от общего их числа, сохраняются
характерные черты границы. Искажения, проявляющиеся на рис. 11.17, е), уже
становятся неприемлемыми, поскольку основные черты границы (четыре высту-
выступающие «ноги») оказались почти утраченными. Дальнейшее уменьшение числа
дескрипторов до 4 и 2 приводит к эллипсу и, наконец, к окружности.
б)
Рис. 11.17. а)-е) Границы, восстановленные по 546, 110, 56, 28, 14 и 8 фурье-дескрипторам
из общего их числа в 1090 элементов
Некоторые границы на рис. 11.17 имеют однопиксельные щели, характерные
для фурье-дескрипторов, из-за ошибок округления, которые можно «заделать»
с помощью функции bwmorph, которая применяется с опцией 'bridge'. ?
Как уже отмечалось, дескрипторы должны быть инвариантными по отноше-
отношению к переносам, поворотам и сжатию/растяжению. В тех случаях, когда резуль-
результат зависит от порядка обработки точек границы, дополнительное требование со-
Глава 11. Представление и описание
стоит в том, что дескрипторы не должны зависеть от выбора начальной точки.
Фурье-дескрипторы сами по себе не удовлетворяют этим условиям инвариантно-
инвариантности, однако соответствующие измененные дескрипторы можно легко вычислить
по простым формулам (см. [Gonzalez, Woods, 2002]).
о) б) Рис. 11.18. а) Сегмент гра-
g(r) ницы. б) Представление в виде
одномерной функции
rtlllllllllllib
11.3.4. Статистические характеристики
Форму участков границы (или кривых сигнатуры) можно количественно описать
с помощью простых статистических характеристик, таких как среднее, дисперсия
и моменты более высокого порядка. Чтобы понять, как это делается, обратимся
к рис. 11.18, а), где показан участок границы, и к рис. 11.18, б), на котором этот
участок представлен в виде одномерной функции g(r) независимой переменной г.
Эта функция получается путем соединения двух крайних точек границы отрез-
отрезком и последующим поворотом его до горизонтального положения. Координаты
точек границы поворачиваются на тот же угол. Это преобразование выполняется
функцией x2majoraxis, которая обсуждалась в § 11.3.2.
Один возможный подход к описанию сегмента границы состоит в рассмотре-
рассмотрении самой функции g(r) как гистограммы, для чего она нормируется до единич-
единичной площади. Другими словами, g(ri) теперь трактуется как вероятность появ-
появления значения г*. В этом случае г рассматривается как случайная величина с
моментами
к-\ к-\
Цп = ^2 (r* ~ т)П9{п), где т= ^2 ri9(ri)-
г=0 г=0
В этой записи К — это число точек границы, a /in@ — непосредственно связано
с формой функции д(г). Например, второй момент ^(г) характеризует разброс
значений функции относительно среднего значения г, а третий момент /лз(г)
является характеристикой симметричности кривой относительно среднего зна-
значения. Статистические моменты вычисляются функцией s tat moments, которая
обсуждалась в § 5.2.4.
По существу, нам удалось свести задачу описания двумерной границы к опи-
описанию одномерных функций. Хотя моменты — широко распространенные харак-
характеристики, они не являются единственными дескрипторами, которые могут при-
применяться для этой цели. Например, другой метод основан на вычислении спек-
спектра посредством одномерного дискретного преобразования Фурье и использова-
использовании затем первых q составляющих спектра для описания функции д{г). Преиму-
Преимущество моментов перед другими методами заключается в простоте реализации,
11.4- Дескрипторы областей
а также в том, что они позволяют «физически» интерпретировать форму гра-
границы. Из рис. 11.18 становится ясно, что данный метод инвариантен к повороту
объекта, а нормировку по размерам можно получить путем масштабирования
диапазона значений д и г.
I 1.4. Дескрипторы областей
В этом параграфе мы рассмотрим некоторые функции из IPT, которые служат
для обработки областей, а также построим ряд других функций для вычисления
дескрипторов текстуры, инвариантов моментов и некоторых других характери-
характеристик областей. При этом будет часто использоваться функция bwmorph, которая
обсуждалась в § 9.3.4. Мы будем также часто обращаться к функции roipoly из
§ 5.2.4.
11.4.1. Функция regionprops
Функция regionprops является основным инструментом IPT при вычислении
дескрипторов областей. Она имеет синтаксис
D = regionprops(L, properties),
где L — это размечающая матрица, a D — массив структур, который имеет дли-
длину max(L(:)). Поля структур обозначают различные величины, вычисленные
для каждой области в соответствии со спецификацией properties. Параметр
properties может быть списком символьных строк, разделенных запятой, смешан-
смешанным массивом строк, а также одиночной строкой 'all' или 'basic'. В табл. 11.1
перечислены все допустимые аргументы с объяснением их смысла и свойств. Ес-
Если параметр properties равен ' all', то вычисляются все дескрипторы, перечис-
перечисленные в табл. 11.1. Если аргумент properties не задан или он равен 'basic',
то функция вычисляет лишь дескрипторы 'Area', 'Centroid' и 'BoundingBox'.
Имейте в виду (см. также обсуждение в § 2.1.1), что в IPT буквы х и у ис-
используются для обозначения, соответственно, горизонтальных и вертикальных
координат, причем начало координат помещается в верхнем левом угле. Коор-
Координаты х и у увеличиваются, соответственно, вправо и вниз от этой начальной
точки. В контексте нашего обсуждения пиксел on имеет значение 1, а пиксел off
равен 0.
Таблица 11.1. Дескрипторы областей, вычисляемые функцией regionprops
Допустимые Объяснения и комментарии
значения
properties
1
'Area' Число пикселов области, т.е. ее площадь.
'BoundingBox' Вектор 1x4, определяющий наименьший прямоугольник, содержащий
данную область. BoundingBox определяется через [ul_corner width],
где ul_corner имеет вид [х у] и обозначает координаты верхнего
левого угла прямоугольника, а параметр width имеет вид [x_width
y_width], где записаны размеры прямоугольника вдоль соответству-
соответствующих координатных осей. Отметим, что BoundingBox ориентирован
вдоль координатных осей, и в этом смысле он является особым слу-
случаем базового прямоугольника, который обсуждался в § 11.3.1.
Глава 11. Представление и описание
Таблица 11.1 (окончание).
Centroid'
•ConvexArea'
•ConvexHull'
'Convexlmage'
'Eccentricity'
'EquivDiameter'
'EulerNumber'
'Extent'
'Extrema'
'FilledArea'
'Filledlmage'
'Image'
'MajorAxisLength'
'MinorAxisLength'
'Orientation'
'PixelList'
'Solidity'
Вектор 1x2, определяющий центр масс области. Первый элемент
Centroid — это горизонтальная координата (по оси х) центра масс, а
второй — его вертикальная координата (по оси у).
Скаляр, равный числу пикселов (площади) 'Convexlmage'.
Матрица рх2, определяющая наименьший выпуклый многоугольник,
содержащий данную область. В каждой строке матрицы записана пара
координат (ж, у) очередной вершины многоугольника.
Двоичное изображение выпуклой оболочки с заполненными пикселами,
принадлежащими оболочке (т. е. они установлены в on). (Для пикселов,
через которые проходит граница оболочки, regionprops использует то
же соглашение, что и roipoly, для определения положения пиксела
внутри или вне оболочки). Изображение имеет размер объемлющего
прямоугольника.
Скаляр, равный эксцентриситету эллипса, который имеет те же вто-
вторые моменты, что и исходная область. Эксцентриситет равен частному
расстояния между фокусами и длины большой оси. Эта величина из
интервала [0,1], где 0 и 1 соответствуют вырожденным случаям. (Эл-
(Эллипс с нулевым эксцентриситетом является окружностью, а единичный
эксцентриситет соответствует отрезку прямой).
Скаляр, равный диаметру круга с той же площадью, что и данная об-
область. Вычисляется по формуле sqrtD*Area/pi).
Скаляр, равный эйлеровой характеристике области, которая по опреде-
определению есть число объектов в области минус число дыр в этих объектах.
Скаляр, пропорциональный части пикселов объемлющего прямоуголь-
прямоугольника, которые принадлежат также и области. Вычисляется делением
Area на площадь объемлющего прямоугольника.
Матрица 8x2, состоящая из координат экстремальных точек области,
которые записаны по строкам. Формат вектора [top-left,top-right,
right-top, right-bottom, bottom-right, bottom-left, left-bottom,
left-top].
Число пикселов (площадь) Filledlmage.
Двоичное изображение с размерами как у объемлющего прямоугольни-
прямоугольника. Пикселы on соответствуют области, в которой заполнены все дыры.
Двоичное изображение с размерами как у объемлющего прямоуголь-
прямоугольника. Пикселы on соответствуют области, а пикселы off — фону.
Длина (в пикселах) большой оси1 эллипсоида, который имеет те же вто-
вторые моменты, что и исходная область.
Длина (в пикселах) малой оси эллипсоида, который имеет те же вторые
моменты, что и исходная область.
Угол между осью х и большой осью эллипсоида, который имеет те же
вторые моменты, что и исходная область.
Матрицы, строками которой являются пары [х, у] координат действи-
действительных пикселов области.
Скаляр, пропорциональный числу пикселов выпуклой оболочки, кото-
которые лежат и в области. Вычисляется по формуле Area/ConvexArea.
1 Отметим, что в данном контексте использование большой и малой осей отличается от большой
и малой осей базового многоугольника, которые обсуждались в § 11.3.1. Подробнее о моментах
эллипса см. [Haralick, Shapiro, 1992].
11.4. Дескрипторы областей
Пример 11.9. Использование функции regionprops.
В качестве простейшей иллюстрации предположим, что нам необходимо найти
площадь и ограничивающий прямоугольник для каждой области на изображении
В. Тогда мы пишем команды
>> В = bwlabel(B); °/0 Convert В to a label matrix.
>> D = regionprops(В, 'area', 'boundingbox');
А для нахождения площадей и числа областей выполняем
>> w = [D.Area] ;
>> NR = length (w) ;
где элементами вектора w служат площади областей, a NR обозначает количество
этих областей. Аналогично по следующей команде строится одна общая матрица,
в которой по строкам записаны ограничивающие прямоугольники для каждой
области:
>> V = cat(l, D.BoundingBox);
Этот массив имеет размер NR. Оператор cat объяснялся в § 6.1.1. ?
11.4.2. Текстура
Важный подход к количественному описанию областей состоит в определении
их внутренней текстуры. В этом параграфе разбираются еще две функции для
нахождения текстуры, которые основаны на статистических и спектральных ха-
характеристиках .
Статистические подходы
Часто используемый текстурный анализ основан на статистических свойствах ги-
гистограмм яркости. Один класс таких мер строится по статистическим моментам.
Как объяснялось в § 5.2.4, формула для нахождения n-го момента относительно
статистического среднего имеет вид
L-1
г=0
где Zi — это случайная величина, обозначающая яркость, p(z) — гистограмма
распределения уровней яркости в данной области, L обозначает число различных
значений яркости, а т задается выражением
L-1
т = 2^ ziP(zi)
г=0
и является средней яркостью области. Эти моменты вычисляются функцией
statmoments, которая вводилась в § 5.2.4. В табл. 11.2 перечислены некоторые
основные дескрипторы, основанные на статистических моментах, а также постро-
построенные по «однородности» и по энтропии. Напомним, что второй момент /хг(^)
является дисперсией а2.
Глава 11. Представление и описание
Теперь все готово для написании М-функции, которая вычисляет величины,
перечисленные в табл. 11.2. Эта функция называется statxture и ее полный
текст приведен в приложении В. К ней можно обращаться по формуле
t = statxture(f, scale),
где f — это входное изображение (или подизображение), at — вектор-строка из 6
компонент, описанных в табл. 11.2 и расположенных в том же порядке. Параметр
scale также является 6-ти компонентным вектором-строкой, состоящим из мас-
масштабных множителей, которые умножаются на элементы t. По умолчанию все
они равны 1.
Таблица 11.2. Некоторые текстурные дескрипторы, основанные на гистограмме яркости
области
Момент
Выражение
Мера текстуры
Среднее
значение
Стандартное
отклонение
Гладкость
= 1-1/A + а2)
Третий
момент
Однородность
Энтропия
е = — $^_о p(zi) l°82P(zi)
Мера средней яркости.
Мера средней контрастности.
Мера относительной гладкости яркости области.
R равно 0 для областей с постоянной яркостью и
близко к 1 для областей с большими отклонени-
отклонениями уровней яркости. На практике эту величину
принято приводить к интервалу [0,1] делением на
(L - 1J.
Характеризует асимметричность гистограммы.
Равен 0 для симметричных гистограмм. Положи-
Положителен для гистограмм, скошенных вправо (по от-
отношению к среднему значению) и отрицателен
для скошенных влево. Для приведения этой меры
к диапазону, сравнимому с другими пятью вели-
величинами, следует разделить /хз на (L — IJ. Этот
же делитель используется при нормировке дис-
дисперсии.
Мера равномерности. Эта величина максимальна
для постоянной яркости (максимальная однород-
однородность) .
Мера случайности.
Пример 11.10. Статистические меры текстуры.
На рис. 11.19 белыми квадратами выделены области изображений, которые пред-
представляют собой примеры гладкой, шероховатой и периодической текстуры. Ги-
Гистограммы этих областей, вычисленные функцией imhist, показаны на рис. 11.20.
Содержимое табл. 11.3 получено применением функции statxture к каждому
подизображению на рис. 11.19. Эти результаты согласуются с текстурным на-
наполнением соответствующих подизображений. Например, энтропия шероховатой
области [рис. 11.19, б)] выше, чем у других областей, поскольку здесь значения
пикселов носят более случайный характер, чем у других областей. Это же отно-
относится к контрастности и к средней яркости. С другой стороны, эта область менее
всех гладка и однородна, что отражается на величине R и на значении одно-
однородности. Гистограммы шероховатой области обнаруживают также отсутствие
11.4- Дескрипторы областей
какой бы то ни было симметрии по отношению к среднему значению, что оче-
очевидно следует из рис. 11.20, б), а также из большого значения третьего момента,
приведенного в табл. 11.3. ?
Таблица 11.3. Текстурные меры для областей из рис. 11.19
Средняя Средняя Третий
Текстура яркость контрастность R момент Однородность Энтропия
гладкая
шероховатая
периодическая
87.02
119.93
98.48
11
73
33
.17
.89
.50
0.002
0.078
0.017
-0.011
2.074
0.557
0.028 5.367
0.005 7.842
0.014 6.517
Рис. 11.19. Выделенные подизображения отвечают, слева направо, гладкой, шерохова-
шероховатой и периодической текстуре. Здесь даны электронно-микроскопические фо-
фотографии сверхпроводника, человеческого холестерина и микропроцессора.
(Изображения предоставил д-р Майкл У. Дэвидсон, университет шт. Флорида)
Спектральные меры текстур
Спектральные меры текстуры основаны на спектре Фурье, который идеально
подходит для описания направленности присутствующих в изображении пери-
периодических или квазипериодических двумерных структур. Эти глобальные тек-
текстурные образцы легко различаются на спектре в виде импульсов с высокой
энергией, однако их весьма непросто обнаружить с помощью пространственных
методов обработки, которые являются локальными по своей природе.
Обнаружение и интерпретацию спектральных признаков можно упростить,
если перейти к полярным координатам, в которых спектральная функция вы-
выражается в виде 5(г, #), где г и в — переменные в этой системы координат. Для
каждого угла 0 функция S(r,9) может рассматриваться как одномерная функция
So{r). Аналогично, для каждого значения частоты г, SrF) является одномерной
функцией. Анализ функции Se(r) при фиксированном 0 дает картину поведения
Глава 11. Представление и описание
спектра (скажем, наличие пиков) по направлению радиуса из начала координат,
а исследуя Sr{0) при фиксированном г, получаем поведение спектральной функ-
функции по окружности с центром в начале координат.
Рис. 11.20. Гистограммы, отвечающие подизображениям на рис. 11.19
Глобальное описание получается при интегрировании (суммировании в дис-
дискретном случае) этих функций:
0=0
г=1
где Ro — это радиус круга с центром в начале координат.
Результатами вычислений по этим двум формулам являются пары значений
[?(r), 5@)] для каждой точки спектра с координатами (г, 0). Варьируя эти коор-
координаты, можно построить две одномерные функции S(r) и 5@), описывающие
текстуру всего изображения или интересующей его части в терминах энергии
спектра. Затем можно вычислять те или иные дескрипторы самих этих функ-
функций. Для этих целей обычно используются такие дескрипторы, как положение
максимума, среднее значение и дисперсия, а также разность между средним и
максимальным значениями для амплитудной функции и для осевой функции.
Функция specxture (см. ее листинг в приложении В) может использовать-
использоваться для вычисления двух построенных текстурных характеристик. Ее синтаксис
имеет вид
[srad, sang, S] = specxture(f),
где srad — это S(r), sang — 5@), a S обозначает изображение спектра (которое
строится в логарифмической шкале, как объяснялось в гл. 4).
Пример 11.11. Вычисление спектра текстуры.
На рис. 11.21, а) изображены случайно разбросанные предметы, а на рис. 11.21, б)
показаны те лее предметы, но периодически упорядоченные. Соответствующие
спектры Фурье, вычисленные функцией specxture, приведены на рис. 11.21, в)
и г). Периодические энергетические всплески по двум направлениям спектра
Фурье обусловлены периодичностью текстуры шероховатой поверхности, на ко-
которой расположены спички. Другие компоненты спектра на рис. 11.21, в) несо-
несомненно обусловлены случайной ориентацией прямолинейных сторон спичек на
11.4- Дескрипторы областей
рис. 11.21, а). В отличие от этого, основная энергия на рис. 11.21, г), не связан-
связанная с фоном, расположена вдоль горизонтальной оси, что соответствует строго
вертикальным сторонам объектов на рис. 11.21, б).
Рис. 11.21. а) и б) — изоб-
изображение неупорядоченных и
упорядоченных объектов, в) и
г) Отвечающие им спектры
Фурье
На рис. 11.22, а) и б), построены функции S(r) и S@) для случайно разбро-
разбросанных спичек, а на рис. 11.22, в) и г) — для периодически разложенных. Они
вычислены функцией specxture. Эти графики были получены с помощью ко-
команд plot(srad) и plot (sang). Оси на рис. 11.22, а) по в) были приведены к
единому масштабу командой
>> axis( [horzmin horzmax vertmin vertmax]),
которая обсуждалась в § 3.3.1, где максимальные и минимальные значения взяты
из графика на рис. 11.22, а).
График 5(г), отвечающий случайно распределенным спичкам, демонстрирует
отсутствие явных периодических компонент (т. е. здесь нет всплесков, кроме од-
одного пика в окрестности начала координат, что отвечает компоненте DC). С дру-
другой стороны, график 5(г), соответствующий упорядоченным спичкам, имеет явно
выраженный всплеск в окрестности точки г = 15 и еще один всплеск помень-
поменьше около г = 25. Аналогично, случайная природа энергетических всплесков на
рис. 11.21, в) с очевидностью проявляется на графике функции S@) [рис. 11.22, б)].
И по контрасту с этим график на рис. 11.22, г) отображает сильные энергетиче-
энергетические компоненты области около начала координат и в близи углов 90° и 180°.
Все эти данные хорошо согласуются с распределением на рис. 11.21, г). ?
Глава 11. Представление и описание
О 50 100 150 200 250 300
О 50 100 150 200 250 300
20 40 60 80 100 120 140 160 180
20 40 60 80 100 120 140 160 180
Рис. 11.22. Графики a) S(r) и б) S(9) для случайного изображения, в) и г) — графики
S(r) и SF) для упорядоченного изображения
11.4.3. Инварианты моментов
Двумерный момента порядка (p+q) цифрового изображения f(x, у) определяется
по формуле
при р, q = 0,1, 2,..., где суммирование производится по всем значениям простран-
пространственных координат х и у данного изображения. Соответствующий центральный
момент задается выражением
где
х у
х =
moo
-
у =
По определению, нормированным центральным моментом порядка (р + q) на-
называется величина
Vpg — 77Г
11.4- Дескрипторы областей
при p,q = 0,1,2,..., где
при p + q = 2,3,....
Имея все эти моменты, можно определить следующие семь инвариантов мо-
моментов, которые инвариантны относительно переносов, осевой симметрии, пово-
поворотов, а также растяжений и сжатий:
01 = то +?7О2,
</>2 = (^20 -77О2J +477?!,
03 = (?7зо — З7712) + (З7721 —
04 = G?30 + Г712J + (Г/21 +
05 = (Т/30 ~ 37/12) (Г/30 + Т/12) [(Т/30 + Т/12) - 3 (т/21 + Т/оз) ] +
+ C7/21 - Т/оз) (Т/21 + Т/оз) [3 (Т/30 + T/i2J - (т/21 + Т/озJ],
06 = (Т/20 - Т/02) [(Т/30 + Т/12J ~ (т/21 + Т/озJ] + 47/ц (т/ЗО + T/i2) (т/21 + Т/оз) ,
07 = (Т/21 ~ Т/оз) (Т/30 + Т/12) [(т/30 + T/i2J [3 (т/30 + T/l2J - (т/21 + Т/озJ]-
М-функция invmoments для вычисления инвариантов моментов представляет
собой прямую реализацию всех этих формул (ее текст имеется в приложении В).
Она вызывается командой
phi = invmoments(f),
где f — это входное изображение, a phi — вектор-строка из 7 компонент, куда
записываются вычисленные инварианты.
Пример 11.12. Инварианты моментов.
Изображение на рис. 11.23, а) было получено из исходного изображения с разме-
размером 400x400 пикселов при помощи команды
>> fp = padarray(f, [84 84], 'both');
Заполнение нулями совершено для совместимости с изображением, занимающим
большую область размером 568x568 пикселов, которое получается из исходного
поворотом на 45°, что будет совершаться далее. Заполнение нулями совершено
исключительно в демонстрационных целях и не используется при вычислении
инвариантов. Уменьшенное в два раза изображение было получено из расширен-
расширенного изображения с помощью команд
>> fhs = f(l:2:end, l:2:end);
>> fhsp = padarray(fhs, [184 184], 'both');
Зеркально симметричное изображение получено применением к f стандартной
функции f liplr2 из MATLAB:
2Функция В = f liplr (А) возвращает матрицу А, зеркально отраженную вокруг вертикальной
оси, а функция В = f lipud(A) выполняет зеркальное отражение вокруг горизонтальной оси.
Глава 11. Представление и описание
» im = fliplr(f);
>> fmp = padarray(fm, [84 84], 'both');
Для поворота изображения мы воспользовались функцией imrotate:
>> g = imrotate(f, angle, method, 'crop')
которая поворачивает f на угол angle против часовой стрелки. Параметр method
может иметь одно из следующих значений:
'nearest' — интерполяция по ближайшим соседям;
'bilinear' — билинейная интерполяция (типичный выбор);
'bicubic' — бикубическая интерполяция.
При повороте размеры изображения автоматически увеличиваются и происходит
заполнение нулями. Если в аргументах функции imrotate присутствует параметр
' crop', то центральная часть повернутого изображения обрезается по краям для
получения размеров исходного изображения. По умолчанию для этой функции
необходимо задавать лишь угол поворота angle. Тогда используется интерполя-
интерполяция 'nearest' и совершается обрезание до исходных размеров.
Рис. 11.23. а) Исходное расширенное изображение, б) Уменьшенное в два раза изобра-
изображение, в) Зеркально отраженное изображение, г) Изображение, повернутое
на 2°. д) Изображение, повернутое на 45°. Дополнение нулями выполнялось
с а) по г) для совместимости размеров с размером повернутого изображения
д) исключительно в демонстрационных целях
В нашем примере повороты изображения были выполнены следующими ко-
командами:
11.5. Использование главных компонент при описании изображений
» fr2 = imrotate(f, 2, 'bilinear');
>> fr2p = padarray(fr2, [76 76], 'both');
>> fr45 = imrotate(f, 45, 'bilinear');
Отметим, что при построении изображения ir45 дополнение нулями не потребо-
потребовалось, так как оно было достаточно большого размера. Нули в обоих изображе-
изображениях были вставлены в процессе поворота функцией IPT.
Все семь инвариантов моментов от пяти построенных изображений были вы-
вычислены командами
>> phiorig = abs(log(invmoments(f)));
>> phihalf = abs(log(invmoments(fhs)));
>> phimirror = abs(log(invmoments(fm)));
>> phirot2 = abs(log(invmoments(fr2)));
>> phirot45 = abs(log(invmoments(fr45)));
Отметим, что здесь найдены модули от прологарифмированных инвариантов
вместо самих инвариантов. Это сделано для сужения динамического диапазо-
диапазона величин, а модуль применен, чтобы не иметь дело с комплексными числами,
которые возникают при взятии log от отрицательных инвариантов моментов.
Взятие модуля является распространенной практикой, поскольку нас интересует
инвариантность моментов, а не их знаки.
Таблица 11.4. Семь инвариантов изображений на рис. 11.23. Обратите внимание на ис-
использование модуля логарифма в первом столбце
Инвариант
(|log|)
Ф\
ф2
Фз
Фа
Фъ
Фб
ф7
Исходное
изображение
6.600
16.410
23.972
23.888
49.200
32.102
47.953
Уменьшенное
в два раза
6.600
16.408
23.958
23.882
49.258
32.094
47.933
Зеркально
отраженное
6.600
16.410
23.972
23.888
49.200
32.102
47.850
Повернутое
на 2°
6.600
16.410
23.978
23.888
49.200
32.102
47.953
Повернутое
на 45°
6.600
16.410
23.973
23.888
49.198
32.102
47.954
Все семь инвариантов, вычисленных для исходного, уменьшенного, зеркально
отраженного и двух повернутых изображений, представлены в табл. 11.4. Обра-
Обратите внимание на исключительную близость соответствующих чисел. Все это го-
говорит о высокой степени инвариантности величин относительно перечисленных
выше преобразований исходного изображения. Эти замечательные результаты
объясняют, почему инварианты моментов являются основными инструментами
при описании изображений вот уже более сорока лет. ?
I 1.5. Использование главных компонент при описании
изображений
Предположим, что у нас имеется п отобранных «родственных» изображений,
расположенных в одну «стопку» (стек), как показано на рис. 11.24. Для каж-
каждой пары индексов (г, j) имеется п пикселов с этими координатами на каждом
492 Глава 11. Представление и описание
изображении. Из этих пикселов можно составить один вектор-столбец
XI
X =
Если изображения имеют размеры MxiV, то определено MN таких п-мерных
векторов, построенных по пикселам всех п изображений.
/—*~х =
«-мерный
вектор-столбец
х2
хп
• • • • •
• •» • •
•/• • • •
<• • • • •
•
• • • • •
• • * • •
• Л • • •
• • • • •
• •1» • •
*/»* • •
4 • • • •
•
Рис. 11.24. Выстраи-
Выстраивание соответствующих
пикселов в стеке изоб-
изображений, имеющих оди-
одинаковые размеры
Изображение п
Изображение 2
Изображение
1
к
Усредненный вектор тх для всего семейства изображений можно представить
в виде простого среднего:
_ 1_
при К = MN. Аналогично пхп ковариационная матрица Сх семейства изобра-
изображений задается формулой
к
J\ — 1
где знаменатель К — \ взят вместо К для получения несмещенной оценки для
Сх для заданного семейства изображений. Поскольку вещественная матрица Сх
является симметричной, всегда возможно построить ортонормированный базис,
состоящий из собственных векторов этой матрицы.
Преобразование главных компонент (которое также называют преобразова-
преобразованием Хотеллинга) определяется формулой
У = А(х-шх).
Нетрудно показать, что компоненты вектора у являются некоррелированными
величинами, и ковариационная матрица Су симметрична. Строками матрицы А
11.5. Использование главных компонент при описании изображений
служат нормированные собственные векторы матрицы Сх, которые, как гово-
говорилось выше, образуют ортонормированный базис в n-мерном евклидовом про-
пространстве. Кроме того, элементы, стоящие на главной диагонали матрицы Су,
являются собственными числами матрицы Сх. Элемент главной диагонали, сто-
стоящий в г-ой строке матрицы Су равен дисперсии элемента у г.
Раз строки матрицы А являются ортонормированными, то обратная к ней
матрица получается простым транспонированием матрицы А. Следовательно,
имеется возможность восстановить вектор х, совершив обратное преобразование:
х = Ату + тх.
Важность преобразования главных компонент становится очевидной, когда ис-
используется лишь q собственных векторов. В этом случае матрица А становится
матрицей Aq с размером qxn. Теперь восстановленный вектор является лишь
приближением исходного вектора
Среднеквадратическое отклонение (ошибка) приближенного восстановленного век-
вектора х от точного вектора х задается выражением
п q n
\3; - ^2 Хз=
Из первой строки этого выражения видно, что ошибка восстановления равна ну-
нулю при q = п (т. е. когда в обратном преобразовании используются все собствен-
собственные векторы). Из этого уравнения также следует, что ошибку можно миними-
минимизировать, выбрав для Aq собственные векторы, которые соответствуют q самым
большим собственным числам. Значит, преобразование главных компонентов яв-
является оптимальным в том смысле, что оно минимизирует среднеквадратическую
ошибку между вектором х и его приближением х. Название этого преобразова-
преобразования связано с выбором собственных векторов, имеющих наибольшие (главные)
собственные значения ковариационной матрицы. Пример, который будет рас-
рассматриваться далее в этом параграфе, еще лучше прояснит эту концепцию.
Семейство из п выбранных изображений (каждое размером MxN) можно
поместить в «стопку» (стек), как показано на рис. 11.24, с помощью команды
>> S = catC, fl, f2,. . ., fn);
Этот стековый массив изображений, имеющий размер MxNxn, преобразует-
преобразуется с помощью функции imstack2vectors (см. ее код приложении В) в массив,
строками которого служат n-мерные векторы. Функция imstack2vectors имеет
следующую форму вызова:
[X, R] = imstack2vectors(S, MASK),
где S — это стек изображений, а X — это массив векторов, извлеченный из S
по схеме, показанной на рис. 11.24. Входной аргумент MASK является логическим
Глава 11. Представление и описание
или числовым массивом размером MxN с ненулевыми элементами в тех пози-
позициях, из которых выбираются элементы S для формирования X, и с нулями в тех
позициях, которые игнорируются. Например, если мы хотим использовать толь-
только векторы из правого верхнего квадранта стека изображений, то матрица MASK
должна иметь единицы в этом квадранте и нули во всех остальных позициях.
Если переменная MASK не включена в список аргументов, то по умолчанию все
изображение целиком используется при формировании X. Наконец, по строкам
выходного массива R записаны двумерные координаты, соответствующие поло-
положениям векторов, которые использовались при построении X. Использование пе-
переменной MASK будет проиллюстрировано в примере 12.2, а до того момента будет
использоваться схема, принятая по умолчанию.
Следующая М-функция covmatrix вычисляет усредненный вектор, а также
ковариационную матрицу для векторов в X.
function [С, m] = covmatrix(X)
'/eCOVMATRIX Computes the covariance matrix of a vector population.
°/o [C, M] = COVMATRIX(X) computes the covariance matrix С and the
7o mean vector M of a vector population organized as the rows of
7o matrix X. С is of size N-by-N and M is of size N-by-1, where N is
°/P the dimension of the vectors (the number of columns of X).
[K, n] = size(X);
X = double(X);
if n == 1 7, Handle special case.
С = 0;
m = X;
else
°/o Compute an unbiased estimate of m.
m = sum(X, 1)/K;
°/0 Subtract the mean from each row of X.
X = X - m(ones(K, 1), :);
У, Compute an unbiased estimate of С Note that the product is
°/0 X'*X because the vectors are rows of X.
С = (X>*X)/(K - 1);
m = mJ ; 70 Convert to a column vector,
end
Следующая функция реализует концепцию, изложенную в этом параграфе.
Обратите внимание на использование структур для упрощения выходных аргу-
аргументов.1
function Р = princomp(X, q)
7oPRINCOMP Obtain principal-component vectors and related quantities.
У. P = PRINCOMP(X, Q) Computes the principal-component vectors of
У. the vector population contained in the rows of X, a matrix of
1 Функция [V, D] = eig(A) возвращает собственные векторы матрицы А в виде столбцов мат-
матрицы V, а соответствующие собственные значения записываются по главной диагонали диаго-
диагональной матрицы D.
11.5. Использование главных компонент при описании изображений
Уо size K-by-n where К is the number of vectors and n is their
°/0 dimensionality. Q, with values in the range [0, n] , is the number
7e of eigenvectors used in constructing the principal-components
7o transformation matrix. P is a structure with the following
У. fields:
°/o
K-by-Q matrix whose columns are the principal-
component vectors.
Q-by-n principal components transformation matrix
whose rows are the Q eigenvectors of Cx corresponding
to the Q largest eigenvalues.
K-by-n matrix whose rows are the vectors reconstructed
from the principal-component vectors. P.X and P.Y are
identical if Q = n.
з The mean square error incurred in using only the Q
eigenvectors corresponding to the largest
eigenvalues. P.ems is 0 if Q = n.
The n-by-n covariance matrix of the population in X.
The n-by-1 mean vector of the population in X.
The Q-by-Q covariance matrix of the population in
Y. The main diagonal contains the eigenvalues (in
descending order) corresponding to the Q eigenvectors.
size(X);
Le(X);
°/o Obtain the mean vector and covariance matrix of the vectors in X.
[P.Cx, P.mx] = covmatrix(X);
P.mx = P.mx'; °/e Convert mean vector to a row vector.
Уо Obtain the eigenvectors and corresponding eigenvalues of Cx. The
°/e eigenvectors are the columns of n-by-n matrix V. D is an n-by-n
У, diagonal matrix whose elements along the main diagonal are the
°/e eigenvalues corresponding to the eigenvectors in V, so that X*V =
У, D*V.
[V, D] = eig(P.Cx);
°/o Sort the eigenvalues in decreasing order. Rearrange the
°/o eigenvectors to match.
d = diag(D);
[d, idx] = sort(d);
d = flipud(d);
idx = flipud(idx);
D = diag(d);
V = V(:, idx);
°/0 Now form the q rows of A from first q columns of V.
P.A = V(:, l:q)';
°/o Compute the principal component vectors.
Mx = repmat(P.mx, K, 1); °/0 M-by-n matrix. Each row = P.mx.
P.Y = P.A*(X - MxK; °/, q-by-K matrix.
У.
У.
У.
У.
У.
У.
y.
У.
У.
У.
У.
У.
У.
У.
У.
У.
[K,
X =
P.Y
P.A
P.X
P. em
P.Cx
P.mx
P.Cy
n] =
doub
Глава 11. Представление и описание
% Obtain the reconstructed vectors.
P.X = (P.A'*P.Y)' + Mx;
% Convert P.Y to K-by-q array and P.mx to n-by-1 vector.
P.Y = P.Y';
P.mx = P.mx';
% The mean square error is given by the sum of all the
% eigenvalues minus the sum of the q largest eigenvalues.
d = diag(D);
P.ems = sum(d(q + l:end));
% Covariance matrix of the Y's:
P.Cy = P.A*P.Cx*P.A';
Пример 11.13. Главные компоненты.
На рис. 11.25 приведены шесть спутниковых фотографий одной и той же мест-
местности, имеющие размеры 512x512, которые сняты в шести спектральных све-
световых диапазонах: видимом синем (длина волны 450-520 нм), видимом зеленом
E20-600 нм), видимом красном F00-690 нм), близком инфракрасном G60-900 нм),
среднем инфракрасном A550-1750 нм) и тепловом инфракрасном A0400-12500 нм).
Целью этого примера является иллюстрация применения функции princomp для
работы с главными компонентами. Первый шаг состоит в формировании стека
из шести изображений размером 512x512x6, что обсуждалось ранее:
>> S = catC, fl, f2, f3, f4, f5, f6) ;
где f 1 — f 2 соответствуют шести снимкам в разных спектральных диапазонах.
Далее этот стек загружается в массив X:
>> [X, R] = imstack2vectors(S) ;
Теперь мы получаем 6 изображений главных компонент, применяя функцию
princomp при q = 6:
>> Р = princomp(X, 6);
Изображение первой компоненты строится и отображается на дисплее с помощью
команд
» gl = P.Y(:, 1);
>> gl = reshape (gl, 512, 512);
>> imshow(gl, [ ])
Все другие компоненты получаются и отображаются аналогичным образом. Соб-
Собственные значения расположены вдоль главной диагонали матрицы Р.Су, поэто-
поэтому мы применяем команду
>> d = diag(P.Cy);
где d — это 6-мерный вектор-столбец, поскольку в нашем примере параметр q = 6.
11.5. Использование главных компонент при описании изображений 497
а) б) в)
г) д) е)
Рис. 11.25. Шесть снимков в разных частотных диапазонах: а) видимый синий свет, б) ви-
видимый зеленый свет, в) видимый красный свет, г) близкое инфракрасное из-
излучение, д) среднее инфракрасное излучение, е) тепловое инфракрасное из-
излучение. (Изображение предоставлено Агентством NASA)
На рис. 11.26 показаны шесть вычисленных выше изображений главных ком-
компонент. Самое очевидное наблюдение заключается в том, что наибольшая до-
доля деталей контрастности сконцентрирована на первых двух изображениях, а
далее происходит резкое снижение контрастности. Причину этого легко объ-
объяснить, взглянув на собственные значения. Как показано в табл. 11.5, первые
два собственных значения являются достаточно большими по сравнению со все-
всеми остальными. Поскольку собственные значения равны дисперсиями элементов
векторов у, а дисперсия является мерой контрастности, то нет ничего неожи-
неожиданного в том, что изображения, отвечающие большей дисперсии, будут иметь
большую контрастность.
Таблица 11.5. Собственные значения Р.Су при q = 6
Ai
10352
А2
2959
Аз
1403
А4
203
А5
94
А6
31
Пусть теперь используется малое число компонент, скажем, q = 2. Тогда ре-
реконструкция базируется лишь на двух изображениях главных компонент. При-
Применяя команду
>> Р = princomp(X, 2) ;
498 Глава 11. Представление и описание
а) б)
г) д) е)
Рис. 11.26. Изображения главных компонент, соответствующие изображениям
на рис. 11.25
и выражения типа
» hi = Р.Х(:, 1);
>> hi = reshape (hi, 512, 512);
для каждого результирующего изображения, получаем реконструированные изоб-
изображения на рис. 11.27. При визуальном сравнении эти изображения весьма близ-
близки исходным изображениям на рис. 11.25. На самом деле, и соответствующие раз-
разности изображений обнаруживают малое расхождение. Например, чтобы срав-
сравнить исходное и реконструированное изображение полосы 1, следует написать
>> Dl = double(fl) double(hl);
>> Dl = gscale(Dl) ;
>> imshow(Dl)
На рис. 11.28, а) показан результат. Низкая контрастность этого изображе-
изображения указывает на небольшую потерю данных при использовании только двух
изображений главных компонент при реконструкции исходного изображения. На
рис. 11.28, б) показана разность для изображений полосы 6. Здесь разность явля-
является более резкой, поскольку исходное изображение полосы 6 было размытое, но
два изображения главных компонент, использованные при реконструкции, были
четкими, и они имели более сильное влияние на результат реконструкции. Сред-
11.5. Использование главных компонент при описании изображений 499
неквадратическая ошибка, возникающая при использовании только двух главных
компонент, равна
>> P. ems
ans =
1.7311е+003
что есть сумма четырех наименьших собственных значений из табл. 11.5. ?
Рис. 11.27. Изображения в разных спектральных диапазонах при использовании лишь
двух изображений главных компонент с наибольшими дисперсиями. Сравните
с оригиналами на рис. 11.25
а)
б)
Рис. 11.28. а) Разность меж-
между рис. 11.27, а) и 11.25, а), б)
Разность между рис. 11.27, е)
и 11.25, е). Оба изображения
перемасштабированы к интерва-
интервалу [0, 255] стандартных черно-
белых изображений
Глава 11. Представление и описание
Перед тем, как завершить материал данного параграфа, отметим, что функ-
функция princomp может использоваться для ориентации объектов (областей или их
границ) вдоль собственных векторов этих объектов. Для этого координаты объ-
объектов выстраиваются в столбцы массива X и применяется функция princomp с
аргументом q = 2. Преобразованные данные, выстроенные вдоль собственных
векторов, содержатся в поле Р. Y. В этом состоит грубая процедура выстраивания,
которая использует все координаты для вычисления матрицы преобразования и
располагает данные по направлению их основной концентрации.
Выводы
Представление и описание объектов или областей, полученных при сегментации
изображения, составляют первые шаги работы большинства автоматизирован-
автоматизированных процессов, в которых участвуют цифровые изображения. Такие описания,
например, являются входной информацией для алгоритмов распознавания объ-
объектов, обсуждаемых в следующей главе. Разрабатываемые в последующих пара-
параграфах М-функции представляют собой значительное расширение стандартных
функция пакета IPT для решения задач представления и описания изображений.
Не вызывает сомнения, что выбор того или иного типа дескрипторов в большой
степени диктуется исследуемой проблемой. Но тогда существенную помощь при
решении задач может оказать гибкая среда для моделирования и прототипиро-
вания, в которой уже имеющиеся функции могут быть интегрированы в новый
программный код, что расширяет рамки приложений при сокращении временных
затрат на их разработку. Материал данной главы является хорошим примером
построения основы для такой рабочей среды.
ГЛАВА 12
РАСПОЗНАВАНИЕ
ОБЪЕКТОВ
Введение
Мы завершаем нашу книгу разработкой и обсуждением ряда М-функций, реа-
реализующих некоторые методы распознавания областей и границ, которые в этой
главе будут называться объектами или образами. Подходы к компьютеризации
распознавания образов можно разделить на две основные категории: методы,
основанные на теории решений, и структурный анализ. Первая категория имеет
дело с образами, которые описываются количественными дескрипторами, такими
как длина, площадь, текстура и многими другими дескрипторами, рассмотренны-
рассмотренными в гл. 11. Вторая категория методов ориентирована на образы, которые можно
хорошо представить символьной информацией, например, символьными строка-
строками, и которые можно описать свойствами и взаимоотношениями между этими
символами, как объясняется в § 12.4. В теории распознавания образов ключевое
место занимает принцип «обучаемости» при исследовании выборки объектов. Да-
Далее рассматриваются и иллюстрируются методы обучения, применяемые как в
теории решений, так и в структурном анализе.
12.1. Некоторые основы
Под образом подразумевается упорядоченная совокупность дескрипторов, подоб-
подобных рассмотренным в гл. 11. В литературе по распознаванию образов дескрип-
дескрипторы принято также называть признаками. Классом образов называется сово-
совокупность образов, которые обладают некоторыми общими свойствами. Классы
образов будут обозначаться символами c^i.c^,..., o>w> гДе W — это число клас-
классов. Машинное распознавание образов предполагает отнесение образов к тем или
иным классам, что должно совершаться автоматически или с минимальным вме-
вмешательством человека.
В практических задачах распространены два типа упорядоченного представ-
представления признаков: в виде векторов (количественное описание) и в виде символь-
символьных строк (структурное описание). Образы, представление которых основано
на векторах признаков, обозначаются жирными строчными буквами, например,
х, у, z и они имеют вид векторов-столбцов размера nxl
X =
Глава 12. Распознавание объектов
где каждая компонента Х{ представляет дескриптор с номером г, а п — это общее
число дескрипторов, ассоциированных с образом. Иногда в вычислениях бывает
удобно представлять образы в виде векторов-строк размера lxn, которые можно
получить простым транспонированием векторов-столбцов: хт.
Природа компонент вектора образа х зависит от подхода, применяемого к
описанию самого физического объекта. Рассмотрим, к примеру, задачу автома-
автоматической классификации буквенно-цифровых символов. Дескрипторы, пригод-
пригодные для метода теории решений, могут включать такие величины, как двумер-
двумерные инварианты моментов или множество коэффициентов Фурье, описывающих
внешнюю границу символов.
В некоторых приложениях характеристики образов лучше всего описывать
с помощью структурных связей. Например, распознавание отпечатков пальцев
основано на взаимных связях отпечатка, которые называются мелкими дета-
деталями1. Вместе с их относительными размерами и расположением эти признаки
играют роль примитивов, которые описывают свойства линий отпечатка, такие
как обрывы, ветвления, слияния и несвязные сегменты. Задачи распознавания
такого типа, в которых принадлежность образов определенному классу опреде-
определяется не только данными количественных измерений признаков, но также и
пространственным соотношениями между признаками, обычно лучше решаются
с использованием структурных методов.
Материал последующих параграфов представляет собой реализацию на базе
MATLAB некоторых методов распознавания образов. Основной принцип распо-
распознавания, особенно в приложениях теории решений, состоит в сравнении обра-
образов с помощью измерения расстояния между векторами образов. Поэтому мы
начнем с обсуждения различных эффективных методов вычисления расстояний
средствами MATLAB.
12.2. Вычисление расстояний в MATLAB
Материал этого параграфа связан с векторизацией вычисления расстояний. Без
использования этой оптимизирующей возможности вычисления пришлось бы вы-
выполнять на основе операторов цикла for или while. Некоторые из представлен-
представленных ни лее выражений с векторизацией являются еще более изощренными, чем
операторные формулы из примеров, рассмотренных в предыдущих главах, по-
поэтому мы советуем читателю детально разобраться в этих выражениях. Приводи-
Приводимые далее формулировки основаны на аналогичных формулах, разработанных в
[Acklam, 2002].
Евклидовым расстоянием между двумя n-мерными векторами х и у (в виде
столбцов или строк) называется число
d(x, у) = ||х - у|| = ||у - х|| = [(*! - У1J + ¦ ¦ ¦ + (*„ - упJI/2 .
Это выражение представляет собой норму разности двух векторов, поэтому его
можно вычислять в MATLAB с помощью функции norm:
d = norm(x - у),
оригинале использован термин minutiae. — Прим. перев.
12.2. Вычисление расстояний в MAT LAB
где х и у — это векторы, соответствующие х и у из предыдущей формулы для
d(x, у). Часто бывает нужно вычислить множество евклидовых расстояний от
вектора у до каждого вектора некоторого семейства, состоящего из р векторов
размерности п, которые записаны в виде строк матрицы X размера рхп. Чтобы
размерности были правильно согласованы, вектор у должен иметь размер lxn.
Тогда расстояние от каждого элемента X до у будет записано в вектор pxl
d = sqrt(sum(abs(X - repmat(y, p, 1)).Л2, 2)),
где d(i) есть евклидово расстояние от у до г-ой строки матрицы X [т.е., до
X(i, :)]. Обращаем ваше внимание на употребление функции repmat, которая р
раз дублирует вектор-строку у и записывает результат в виде матрицы рхп для
приведения ее к размерам матрицы X. Значение 2 во втором аргументе функ-
функции sum означает, что следует вести вычисления вдоль второй размерности, т. е.
суммировать элементы по горизонтальной размерности.
Пусть имеется два семейства векторов X и Y размерами рхп и qxn соот-
соответственно. Матрицу, в которую записаны все расстояния между всеми парами
строк этих семейств, можно вычислить, применив оператор
D = sqrt(sum(abs(repmat(permute(X, [13 2]), [1 q 1]) . . .
-repmat(permute(Y, [3 1 2]), [p 1 1])).~2, 3)),
где D (i, j) — это евклидово расстояние между г-ым и j-ым векторами этих
семейств, т. е. между X(i , :) и Y(j, :).
Синтаксис функции permute в предыдущем выражении имеет вид
В = permute(A, order).
Эта функция перестраивает размерности массива А в соответствии с элементами
вектора order (элементы в этом векторе должны быть однозначными). Напри-
Например, если А является двумерным массивом, то выражение permute (А, [2 1] ) по-
попросту переставляет строки и столбца матрицы А, что эквивалентно присвоению
матрице В результата транспонирования матрицы А. Если длина вектора order
больше, чем число размерностей А, то MATLAB обрабатывает компоненты век-
вектора слева направо, пока не будут использованы все элементы. В предыдущем
выражении для D команда permute (X, [1 3 2]) порождает массивы в третьем
измерении, каждый из которых является столбцом (размерности 1) из X. Посколь-
Поскольку в X имеется всего п столбцов, то создается п таких массивов, причем каждый
из них имеет размерность pxl. Следовательно, команда permute(X, [13 2])
создает массив размерности pxlxn. Аналогично, команда permute (Y, [3 1 2])
строит массив размерности lxqxn. Наконец, команда
repmat(permute(X, [13 2]), [1 q 1])
повторяет q раз каждый из п столбцов массива, порожденного командой permute,
и в результате образуется массив размерности pxqxn. Аналогичным образом
можно прокомментировать другие команды, в которые вовлечена матрица Y.
Глава 12. Распознавание объектов
На самом деле, рассмотренная формула для D является векторизацией выра-
выражений, которые можно записать иначе с помощью «медленных» циклов for или
while.
В дополнение к рассмотренным выше выражениям в этой главе будет также
вычисляться взвешенное расстояние от вектора у до среднего вектора семей-
семейства тх, причем вес расстояния задается матрицей, обратной ковариационной
матрице Сх этого семейства. Такая метрика, называемая расстоянием Махалан-
Махаланобиса, определяется выражением
d(y, mx) = (У - тх)Тсх1(У - ™х)
Операция взятия обратной матрицы является самой вычислительно затратной
при реализации расстояния Махаланобиса. Эту действие можно существенно
ускорить с помощью операции правого матричного деления (/), которая вво-
вводилась в табл. 2.4 (см. также следующую сноску). Выражения для тх и Сх
приведены в § 11.5.
Пусть X обозначает семейство из р векторов размерности п, и пусть Y —
это семейство из q векторов, причем в обоих матрицах векторы располагают-
располагаются по строкам. Следующая М-функция вычисляет расстояние Махаланобиса от
каждого вектора Y до nix1.
function d = mahalanobis(varargin)
7OMAHALANOBIS Computes the Mahalanobis distance.
°/0 D = MAHALANOBIS (Y, X) computes the Mahalanobis distance between
°/0 each vector in Y to the mean (centroid) of the vectors in X, and
7o outputs the result in vector D, whose length is size(Y, 1). The
% vectors in X and Y are assumed to be organized as rows. The
°/0 input data can be real of complex. The outputs are real
7e quantities.
У.
У. D = MAHALANOBIS (Y, CX, MX) computes the Mahalanobis distance
°/o between each vector in Y and the given mean vector, MX. The
°/o results are output in vector D, whose length is size(Y, 1). The
°/0 vectors in Y are assumed to be organized as the rows of this
% array. The input data can be real or complex. The outputs are
% real quantities. In addition to the mean vector MX, the
% covariance matrix CX of a population of vectors X also must be
°/0 provided. Use function COVMATRIX (§ 11.5) to compute MX and
°/o CX.
°/o Reference: Acklam, P. J. [2002]. >MATLAB Array Manipulation Tips
% and Tricks.> Available at
°/0 home . online .no/~pjacklam/matlab/doc/mtt/index. html
°/o or at
°/o www. prenhall. com/gonzalezwoodseddins
1Если матрица А — квадратная, то матричная операция А/В является более точной (и более
быстрой) реализацией операции B*inv(A). Аналогично, операция А\В работает эффективнее
выражения inv(A)*B. См. табл. 2.4.
12.3. Распознавание с помощью теории решений
param = varargin; °/0 Keep in mind that param is a cell array.
Y = param{l};
ny = size(Y, 1); °/0 Number of vectors in Y.
if length(param) == 2
X = param{2};
°/o Compute the mean vector and covariance matrix of the vectors
7, in X.
[Cx, mx] = covmatrix(X);
elseif length (param) == 3 °/0 Cov. matrix and mean vector provided.
Cx = param{2};
mx = param{3};
else
error('Wrong number of inputs.')
end
mx = mx(:)'; °/0 Make sure that mx is a row vector.
°/o Subtract the mean vector from each vector in Y.
Yc = Y - mx(ones(ny, 1), :);
7e Compute the Mahalanobis distances,
d = real(sum(Yc/Cx.*conj(Yc), 2));
Вызов функции real в последней строке программы сделан для подавления
«численного шума», подобно соответствующей операции при фильтрации изобра-
изображений в гл. 4. Если известно, что данные всегда вещественны, то для упрощения
кода функции можно опустить вызовы подфункций real и conj.
12.3. Распознавание с помощью теории решений
Подход к распознаванию образов на основе методов теории решений строится с по-
помощью решающих (или дискримипантных) функций. Пусть х =(xi,X2,... ,хп)т
обозначает n-мерный вектор признаков объекта, который был определен в § 12.1.
Имея W классов образов u;i,u;2, •.. ,<^ил задачу распознавания в теории реше-
решений можно сформулировать следующим образом. Требуется найти W решающих
функций di(x),d2(x),..., dw(x), которые обладают следующим свойством: если
образ х принадлежит классу LJi, то
di(x) > dj(x), при всех j = 1,2,..., VF, j] Ф г.
Другими словами, неизвестный образ х относят к г-му классу, если при подста-
подстановке х во все дискриминантные функции наибольшее значение имеет величи-
величина di(x). Неоднозначные решения разрешаются произвольным образом.
Разделяющей поверхностью между классами uji и ujj называется множество
значений х, для которых di(x) = с^(х), или, что то же самое, множество векто-
векторов х, для которых
й(х)-^-(х)=0.
В теории решений принято описывать разделяющую поверхность между двумя
классами единой функцией dij(x) = di(x.) — dj(x) = 0. Тогда ^j(x) > 0 для
образов класса Ui и dij (х) < 0 для образов из класса Uj.
Глава 12. Распознавание объектов
Как станет ясно из материала следующих параграфов, отыскивание решаю-
решающих функций вызывает оценивание параметров образов, которые являются ре-
репрезентативными для данного класса. Образы, используемые при оценивании па-
параметров, называются обучающими образами или обучающими множествами.
Множества образов известного класса которые не используются для обучения, но
вместо этого используются для тестирования эффективности конкретного метода
распознавания, называются тестовыми или независимыми образами или мно-
множествами. В§§12.3.2и12.3.4 преследуется цель представить различные подходы
для нахождения решающих функций на основе оценивания параметров по обу-
обучающим образам. В § 12.3.3 рассматривается корреляционное сопоставление —
подход, который можно сформулировать в терминах решающих функций, но по
традиции он излагается в форме прямого сопоставления образов.
12.3.1. Формирование векторов признаков
Как отмечалось в начале этой главы, векторы признаков можно строить на ос-
основе количественных дескрипторов, разные типы которых приводились в гл. 11,
для областей и/или границ. Например, предположим, что мы описываем гра-
границу с помощью Фурье-дескрипторов. Величина г-го дескриптора становится
значением а^, т.е. г-ой компонентой вектора признаков. Кроме того, к Фурье-
дескрипторам можно добавить еще 6 дополнительных компонент, которые равны
мерам текстур из табл. 11.2.
Другой подход, который также весьма часто используется при работе с муль-
тиспектральными (регистрируемыми) изображениями, состоит в построении сте-
стека изображений, после чего строятся векторы по соответствующим пикселам
изображений, как показано на рис. 11.24. Изображения собираются в стек с по-
помощью функции cat:
S = catC, fl, f2, ..., fn),
где S — это стек, afl, f2, ..., fn — изображения, формирующие этот стек. После
чего векторы строятся с помощью функции imstack2vectors, которая обсужда-
обсуждалась в § 11.5. См. иллюстрирующий пример 12.2.
12.3.2. Сопоставление образов с помощью
классификаторов по минимуму расстояния
Пусть каждый класс определяется его усредняющим вектором т;, т.е. мы ис-
используем среднее значение по обучающему множеству данного класса в качестве
представителя (прототипа) данного класса векторов:
где Nj — это число обучающих образов класса ujj, причем суммирование ведется
по всем таким векторам. Как и раньше, W обозначает число классов образов.
Один способ отнесения неизвестного образа с вектором признаков х к некоторо-
некоторому классу состоит в выборе того класса, чей прототип ближе всего к вектору х.
12.3. Распознавание с помощью теории решений 507
При использовании евклидова расстояния в качестве меры близости (т. е. схоже-
схожести) образов задача заключается в вычислении расстояний:
После этого исследуемый образ относится к классу а^, имеющему наименьшее
расстояние Dj(x). Значит, в данной формулировке наилучшее совпадение опре-
определяется по минимальному расстоянию до прототипа.
Пусть все усредняющие векторы (прототипы) записаны в виде строк матри-
матрицы М. Тогда вычисление расстояния от произвольного вектора х до всех прото-
прототипов осуществляется с помощью формулы, обсуждавшейся в § 12.2:
d = sqrt(sum(abs(M - repmat(x, W, 1)).Л2, 2)).
Поскольку все расстояния неотрицательны, это выражение можно упростить, от-
отбросив операцию sqrt. Минимум из d определит класс принадлежности вектора
признаков х:
>> class = find(d == min(d));
Другими словами, если минимум d достигается в позиции к (т. е. х принадлежит
к-му классу образов), то скаляр class будет равен к. Если имеется более одно-
одного минимального элемента, то переменная class будет вектором, и каждый его
элемент укажет на разные позиции минимума.
Если вместо одного вектора у нас имеется множество векторов признаков,
представленных в виде строк матрицы X, то следует воспользоваться более длин-
длинной формулой из § 12.2 для получения матрицы D, элемент D(I, J) которой равен
евклидову расстоянию от г-го вектора из X, до j-ro прототипа из М. Итак, чтобы
определить класс, скажем, г-го образа из X, достаточно найти номер столбца в
строке i матрицы X, имеющего минимальное значение. Кратные минимумы по-
породят кратные значения, как и в случае одного вектора из предыдущего абзаца.
Нетрудно показать, что выбор кратчайшего расстояния эквивалентен вычис-
вычислению функций
dj (х) = хтт, - -mjmj j = 1,2,..., W,
и отнесение х к классу Ui происходит при наибольшем значении di(x). Такая
формулировка согласуется с понятием дискриминантной функции, которое опре-
определялось раньше.
Разделяющая поверхность между классами ил и ujj в случае классификатора
по минимуму расстояния задается уравнением
dij{x) = di(x) - dj(x) = хт(гпг - mj) - -(m» - т^)т(т» + rn,) = 0.
Заданная этим уравнением поверхность перпендикулярна отрезку, соединяюще-
соединяющему гпг и mj, и проходит через его середину. При п = 2 это есть прямая линия,
при п = 3 — это плоскость, а при п > 4 она называется гиперплоскостью.
Глава 12. Распознавание объектов
12.3.3. Корреляционное сопоставление
Корреляция является достаточно простой концепцией. Имея изображение /(х, у),
корреляционная задача заключается в нахождении позиций на изображении, ко-
которые лучше всего соответствуют заданному подизображению w(x,y) (которое
называется маской или эталоном). Один подход к решению этой задачи состоит
в работе с эталоном w(x, у), как с пространственным фильтром, что означает вы-
вычисление суммы соответствующих произведений (или их нормированных значе-
значений) для каждой позиции w в /, как это делалось в § 3.4.1. После этого, наилучшее
совпадение (или совпадения) w(x,y) в f{x,y) считается там, где обнаруживается
точка (или точки) максимума результирующего изображения корреляции. Да-
Даже при малых и локализованных эталонов w(x,y) такой подход в общем случае
является весьма вычислительно затратным. По этой причине практические ре-
реализации пространственной корреляции основываются на специализированных
аппаратных решениях.
Для целей прототипирования альтернативный подход заключается в реали-
реализации корреляции в частотной области, где можно воспользоваться теоремой о
корреляции, которая, подобно обсуждавшейся в гл. 4 теореме о свертке, сводит
пространственную корреляцию к произведению преобразованных изображений.
Пусть «о» обозначает корреляцию, а «*» — комплексное сопряжение, тогда тео-
теорема о корреляции утверждает, что
/(ж, у) о w(x, у) <^> F{u, v)H*(u, v).
Другими словами, пространственную корреляцию можно получить с помощью
обратного преобразования Фурье, примененного к результата умножения пре-
преобразования одной функции на сопряженное преобразование второй функции.
Имеется также двойственное утверждение:
/(х, y)w* (ж, у) <=> F(u, v) о Н(и, v).
Эта часть теоремы о корреляции приведена для полноты изложения. Она не
будет применяться в данной главе.
Реализация первого результата о корреляции в форме М-функции имеет сле-
следующий вид.
function g = dftcorr(f, w)
°/oDFTCORR 2-D correlation in the frequency domain.
°/o G = DFTC0RR(F, W) performs the correlation of a mask, W, with
°/0 image F. The output, G, is the correlation image, of class
% double. The output is of the same size as F. When, as is
% generally true in practice, the mask image is much smaller than
°/0 G, wraparound error is negligible if W is padded to size(F) .
[M, N] = size(f);
f = fft2(f);
w = conj(fft2(w, M, N));
g = real(ifft2(w.*f));
12.3. Распознавание с помощью теории решений
Пример 12.1. Использование корреляции для сопоставления изображений.
На рис. 12.1, а) показан снимок урагана Эндрю, на котором отчетливо различим
его глаз. В качестве примера использования корреляции мы попробуем найти
наилучшее положение на а) изображения глаза (маски) из рис. 12.1, б). Исход-
Исходное изображение имеет размер 912x912 пикселов, а размер маски равен 32x32
пиксела. Рис. 12.1, в) получен в результате следующих команд:
>> g = dftcorr(f, w);
>> gs = gscale(g);
>> imshow(gs)
Очевидное размытие изображения корреляции на рис. 12.1, в) не должно удив-
удивлять, так как изображение на рис. 12.1, б) имеет две доминирующие, почти по-
постоянные области, и поэтому оно работает как низкочастотный фильтр.
Рис. 12.1. а) Мультиспек-
тральное изображение ура-
урагана Эндрю, б) Маска, эта-
эталон, в) Корреляция изобра-
изображения и маски, г) Положе-
Положение наилучшего совпадения.
(Изображение предоставле-
предоставлено метеорологической служ-
службой NOAA)
а)
б)
в)
Нас интересует положение наилучшего совпадения, которое для корреляции
означает нахождение точки (или точек), где значение корреляции максимально:
» [I, J] = find(g
I =
554
J =
203
max(g(:)))
Глава 12. Распознавание объектов
В нашем случае такая точка единственна. Как объяснялось в § 3.4.1, коорди-
координаты на изображении корреляции1 соответствуют перемещению маски, поэтому
координаты [I, J] отвечают положению нижнего левого угла этой маски. Ес-
Если теперь расположить маску поверх изображения в этом месте, то обнаружит-
обнаружится близкое ее совпадение с глазом урагана. Другой подход к нахождению наи-
наилучшего положения состоит в пороговой обработке изображения корреляции в
окрестности точки максимума или его копии gs с уменьшенным разрешением при
известном максимальном значении 255. Например, изображение на рис. 12.1, г)
получено командой
>> imshow(gs > 254)
Совмещение нижнего левого угла эталона с маленькой белой точкой на рис. 12.1, г)
опять обнаруживает наилучшее совпадение для положения глаза урагана. ?
12.3.4. Статистически оптимальные классификаторы
Хорошо известный классификатор Байеса для нуль-единичной функции потерь
(см. [Gonzalea, Woods, 2002]) имеет решающие функции вида
где p(x|cjj) — функция плотности распределения вероятностей PDF для векто-
векторов признаков из класса cjj, a P(ujj) — вероятность обнаружения класса ujj. Как и
раньше, имея неизвестный вектор признаков, процесс заключается в вычислении
всех W решающих функций и в назначении образу класса, решающая функция
которого имеет самое большое численное значение. Неоднозначные решения раз-
разрешаются произвольным образом.
Случай, когда функции плотности вероятностей являются (или предполага-
предполагаются) гауссовыми, представляет особый интерес. Функция PDF для п-мерной
гауссовой случайной величины имеет вид
где Cj и nij — это ковариационная матрица и усредняющий вектор семейства
образов класса ljj, a |Cj| обозначает детерминант матрицы Cj.
Поскольку функция логарифма является монотонно возрастающей, то нахож-
нахождение максимума dj(x) no j эквивалентно максимизации ln[dj(x)], и мы можем
выписать решающую функцию в виде
где все логарифмы будут гарантированно вещественными, так как величины
р(х \ujj) и P{ujj) неотрицательны. Подставляя в эти формулы конкретную функ-
функцию для многомерной гауссовой величины, получаем
-j 1
,¦) - - Ь2тг - - In \Cj\ - - [(х - mJ)TC-1(x - га,)] .
Ld Zi Zd
1См. § 3.14, где объясняется схема корреляции.
12.3. Распознавание с помощью теории решений
Отбросив одинаковую для всех классов константу tj1 In 2тг, приходим к следующим
решающим функциям
<^(х) = \nP(uj) - | In |С,-1 - \ [(x - mJ)TC-1(x - m,-)]
при j = 1, 2,..., W. Теперь видно, что в квадратных скобках стоит расстояние
Махаланобиса, (см. § 12.2) для которого имеется векторизованная реализация.
У нас также реализован эффективный метод для вычисления средних векторов
и ковариационных матриц (см. § 11.5). Поэтому мы можем построить байесовский
классификатор для многомерного гауссиана в виде следующей М-функции.2
function d = bayesgauss(X, CA, MA, P)
°/oBAYESGAUSS Bayes classifier for Gaussian patterns.
У, D = BAYESGAUSSCX, CA, MA, P) computes the Bayes decision
°/o functions of the patterns in the rows of array X using the
7o covariance matrices and and mean vectors provided in the arrays
°/, CA and MA. CA is an array of size n-by-n-by-W, where n is the
°/o dimensionality of the patterns and W is the number of
У, classes. Array MA is of dimension n-by-W (i.e., the columns of MA
°/o are the individual mean vectors) . The location of the covariance
У, matrices and the mean vectors in their respective arrays must
°/e correspond. There must be a covariance matrix and a mean vector
°/o for each pattern class, even if some of the covariance matrices
°/e and/or mean vectors are equal. X is an array of size K-by-n,
°/e where К is the total number of patterns to be classified (i.e.,
°/o the pattern vectors are rows of X) . P is a 1-by-W array,
У, containing the probabilities of occurrence of each class. If
°/o P is not included in the argument list, the classes are assumed
°/o to be equally likely.
°/o
°/0 The output, D, is a column vector of length K. Its Ith element is
% the class number assigned to the Ith vector in X during Bayes
% classification.
d = [ ] ; °/, Initialize d.
error(nargchkC, 4, nargin)) °/0 Verify correct no. of inputs.
n = size(CA, 1); °/0 Dimension of patterns.
°/o Protect against the possibility that the class number is
°/o included as an (n+l)th element of the vectors.
X = double(X(:, l:n));
W = size(CA, 3); °/0 Number of pattern classes.
К = size(X, 1); °/0 Number of patterns to classify.
if nargin == 3
2Функция eye(n) возвращает единичную матрицу размера пхп; обращение еуе(т, п) или
еуе( [т п]) позволяет построить матрицу тхп, в которой на главной диагонали стоят единицы,
а вне — нули. Синтаксис eye (size (А)) обеспечивает аналогичные результаты, где в качестве m
и п используются, соответственно, числа строк и столбцов матрицы А.
512 Глава 12. Распознавание объектов
PA:W) = 1/W; % Classes assumed equally likely,
else
if sum(P) ~= 1
error ('Elements of P must sum to 1.0;
end
end
% Compute the determinants,
for J = 1:W
DM(J) = det(CA(:, :, J));
end
% Compute inverses, using right division (IM/CA), where IM =
% eye(size(CA, 1)) is the n-by-n identity matrix. Reuse CA to
% conserve memory.
IM = eye(size(CA,l));
for J = 1:W
CA(:, :, J) = IM/CAO, : , J) ;
end
% Evaluate the decision functions. The sum terms are the
°/e Mahalanobis distances discussed in Section 12.2.
MA = MA'; % Organize the mean vectors as rows,
for I = 1:K
for J = 1:W
m = MA(J, :);
Y = X m(ones(size(X, 1), 1), :);
if P(J) == 0
D(I, J) = Inf;
else
D(I, J) = log(P(J)) 0.5*log(DM(J)) ...
0.5*sum(Y(I, :)*(CA(:, :, J)*Y(I, :)'));
end
end
end
°/o Find the maximum in each row of D. These maxima
°/o give the class of each pattern:
for I = 1:K
J = find(D(I, :) == max(D(I, :)));
end
°/o When there are multiple maxima the decision is
°/0 arbitrary. Pick the first one.
d = d(:, 1);
12.3. Распознавание с помощью теории решений
Пример 12.2. Байесовская классификация мулътиспектралъных данных.
Байесовские классификаторы часто применяются при автоматическом распозна-
распознавании областей на мультиспектральных изображениях. На рис. 12.2 даны пер-
первые четыре изображения из рис. 11.25 (три видимых спектральных диапазона и
один инфракрасный). В качестве простой иллюстрации мы применим байесов-
байесовскую классификацию к трем типам (классам) участков земной поверхности на
этих изображениях: водному, городскому и растительному. Векторы признаков
в этом примере строятся по методу, который обсуждался в §§ 11.5 и 12.3.1, где
соответствующие пикселы выстраивались в стек. Мы работаем с четырьмя изоб-
изображениями, поэтому векторы признаков имеют размерность 4.
Чтобы вычислить средние векторы и ковариационные матрицы, нам нужны
образцы, представляющие каждый класс образов. Простейший способ получить
такие подизображения состоит в использовании интерактивной функции roipoly
(см. § 5.2.4), которая вызывается командой
>> В = roipoly(f) ;
где f — это одно из мультиспектральных изображений, а В — двоичная маска.
В таком формате изображение В можно построить интерактивно на экране ком-
компьютера, перемещая курсор мыши. На рис. 12.2, д) приведены три маски Bl, B2
и ВЗ, построенные этим способом. Числа 1, 2 и 3 обозначают, соответственно,
водные, городские и растительные участки на снимках.
Теперь строятся векторы, отвечающие каждой подобласти. Четыре цифровых
изображения уже имеются, поэтому их осталось лишь «уложить» вдоль третьего
измерения и получить стековое изображение:
>> stack = catC, fl, f2, f3, f4) ;
где изображения с f 1 no f4 - это четыре снимка из рис. 12.2 с а) по г). Каждой
точке при взгляде сквозь эти изображения соответствует четырехмерный вектор
признаков (см. рис. 11.24). Нас будут интересовать векторы, отвечающие трем
выделенных областям, которые даны на рис. 12.2, д). Мы получим эти векторы,
применив функцию imstack2vectors, которая обсуждалась в § 11.5:
>> [X, R] = imstack2vectors(stack, В);
где X - это массив, строки которого есть векторы, a R — массив, состоящий из
положений (двумерных координат) векторов из массива X.
Использовав функцию imstack2vectors с тремя масками Bl, B2 и ВЗ, полу-
получаем три множества векторов XI, Х2 и ХЗ и три семейства координат Rl, R2 и R3.
Затем из множеств X извлекаются три подмножества Yl, Y2 и Y3, которые будут
служить обучающими образами для оценивания ковариационных матриц и сред-
средних векторов. В качестве векторов для Y выбираются каждые вторые векторы
из множеств X. Ковариационная матрица и средний вектор для Y1 вычисляются
командой
>> [Cl, ml] = covmatrix(Yl) ;
и аналогично для остальных классов. Теперь мы строим массивы С А и МА для их
использования в функции bayesgauss:
Глава 12. Распознавание объектов
СА = catC, Cl, C2, СЗ) ;
MA = catB, ml, m2, m3);
а) б) в)
г) д) е)
Рис. 12.2. Байесовская классификация мультиспектральных изображений. а)-в) Изобра-
Изображения, снятые в синем, зеленом и красном диапазонах, г) Инфракрасное изоб-
изображение, д) Маски участков: A) водного, B) городского и C) растительного.
е) Результат классификации. Черными точками отмечены местоположения с
ошибочной классификацией. Все остальные (белые) точки классифицированы
правильно. (Исходные изображения предоставлены Агентством NASA)
Эффективность классификатора на обучающих множествах проверяется командой
>> dYl = bayesgauss(Yl, СА, MA);
и аналогично для остальных классов. Чтобы обнаружить ошибочно классифи-
классифицированные участки, достаточно выполнить команду
>> IY1 = find(dYl ~= 1);
и аналогично для остальных классов. Чтобы установить число неправильно рас-
распознанных точек изображений, следует выполнить команду length (find (dYl ==
== 2)), которая выдаст число местоположений класса 1, ошибочно отнесенных
к классу 2. Все остальные обучающие множества проверяются аналогичным об-
образом.
В табл. 12.1 подытожены результаты распознавания, полученные для обучаю-
обучающих множеств и для независимых множеств. Процент правильно распознанных
местоположений примерно одинаков для обоих этих множеств, что указывает
12.3. Распознавание с помощью теории решений
на стабильность оценок параметров. Наибольшее число ошибок в обоих случаях
произошло при оценивании городских участков. Это неудивительно, так как там
тоже встречается растительность (заметим, что городские и растительные ме-
места ни разу не классифицировались как водные). На рис. 12.2, е) черным цветом
отмечены точки, где произошла ошибочная классификация, а белый цвет соот-
соответствует правильной классификации. На области с номером 1 практически не
видно черных точек, поскольку все 7 ошибочно распознанных местоположений
находятся около границы или лежат на ней.
Таблица 12.1. Байесовская классификация мультиспектральных данных
ласе
1
2
3
Число
точек
484
933
483
Обуч. мн-ва
Назначенный класс
1
482
0
0
2
2
885
19
3
0
48
464
%
верных
99.6
94.9
96.1
ласе
1
2
3
Число
точек
483
932
482
Независ, мн-ва
Назначенный класс
1 2
478 3
0 880
0 16
3
2
52
466
%
верных
98.9
94.4
98.7
Для построения завершенной системы распознавания для классификации муль-
мультиспектральных изображений может потребоваться некоторая дополнительная
работа. Однако уже из этого примера видно, что прототип такой системы по-
построен на базе функций MATLAB и пакета IPT, которые дополнены некоторыми
новыми функциями, разработанными к этому моменту в данной книге. ?
12.3.5. Адаптивные обучающиеся системы
Подход, изложенный в §§ 12.3.1 и 12.3.3, основан на оценке статистических пара-
параметров некоторой выборки каждого класса образцов. Классификатор по мини-
минимальному расстоянию полностью определяется средним вектором каждого клас-
класса. Аналогично, байесовский классификатор для гауссовых величин однозначно
задается средним вектором и ковариационной матрицей множества образов каж-
каждого класса.
В обоих случаях обучающие множества строятся достаточно просто. Обуча-
Обучающие образы каждого класса используются для вычисления параметров реша-
решающих функций, определяющих этот класс. После оценивания нужных парамет-
параметров структура классификатора фиксируется, и далее его эффективность будет
зависеть от того, насколько хорошо реальные образы удовлетворяют базовым
статистическим предположениям, сделанным при выводе данного метода клас-
классификации.
Пока характеристики образов из рассматриваемых классов удовлетворяют,
хотя бы приблизительно, закону гауссова распределения, предложенные мето-
методы будут работать вполне удовлетворительно. Однако если эти допущения на-
нарушаются, разработка подходящего статистического классификатора становится
более сложной задачей, поскольку оценивание многомерных функций распреде-
распределения вероятностей является нетривиальным делом. На практике такие задачи
теории решений лучше преодолеваются с помощью методов, которые позволяют
строить решающие функции непосредственным обучением по доступным образ-
Глава 12. Распознавание объектов
цам. Тогда предварительные допущения относительно функций распределения
вероятностей для имеющихся классов образов становятся необязательными.
Основной подход, используемый в настоящее время для классификации тако-
такого типа, базируется на нейронных сетях (см. [Gonzalea, Woods, 2002]). Реализация
нейронных сетей, годящихся для конкретных приложений обработки изображе-
изображений, лежит не очень далеко от рамок возможностей MATLAB и IPT. Однако
такие действия были бы не вполне законными, поскольку уже имеется хороший
пакет по нейронным сетям, разработанный компанией The MathWorks несколько
лет назад.
12.4. Структурное распознавание
Техника структурного распознавания базируется на общем представлении инте-
интересующих объектов в виде символьных строк, деревьев или графов определении
набора дескрипторов и правил распознавания на основе выбранного представ-
представления объектов. Ключевое различие между подходами теории решений и струк-
структурными методами заключается в том, что в теории решений количественные де-
дескрипторы представляются в виде числовых векторов. В отличие от этого, струк-
структурный метод принципиально работает лишь с информацией, представленной в
символьном виде. Например, пусть границы объектов в некотором приложении
представлены ломаными линиями минимальной длины. Подход теории решений
мог быть основан на построении векторов, элементами которых являются вели-
величины внутренних углов многоугольников, а структурный анализ может исходить
из задания символов для ряда величин углов, после чего строятся строки таких
символов для описания образа в целом.
Символьные строки являются самыми распространенным элементами пред-
представления объектов, которые используются в структурном распознавании, поэто-
поэтому мы сфокусируем наше внимание в этом параграфе именно на этом представ-
представлении данных. Как скоро станет ясно, MATLAB имеет весьма солидный набор
специализированных функций для обращения со строками символов.
12.4.1. Работа со строками в MATLAB
В системе MATLAB символьные строки — это одномерными массивы, элемен-
элементами которых являются коды символов. Отображение символов на экране зави-
зависит от таблицы символов, которая используется для кодирования данного шриф-
шрифта. Длиной строки называется число ее символов, включая пробелы. Ее можно
узнать, воспользовавшись стандартной функцией length. Строка определяется
путем заключения ее символов в одинарные кавычки (текстовые кавычки внутри
строки обозначаются двойными кавычками).
В табл. 12.2 перечислены все основные функции MATLAB для работы со
строками.1 Первая функция blanks из этой категории имеет синтаксис
s = blanks(п).
1 Некоторые важные функции для обработки строк уже вводились в предыдущих главах.
12.4- Структурное распознавание
Она строит строку, состоящую из п пробелов. Функция cellstr создает смешан-
смешанный массив строк по массиву символов. Одно важное преимущество хранения
строк в виде смешанных массивов состоит в устранении необходимости допол-
дополнять строки пробелами, чтобы в символьном массиве все строки имели одинако-
одинаковую длину (т.е. подравнивать строки). Обращение
с = cellstr(S)
помещает строки символьного массива S в отдельные ячейки с. Функция char
конвертирует смешанный массив обратно в матрицу символов. Например, рас-
рассмотрим следующую матрицу строк:
S =
S = [' abc>; 'defg'; 'hi '] °/0 Note the blanks.
abc
defg
hi
Таблица 12.2.
Категория
1
Общие
функции
Проверки
строк
Операции
со строками
Функции MATLAB для
Имя функции
2
blanks
cellstr
char
deblank
eval
iscellstr
ischar
isletter
isspace
lower
regexp
regexpi
regexprep
strcat
strcmp
strcmpi
strfind
strjust
strmatch
strncmp
strncmpi
strread
обработки строк
Объяснение
3
Строка пробелов.
Строит смешанный массив строк из символьно-
символьного массива. Использовать функцию char для об-
обратного преобразования в символьный массив.
Строит символьный массив (строку).
Удаляет концевые пробелы.
Выполняет строковую команду MATLAB.
Истина для смешанного массива строк.
Истина для символьного массива.
Истина для буквы.
Истина для символов пробела.
Преобразует буквы в строчные.
Отыскивает регулярные выражения.
Отыскивает регулярные выражения, игнорируя
заглавные.
Заменяет строку на регулярное выражение.
Соединяет строки.
Сравнивает строки (см. § 2.10.5).
Сравнивает строки, игнорируя заглавные.
Ищет строку внутри другой.
Выравнивает строку.
Находит совпадения строк.
Сравнивает первые п символов строк.
Сравнивает первые п символов строк, игнори-
игнорируя заглавные.
Читает форматированные данные в строке. См.
подробности в § 2.10.5.
Глава 12. Распознавание объектов
Таблица 12.2 (окончание).
1
Преобразования
из строк в числа
Преобразования
систем счисления
2
strrep
strtok
strvcat
upper
double
int2str
mat2str
num2str
sprintf
str2double
str2num
sscanf
base2dec
bin2dec
dec2base
dec2bin
dec2hex
hex2dec
hex2num
3
Заменяет строку внутри другой.
Ищет метку в строке.
Соединяет строки по вертикали.
Преобразует буквы в заглавные.
Преобразует из строки в число.
Преобразует целое число в строку.
Преобразует матрицу в строку, годную для об-
обработки функцией eval.
Преобразует число в строку.
Записывает форматированные данные в строку.
Преобразует строку в число с двойной точно-
точностью.
Преобразует строку в число (см. § 2.10.5).
Читает строку с контролем формата.
Преобразует строку в системе В в десятичное
целое.
Преобразует двоичную строку в десятичное
целое.
Преобразует десятичное целое в строку
в системе В.
Преобразует десятичное целое в двоичную
строку.
Преобразует десятичное целое в шестнадцате-
ричную строку.
Преобразует шестнадцатеричную строку в деся-
десятичное целое.
Преобразует IEEE-шестнадцатеричное вещест-
вещественное в число с двойной точностью.
Набрав в командной строке whos S, получим следующую информацию:
>> whos S
Name
S
Size Bytes Class
3x4 24 char array
Заметьте, что в двух из трех строк массива S имеются по краям пробелы, посколь-
поскольку все строки символьной матрицы должны иметь одинаковое число символов.
Обратим также внимание на то, что в выходных данных отсутствуют ограничи-
ограничивающие кавычки, так как мы имеем дело с символьным массивом. Следующая
команда возвращает смешанный массив размера 3x1:
с = cellstr(S)
' abc'
'defg'
'hi'
whos с
Name
с
Size
3x1
Bytes
294
Class
cell array
12-4- Структурное распознавание
где, например, сA) = ' abc5. Обратите внимание на появление одинарных ка-
кавычек вокруг содержимого строк, а концевой пробел исчез. Для обратного пре-
преобразования смешанного массива в символьную матрицу выполним команду
>> Z = char(c)
Z =
abc
defg
hi
Функция eval выполняет команду MATLAB, записанную в виде стоки сим-
символов. Обращение eval (expression) выполняет команду-строку expression, ко-
которая может содержать любой допустимой текст MATLAB. Например, если t —
это строка символов t = ' 3~2', то набор на клавиатуре команды eval (t) выдаст
в ответ 9.
Следующая группа функций имеет дело с различными проверками строк. Ес-
Если результат есть истина, то возвращается значение 1; в противном случае — зна-
значение 0. Таким образом, в предыдущем примере команда iscellstr(c) выдаст
1, a iscellstr(S) — 0. Аналогичные комментарии относятся ко всем остальным
функциям этой группы.
Рассмотрим теперь операции со строками. Функции lower (строчные бук-
буквы) и upper (заглавные буквы) говорят сами за себя. Они также обсуждались
в § 2.10.5. Следующие три функции относятся к регулярным выражениям2, ко-
которые представляют собой множество символов и синтаксических знаков, часто
используемых при сравнивании фрагментов текста. Простой пример регулярного
выражения — это символ «*», используемый при поиске файлов: поиск по вы-
выражению image*.m через командное окно выдаст все М-файлы, имена которых
начинаются со слова «image». Другой случай применения регулярных выражений
встречается при поиске и замене фрагментов, когда в тексте ищется заданный
фрагмент и заменяется на другой. Регулярные выражения строятся с помощью
метасимволов, некоторые из которых перечислены в табл. 12.3. В этом контексте
«слово» — это подстрока, перед которой стоит пробел или начало новой строки,
а в конце стоит пробел или конец всей строки. В следующем абзаце приводятся
некоторые примеры регулярных выражений.
Функция regexp отыскивает регулярные выражения. Применение основного
синтаксиса
textidx = regexp(str, expr)
возвращает вектор-строку idx, которая содержит индексы (местоположения) под-
подстрок в строке str, которые подходят под регулярное выражение ехрг. Напри-
Например, пусть ехрг = >Ь.*а'. Тогда команда idx = regexp(str, expr) выполняет
поиск в строке str всех символов Ь, за которыми следуют любые символы (это
обозначает метасимвол «.») любое число раз, включая нулевое (что обозначено
символом «*»), после чего расположен символ «а». Индексы всех позиций в стро-
строке str, которые удовлетворяют этому условию, сохраняются в векторе idx. Если
2 Понятие регулярного выражения возникло в работах американского математика Стефана
К лини в виде обозначений, которые он называл «алгеброй регулярных множеств».
Глава 12. Распознавание объектов
в str не найдено ни одной позиции с этим условием, то функция возвращает
пустой вектор.
Таблица 12.3. Некоторые метасимволы, используемые в регулярных выражениях при на-
нахождении соответствий. См. справку для regular expressions
Метасимволы Использование
Подходит любой одиночный символ.
[аЪ. . .] Подходит любой одиночный символ из (ab...) внутри скобок.
[ЛаЪ. . .] Подходит любой одиночный символ, за исключением тех, что расположе-
расположены в скобках.
? Подходит любой символ один или нуль раз.
* Подходит предыдущий символ нуль или больше раз.
+ Подходит предыдущий символ, один или больше раз.
{пшп} Подходит предыдущий символ num раз.
{min, max} Подходит предыдущий символ не менее, чем min, и не более, чем max раз.
| Подходит выражение, стоящее до или после метасимвола |.
Лchars Подходит, когда строка начинается на chars.
chars$ Подходит, когда строка кончается на chars.
\<chars Подходит, когда слово начинается на chars.
chars\> Подходит, когда слово кончается на chars.
\<word\> Подходит точное совпадение со словом word.
Еще несколько примеров регулярных выражений для переменной ехрг позво-
позволят лучше понять эту концепцию. Регулярное выражение 'Ь. + а' имеет прак-
практически тот же смысл, что и 'Ъ. *а', с одним отличием: вместо «любое число раз,
включая нулевое» следует читать «один раз или более». Выражение 'Ъ [0-9] '
означает, что после Ъ должно идти любая цифра от 0 до 9; выражение 'Ь [0-9]*'
означает, что за b следует любое число цифр от 0 до 9; а }Ъ [0-9] + ' означает
одна или более цифр от 0 до 9. Например, если str = >b0123c234bcd>, то по-
последние три выражения для ехрг породят следующие результаты: idx = 1; idx
= [1 10];и idx = 1.
Для примера использования регулярных выражений при распознавании сим-
вольно-звездочных объектов предположим, что граница объекта была закодиро-
закодирована 4-направленным цепным кодом Фримана [см. рис. 11.1, а)], который сохра-
сохранен в строке str, так что
>> str
str =
000300333222221111
Пусть наша цель состоит в нахождении всех местоположений в этой строке, где
направление движения меняется с восточного @) на южное C), а затем сохраня-
сохраняет это направление не менее чем два шага, но не более, чем шесть шагов. В этом
заключается свойство объекта «спуск вниз», которое должно иметь больше од-
одного шага (один шаг мог быть вызван шумом). Это условие можно выразить с
помощью следующего регулярного выражения:
>> ехрг = >0[3]{2, 6}';
12.4- Структурное распознавание
Тогда
>> idx = regexp(str, expr)
idx =
б
В данном случае величина idx обозначает местоположение, где после 0 стоят
три цифры 3. Более сложные свойства и условия можно выразить аналогичным
образом.
Функция regexpi ведет себя подобным же образом, что и regexp, за тем лишь
исключением, что не делается различие между заглавными (upper) и строчными
(lower) буквами. Функция regexprep, имеющая форму вызова
s = regexprep(str, expr, replace),
заменяет на строку replace все обнаруженные регулярные выражения ехрг в
строке str. Преобразованная строка подается на выход s. Если не найдено ни
одного соответствия, то функция regexprep возвращает str без изменений.
Функция str cat имеет синтаксис
С = strcat(Sl, S2, S3, ...).
Эта функция соединяет (по горизонтали) соответствующие строки символьных
массивов SI, S2, S3 и т. д. Все входные массивы должны иметь одно и то же чис-
число строк (или быть просто строками). Когда все входы являются символьными
массивами, то и выходом служит символьный массив. Если хоть один входной па-
параметр является смешанным массивом, то strcat возвращает смешанный массив
строк, который строится присоединением соответствующих элементов входов S1,
S2, S3 и т. д. При этом входы должны иметь одинаковый размер (или быть скаля-
скалярами). Любой вход может быть также символьным массивом. Концевые пробелы
символьных массивов игнорируются и не записываются в выход. Это не делается
для входов, которые являются смешанными массивами строк. Для сохранения
концевых пробелов можно использовать стандартный прием, основанный на вы-
выражениях в квадратных скобках типа [SI S2 S3 . . .] . Например,
>> а = 'hello ' °/в Note the trailing blank space.
>> b = 'goodbye'
>> strcat(a, b)
ans =
hellogoodbye
[a b]
ans =
hello goodbye
Функция strvcat, имеющая синтаксис
S = strvcat(tl, t2, t3, ...),
строит символьный массив S, состоящий из текстовых строк (или стоковых мат-
матриц) tl,t2,t3, .... При необходимости, некоторые стоки дополняются пробелами
Глава 12. Распознавание объектов
для получения правильной матрицы. Пустые аргументы игнорируются. Так, ис-
использование строк а и Ъ из предыдущего примера дает
>> strvcat(a, b)
ans =
hello
goodbye
Функция strcmp с вызовом
k = strcmp(strl, str2)
сравнивает строки strl и str2 и возвращает 1 (true), если строки идентичны.
В противном случае она возвращает 0 (false). Более общая форма вызова имеет
вид
К = strcmp(S, Т),
где или S, или Т является смешанным массивом строк, а К — это массив (с раз-
размерами как у S и Т), который содержит 1 на месте совпадающих элементов в S
и Т, а 0 — там, где совпадений нет. S и Т должны иметь одинаковые размеры (или
один из них может являться скалярным смешанным массивом). Они могут так-
также быть символьными массивами с подходящим числом строк. Функция strcmpi
совершает те же действия, но не различает строчные и заглавные буквы.
Функция strncmp с синтаксисом
k = strncmp('strl', 'str2', n)
возвращает логическую 1 (true), если первые п символов строк strl и str2 сов-
совпадают, а в противном случае она возвращает логический 0 (false). Аргументы
strl и str2 также могут быть смешанными массивами строк. Команда
R = strncmp(S, T, n),
где S и Т могут быть смешанными массивами строк, возвращает массив R, имею-
имеющий тот же размер, что и массивы S и Т, в котором записаны 1 на месте совпа-
совпадающих элементов S и Т (до п элементов включительно). Массивы S и Т должны
иметь одинаковые размеры (или один из них является скалярным смешанным
массивом). Кроме того, они могут быть символьным массивами с правильным
числом строк. Команда strncmp различает строчные и заглавные буквы. Все на-
начальные и конечные пробелы любой строки участвуют в процедуре сравнения.
Функция strncmpi совершает те же действия, что и strncmp, но не различает
строчные и заглавные буквы.
Функция, имеющая синтаксис
I = strfind(str, pattern),
ищет в строке str все вхождения более короткой строки pattern, возвращая
начальный индекс каждого такого вхождения в виде двойного массива I. Если
строка pattern не обнаружена в str, то strf ind возвращает пустой массив [ ].
12.4- Структурное распознавание
Функция strjust допускает форму вызова
Q = strjust(A, direction),
где А — это символьный массив, а параметр direction может иметь одно из трех
значений выравнивания: 'right', 'left' и 'center'. По умолчанию принято
значение 'right'. Выходной массив содержит все те же строки, что и А, но они
выровнены в соответствии с указанным параметром. Отметим, что выравнивание
строк предполагает наличие начальных или конечных пробелов при выполнении
предписанной операции. Например, пусть «?» обозначает символ пробела, тогда
строка 'ППаЬс' с двумя начальными пробелами не меняется при выравнивании
'right', превращается в строку 'abcDD' при выравнивании 'left' и стано-
становится строкой 'ПаЬсП' при выравнивании 'center'. Ясно, что при отсутствии
начальных и конечных пробелов ничего не меняется.
Функция stmatch, имеющая синтаксис
m = strmatchCstr', STRS),
просматривает строки символьного массива или смешанного массива строк STRS,
ища строки, которые начинаются на 'str', и возвращая индексы найденных
строк. Альтернативная форма вызова имеет вид
m = strmatchCstr', STRS, 'exact').
В этом случае возвращаются лишь индексы, которым соответствуют строки с
полным совпадением по 'str'. Например, команда
>> m = strmatch('max', strvcat('max', 'minimax', 'maximum'));
возвращает m = [1; 3], так как строки 1 и 3 массива, построенного функцией
strvcat, начинаются на 'max'. С другой стороны, команда
>> m = strmatchCmax', strvcat ('max', 'minimax', 'maximum'), 'exact');
возвращает m = 1, поскольку только строка 1 совпадает в точности с 'max'.
Функция strrep с синтаксисом
г = strrep('strl', 'str2', 'str3')
заменяет в строке 'strl' все вхождения подстроки 'str2' на подстроку 5str3'.
Если какая-то переменная из strl, str2 или str3 является смешанным массивом
строк, эта функция возвращает смешанный массив того же размера, что и strl,
str2, str3, который получается поэлементным выполнением команды strrep.
Все входные данные должны иметь одинаковый размер (или могут быть скаляр-
скалярным смешанным массивом). Кроме того, любой из них может быть символьным
массивом с правильным числом строк. Например,
>> s = 'Image processing and restoration.';
>> str = strrep(s, 'processing', 'enhancement')
Глава 12. Распознавание объектов
str =
Image enhancement and restoration.
Функция strtok по команде
t = strtok('str', delim)
возвращает первую метку в текстовой строке str, то есть первое множество сим-
символов до обнаружения ограничителя delim. Параметр delim является вектором,
состоящим из символов-ограничителей (т.е. пробелы, другие символы, строки).
Например,
>> str = 'An image is an ordered set of pixels';
>> delim =[''];
>> t = strtok(str, delim)
t =
An
Заметим, что функция strtok прерывает работу после обнаружения первого
ограничителя (в нашем случае это был пробел). Если мы заменим delim на delim
= [' х' ] , то получим
>> t = strtok(str, delim)
t =
An image is an ordered set of pi
Следующее семейство функций из табл. 12.2 совершает преобразования меж-
между строками и числами. Функция int2str, имеющая синтаксис
str = int2str(N),
конвертирует целые числа в строки с форматом целых чисел. Вход N может быть
скаляром, вектором или матрицей целых чисел. Нецелые числа сначала округ-
округляются. Например, int2strB + 3) является строкой '5'. Для входных матриц
или векторов функция int2str возвращает матрицу строк:
>> str = int2str(eyeC))
ans =
10 0
0 10
0 0 1
>> class(str)
ans =
char
Функция mat2str, имеющая форму вызова
str = mat2str(A),
преобразует матрицу А в строку, которая годится быть входом функции eval
в представлении числовых данных с полной точностью. Расширенный вариант
вызова
str = mat2str(A, n)
12.4- Структурное распознавание 525
преобразует матрицу с точностью с п цифрами. Например, рассмотрим матрицу
>> А = [1 2;3 4]
А =
1 2
3 4
Команда
>> Ъ = mat2str(A)
порождает
Ъ =
[1 2;3 4]
где Ъ — это строка из 9 символов, включая квадратные скобки, пробелы и точку
с запятой. Команда
>> eval(mat2str(A))
воспроизводит числовую матрицу А. Другие функции из этого семейства имеют
аналогичную интерпретацию.
Последняя группа функций из табл. 12.2 относится к преобразованиям систем
счисления. Например, функция dec2base, имеющая синтаксис
str = dec2base(d, base),
преобразует десятичные числа в числа с заданной системой счисления по основа-
основанию base, где d — это неотрицательное целое меньше, чем 2~52, a base должно
быть целым между 2 и 36. Возвращаемый аргумент str является символьной
строкой. Например, следующая команда преобразует 23ю к числу по основанию 2
и возвращает результат в виде строки:
>> str = dec2baseB3, 2)
str =
10111
>> class(str)
ans =
char
Используя формулу
str = dec2base(d, base, n),
получаем представление не более чем с п цифрами.
Глава 12. Распознавание объектов
12.4.2. Сопоставление строк
Наряду с функциями сопоставления и сравнения из табл. 12.2, часто бывает по-
полезно уметь вычислять меру схожести символьных строк, которая вела бы себя
аналогично расстоянию, обсуждавшемуся в § 12.2. Мы проиллюстрируем такой
подход с помощью определяемой ниже меры близости.
Пусть имеется две границы областей а и Ь, которые закодированы, соответ-
соответственно, с помощью строк а\п2 ... аш и Ъ\Ъ2 ... Ьп. Пусть а обозначает число сов-
совпадений между этими двумя строками, причем совпадение в некоторой fc-ой по-
позиции имеет место, если ak = bfc. Тогда число несовпадающих символов равно
/3 = тах(|а|,|6|) -а,
где | arg | обозначает длину (число символов) строки в аргументе. Можно пока-
показать, что /3 = 0, если, и только если а и Ъ являются идентичными строками.
Простейшая мера схожести строк а и Ъ равна дроби
R
C max(|a|, |Ь|) — a'
Эта мера была предложена в работе [Sze, Yang, 1981]. Она равна бесконечности
при полном совпадении строк и равна 0, когда нет ни одного совпадения между
оиЦв этом случае а равно 0).
Поскольку сопоставление производится между соответствующими символами,
необходимо, чтобы все строки «регистрировались» некоторым общим способом,
не зависящим от положения символов, в противном случае такой метод сравне-
сравнения не будет иметь смысла. Один способ регистрации двух строк заключается в
сдвигах одной строки относительно другой до тех пор, пока величина R не станет
максимальной. Эту и некоторые другие похожие стратегии можно реализовать
на базе некоторых операций над строками, перечисленными в табл. 12.2. Обычно
более эффективный подход состоит в нахождении некоторой начальной точки
для каждой строки на основе нормировки границ относительно размера и ори-
ориентации перед тем, как строить ее представление в виде строки символов. Такой
подход иллюстрируется в примере 12.3.
Следующая функция вычисляет предложенную выше меру схожести для двух
строк символов.
function R = strsimilarity(a, b)
'/oSTRSIMILARITY Computes a similarity measure between two strings.
°/, R = STRSIMILARITY(A, B) computes the similarity measure, R,
% defined in Section 12.4.2 for strings A and B. The strings do not
% have to be of the same length, but if one is shorter than other,
% then it is assumed that the shorter string has been padded with
°/o leading blanks so that it is brought into the necessary
% registration prior to using this function. Only one of the
У, strings cam have blanks, and these must be leading and/or
°/o trailing blanks. Blanks are not counted when computing the length
°/0 of the strings for use in the similarity measure.
12.4- Структурное распознавание
р/о Verify that a and b are character strings.
if ~ischar(a) | ~ischar(b)
error('Inputs must be character strings.')
end
°/e Find any blank spaces.
I = find(a =='');
J = find(b =='');
LI = length(I); LJ = length(J);
if LI ~= 0 & LJ ~= 0
error('Only one of the strings can contain blanks.')
end
°/0 Pad the end of the appropriate string. It is assumed
У» that they are registered in terms of their beginning
°/e positions,
a = a(:); b = b(:);
La = length(a); Lb = length(b);
if LI == 0 & LJ == 0
if La > Lb
b = [b; blanks(La - Lb)'] ;
else
a = [a; blanks(Lb - La)'];
end
elseif isempty(I)
Lb = length(b) - length(J);
b = [b; blanks(La - Lb - LJ)'];
else
La = length(a) - length(I);
a = [a; blanks(Lb - La - LI)'];
end
°/o Compute the similarity measure.
I = find(a == b);
alpha = length(I);
den = max(La, Lb) - alpha;
if den == 0
R = Inf;
else
R = alpha/den;
end
Пример 12.3. Распознавание объектов на основе сопоставления строк.
На рис. 12.3, а) и г), показаны силуэты двух типов тарных банок, у которых
принципиальное отличие форм состоит в изгибе боковой поверхности. Чтобы
различать эти формы, мы будем относить объект с кривой боковой поверхностью
на рис. 12.3, а) к классу 1, а на рис. 12.3, г) — к классу 2. Оба изображения имеют
размеры 372x372 пиксела.
528 Глава 12. Распознавание объектов
Рис. 12.3. а) Объект, б) Его ломаная минимальной длины, полученная функцией
minperpoly с размером ячеек 8. в) Типичная зашумленная граница.
г)-е) Те же изображения для другого объекта
Чтобы продемонстрировать эффективность меры R для дифференциации объ-
объектов классов 1 и 2, границы этих объектов приближаются ломаной минималь-
минимальной длины с помощью функции minperpoly (см. § 11.2.2) с размером ячеек 8. На
рис. 12.3, б) и д), показаны результаты. Затем к координатам каждой вершины
ломаной был добавлен некоторый шум с помощью функции randvertex (листинг
этой функции приведен в приложении В), которая имеет синтаксическую форму
[xn, yn] = randvertex(х, у, npix),
где х и у являются векторами-столбцами, содержащими координаты вершин ло-
ломаной линии, хп и уп — это соответствующие зашумленные координаты, a npix —
это максимальное число пикселов, у которых разрешается поменять координату
по любому направлению. Для каждого класса были сгенерированы 5 зашумлен-
зашумленных вершин при npix = 5. На рис. 12.3, в) и е) показаны типичные результаты.
Строки символов для каждого класса были образованы кодированием внут-
внутренних углов ломаных линий с помощью функции polyangles (см. программный
12.4- Структурное распознавание
код в приложении В):3
>> angles = polyangles(x, у);
Тогда строка s строится по массиву angles квантованием с шагом 45° по команде
>> s = floor (angles/45) + 1;
Получается строка, элементами которой служат числа от 1 до 8, где 1 обозначает
диапазон 0° < в < 45°, 2 обозначает диапазон 45° < в < 90° и т.д. Здесь в — это
внутренний угол многоугольника границы.
Поскольку первым элементом на выходе minperpoly всегда является самая
верхняя левая вершина входной границы В, то первый элемент строки s соот-
соответствует внутреннему углу этой вершины. В этом заключается автоматическая
регистрация строки (если не поворачивать объекты), поскольку все они начина-
начинаются с самого верхнего левого угла для всех изображений. Направление обхода
вершин на выходе minperpoly задано по часовой стрелке, поэтому и элементы s
следуют в этом направлении. Наконец, каждая строка s преобразуется из число-
числового формата в символьный с помощью команды
>> s = int2str(s) ;
В этом примере объекты имеют сравнимые размеры, и они расположены вер-
вертикально, поэтому нет необходимости нормировать или менять ориентацию. Если
бы объекты имели произвольный размер и ориентацию, то мы могли бы сори-
сориентировать их вдоль их основных направлений, используя собственные векторы
соответствующих преобразований, которые обсуждались в конце § 11.5. После
чего мы могли бы использовать ограничивающий прямоугольник из § 11.4 для
определения размеров объектов для их нормирования.
Сначала функция strsimilarity использовалась для вычисления меры схо-
схожести всех строк класса 1 между собой. Например, чтобы найти схожесть между
первой и второй строкой класса 1, выписываем команду
>> R = strsimilarity(sll, sl2) ;
где первый индекс обозначает класс, а второй — номер строки из этого класса.
Результаты, полученные для пяти типичных строк, суммированы в табл. 12.4, где
Inf обозначает бесконечность (т. е. полное совпадение, что объяснялось раньше).
Табл. 12.5 отображает аналогичные меры схожести для пяти строк класса 2.
Табл. 12.6 показывает величины меры схожести между строками разных клас-
классов 1 и 2. Отметим, что величины в этой таблице существенно меньше, чем числа
из предыдущих двух таблиц. Это указывает на то, что мера R достигает высокой
степени различия между двумя классами объектов. Другими словами, измере-
измерение схожести строк между членами одного класса дало существенно большие
значения, что означает их близкое совпадение по сравнению с членами противо-
противоположного класса. ?
3Входы х и у функции polyangles являются векторами, состоящими из х- и у-координат вершин
многоугольника, упорядоченные по часовой стрелке. Выходом служит вектор, состоящий из
величин соответствующих внутренних углов, выраженных в градусах.
Глава 12. Распознавание объектов
Таблица 12.4. Значения меры схожести R строк внутри класса 1.
(Все величины увеличены в 10 раз)
R
sn
S12
S13
S14
S15
Sll
Inf
9.33
26.25
16.36
22.22
S12
Inf
12.31
9.33
14.17
Sl3
Inf
14.16
14.01
S14
Inf
19.02
S15
Inf
Таблица 12.5. Значения меры схожести R строк внутри класса 2.
(Все величины увеличены в 10 раз)
R
S21
S22
S23
S24
S25
S21
Inf
10.00
13.33
7.50
13.33
S22
Inf
13.33
13.31
7.51
S23
Inf
18.00
18.12
S24
Inf
10.01
S25
Inf
Таблица 12.6. Значения меры схожести R строк между классами 1 и 2.
(Все величины увеличены в 10 раз)
R
S21
S22
S23
S24
S25
sn
2.03
1.15
2.08
1.60
1.61
S12
0.01
1.61
1.15
1.62
0.36
S13
1.15
1.16
2.08
1.59
0.74
S14
1.17
0.75
2.06
1.14
1.60
S15
0.75
2.07
2.08
2.61
1.16
Выводы
Начиная с гл. 9, наше рассмотрение цифровой обработки изображений отошло от
процессов, выходом которых являются изображения, и переместилось в область
методов и процедур, которые имеют на выходе признаки и атрибуты входных
изображений. Хотя последняя глава носит ознакомительный характер, затрону-
затронутые в ней идеи и концепции носят фундаментальный характер, а представленные
в ней материалы отражают современное представление о предмете распознавания
объектов. Как отмечалось в начале нашего путешествия в § 1.2, распознавание
индивидуальных объектов является логическим завершением этой книги.
Закончив изучение материалов представленных двенадцати глав, читатель те-
теперь в состоянии решать задачи программного прототипирования различных ме-
методов цифровой обработки изображений с помощью функций системы MATLAB
и пакета Image Processing Toolbox. Но еще более важно то, что основные теоре-
теоретические положения и множество новых построенных функций образуют общую
схему того, как можно расширять и углублять возможности MATLAB и IPT.
Учитывая специфическую особенность большинства проблем обработки изоб-
изображений, ясное понимание этого материала существенно повышает шансы на
успешное решение широкого спектра задач в области приложений цифровой об-
обработки изображений.
ПРИЛОЖЕНИЕ А
Введение
В § АЛ этого приложения перечислены все функции из пакета Image Processing
Toolbox, а также все новые функции, которые были разработаны в предыду-
предыдущих главах данной книги. Последняя группа называется пакетом DIPUM. Эта
аббревиатура получится, если взять первые буквы слов из названия нашей кни-
книги на английском языке (Digital Image Processing Using Matlab). Все указанные
номера страниц относятся к тем местам книги, где эти функции появились в пер-
первый раз. В некоторых случаях для ряда функций имеется несколько ссылочных
страниц. Это означает, что данные функции прокомментированы и объяснены
по-разному в зависимости от возможных приложений. Некоторые функции IPT
не использовались в тексте книги. Это обстоятельство отмечено словом online
(оперативный доступ), что означает приглашение обратиться к справочной стра-
странице MATLAB по данной функции. Все функции MATLAB, использованные в
книге, перечислены в § А.2. В этом параграфе номера страниц соответствуют
первому упоминанию данной функции в тексте книги.
А. I. Функции IPT и DIPUM
Следующие функции достаточно условным образом объединены в группы, подоб-
подобно тому, как это сделано в документации по пакету IPT. Если в IPT отсутство-
отсутствовала соответствующая группа функций (например, для действий с вейвлетами),
то такую группу мы создали самостоятельно.
Группа и имя Описание Стр.
Вывод изображений на дисплей
colorbar Отобразить панель цветов (MATLAB). online
get image Получить изображение по осям. online
ice (DIPUM) Интерактивное редактирование цветов. 238
image Создать и отобразить объект изображения (MATLAB). online
imagesc Поменять масштаб и показать изображение (MATLAB). online
immovie Построить мультфильм по последовательности кадров. online
imshow Показать изображение. 32
imview Показать изображение в Image Viewer. online
montage Показать несколько изображений в виде прямоугольных кад-online
ров.
movie Показать записанный мультфильм (MATLAB). online
rgbcube (О1РиМ)Отобразить цветовой куб RGB. 207
subimage Показать несколько изображений на одном графике. online
tmesize Выровнять отображаемые размеры изображения. online
warp Показать изображение в виде текстуры поверхности. online
Операции ввода/вывода файлов изображений
dicominf о . Считать метаданные из DICOM-сообщения. online
dicomread Считать DICOM-изображение. online
dicomwrite Записать DICOM-изображение. online
dicom-dict.txt Текстовый файл, содержащий словарь DICOM-данных. online
dicomuid Построить однозначный DICOM-идентификатор. online
Приложение А
imf inf о Выдать информацию о файле изображения 35
(MATLAB).
imread Считать файл изображения (MATLAB). 31
imwrite Записать файл изображения (MATLAB). 34
Арифметика изображений
imabsdif f Вычислить абсолютную разность двух изображений. 58
imadd Сложить два изображения или прибавить константу к 58
изображению.
imcomplement Дополнительное (негативное) изображение. 58, 81
imdivide Разделить одно изображение на другое или разделить 58
изображение на константу.
imlincomb Вычислить линейную комбинацию изображений. 58, 172
immultiply Перемножить два изображения или умножить изобра- 58
жение на константу,
imsubtract Вычесть одно изображение из другого или вычесть 58
константу из изображения.
Геометрические преобразования
Построить изображение шахматной доски. 181
Найти выходные границы геометрического преобразо- online
вания.
Поменять местами вход и выход в структуре TFORM. online
Обрезать изображение. online
Изменить размеры изображения. online
Повернуть изображение. 490
Применить геометрическое преобразование к изобра- 201
жению.
Алгоритм нахождения целочисленных координат ли- 454
нии (недокументированная функция IPT).
Создать повторную структуру. 203
Создать структуру геометрического преобразования 197
(TFORM).
Дублировать пикселы изображения по обоим направ- 181
лениям.
Применить геометрическое преобразование к ЛГ-мер- online
ному массиву.
Применить прямое геометрическое преобразование. 197
Применить обратное геометрическое преобразование. 197
vistformfwd (DIPUM)Сделать визуализацию прямого геометрического пре- 198
образования.
Регистрация изображений
Преобразовать CPSTRUCT в допустимую пару кон- online
трольных точек.
Построить геометрическое преобразование по контроль- 204
ным точкам.
Настроить положения контрольных точек с помощью online
взаимной корреляции.
Инструмент задания контрольных точек. 205
Нормализованная взаимная корреляция. online
checkerboard
findbounds
fliptform
imcrop
imresize
imrotate
imtransform
intline
makeresampler
maketform
pixeldup (DIPUM)
tformarray
tformfwd
tforminv
cpstruct2pairs
cp2tform
cpcorr
cpselect
normxcorr2
Значения пикселов и статистика
corr2
covmatrix (DIPUM)
imcontour
online
494
Вычислить двумерный коэффициент корреляции.
Вычислить ковариационную матрицу семейств векто-
векторов.
Построить контурный график данных изображения, online
imhist
impixel
improfile
me an2
pixval
regionprops
statmoments
std2
(DIPUM)
A.I. Функции IPT и DIPUM
Построить гистограмму данных изображения. 91
Определить значения цветного пиксела. online
Вычислить значения пикселов пересечения вдоль от-online
резка прямой.
Вычислить среднее значение элементов матрицы. 89
Показать информацию о пикселах изображения. 33
Найти свойства областей изображения. 481
Вычислить статистические центральные моменты ги- 169
стограммы изображения.
Вычислить стандартное отклонение элементов матрицы. 433
Анализ изображений (включая сегментацию, описание и распознавание)
bayesgauss (DIPUM)
bound2eight (DIPUM)
bound2four (DIPUM)
bwboundaries
bwt rac eboundarу
bound2im (DIPUM)
boundaries (DIPUM)
bsubsamp (DIPUM)
colorgrad (DIPUM)
colorseg (DIPUM)
connectpoly (DIPUM)
diameter (DIPUM)
edge
fchcode (DIPUM)
frdescp (DIPUM)
graythresh
hough (DIPUM)
houghlines (DIPUM)
houghpeaks (DIPUM)
houghpixels (DIPUM)
ifrdescp (DIPUM)
Байесовский классификатор гауссовых образцов. 511
Преобразовать 4-связную границу в 8-связную. 452
Преобразовать 8-связную границу в 4-связную. 452
Отследить границы области. online
Отследить единственную границу. online
Преобразовать границу в изображение. 453
Отследить границы области. 452
Совершить укрупняющую подвыборку границы. 453
Вычислить векторный градиент RGB-изображения. 248
Сегментировать цветное изображение. 251
Соединить вершины многоугольника. 453
Вычислить диаметр областей изображения. 474
Найти края на полутоновом изображении. 403
Вычислить цепной код Фримана границы. 455
Вычислить Фурье-дескрипторы. 476
Вычислить глобальный порог изображения, исполь- 423
зуя метод Отсу.
Преобразование Хафа. 413
Выделить отрезки прямых с помощью преобразова- 419
ния Хафа.
Найти локальные вершины преобразования Хафа. 416
Вычислить пикселы изображения, принадлежащие 418
корзине преобразования Хафа.
Вычислить обратные дескрипторы Фурье.
imstack2vectors (DIPUM)Извлечь векторы из стекового изображения.
invmoments (DIPUM)
mahalanobis (DIPUM)
minperpoly (DIPUM)
polyangles (DIPUM)
princomp (DIPUM)
qtdecomp
qtgetblk
qtsetblk
randvertex (DIPUM)
regiongrow (DIPUM)
signature (DIPUM)
specxture (DIPUM)
splitmerge (DIPUM)
statxture (DIPUM)
strsimilarity (DIPUM)
x2majoraxis (DIPUM)
477
493
489
504
465
529
494
Вычислить инварианты моментов изображения.
Найти расстояние Махаланобиса.
Найти ломаную минимального периметра.
Вычислить внутренние углы многоугольника.
Получить векторы главных компонентов и связанные
величины.
Совершить разложение по квадродереву. 431
Получить величины блоков разложения по квадроде- 431
реву.
Задать величины блоков разложения по квадродереву. online
Случайно переместить вершины многоугольника. 528
Совершить сегментацию выращиванием областей. 426
Вычислить сигнатуру границы. 468
Вычислить спектральную текстуру изображения. 486
Сегментировать изображение по алгоритму разделе- 432
ние-слияние.
Вычислить статистические меры текстуры изображе- 484
ния.
Мера схожести двух строк. 526
Совместить ось х с главной осью области. 475
Приложение А
Сжатие изображений
compare (DIPUM) Вычислить и отобразить ошибку между двумя мат- 271
рицами.
entropy (DIPUM) Вычислить оценку первого порядка для энтропии 301
матрицы,
huf f 2mat (DIPUM) Декодировать матрицу, закодированную по Хаффману. 316
huffman (DIPUM) Построить код Хаффмана переменной длины для ис- 304
точника символов.
im2jpeg (DIPUM) Сжать изображение, используя алгоритм, близкий 335
JPEG.
im2jpeg2k (О1РиМ)Сжать изображение, используя алгоритм, близкий 343
JPEG 2000.
imratio (DIPUM) Вычислить отношения числа байт двух изображе- 296
ний/переменных.
jpeg2im (DIPUM) Декодировать изображение, сжатое функцией IM2JPEG. 338
jpeg2k2im (DIPUM)Декодировать изображение, сжатое функцией IM2JPEG2K. 346
Ipc2mat (DIPUM) Декодировать матрицу, сжатую одномерными кодами 328
с предсказанием.
mat2huf f (DIPUM) Закодировать матрицу по Хаффману. 312
mat21pc (DIPUM) Кодировать матрицу одномерными кодами с предска- 327
занием.
quantize (DIPUM) Квантовать элементы матрицы класса UINT8. 331
Сжатие изображений
adapthisteq Адаптивная гистограммная эквализация. online
decorrstretch Применить некоррелирующее растяжение к мульти-online
канальным изображениям.
gscale (DIPUM) Поменять масштаб входного изображения. 89
histeq Улучшить контрастность с помощью гистограммной 95
эквализации.
intrans (DIPUM) Совершить преобразования яркости. 87
imadjust Выровнять яркость или цветовые компоненты изоб- 80
ражения.
stretchlim Найти пределы для расширения контрастности изоб-online
ражения.
Линейная и нелинейная пространственная фильтрация
adpmedian (Б1РиМ)Выполнить адаптивную медианную фильтрацию. 178
convmtx2 Вычислить двумерную свертку матриц. online
dftcorr (DIPUM) Выполнить корреляцию в частотной области. 508
dftf ilt (DIPUM) Выполнить фильтрацию в частотной области. 136
f special Построить стандартный фильтр. 114
medf ilt2 Выполнить двумерную медианную фильтрацию. 119
imfilter Совершить фильтрацию двумерного или п-мерного 107
изображения.
ordfilt2 Совершить двумерную фильтрацию по порядковым 118
статистикам,
spfilt (DIPUM) Совершить линейную и нелинейную пространствен- 172
ную фильтрацию.
wiener2 Совершить двумерную адаптивную фильтрацию дляопИпе
удаления шума.
Разработка линейных двумерных фильтров
freqspace Определить промежуток двумерного пространствен-online
ного отклика (MATLAB).
f reqz2 Вычислить двумерный частотный отклик. 137
A.I. Функции IPT и DIPUM
fsamp2 Построить двумерный FIR-фильтр с помощью частотнойопНпе
выборки.
ftrans2 Построить двумерный FIR-фильтр с помощью частотногоопНпе
преобразования.
fwindl Построить двумерный FIR-фильтр по методу одномерногоопНпе
окна.
fwind2 Построить двумерный FIR-фильтр по методу двумерногоопНпе
окна.
hpf ilter (DIPUM) Вычислить высокочастотные фильтры. 149
lpf ilter (DIPUM) Вычислить низкочастотные фильтры. 144
Восстановление изображений
deconvblind Восстановить изображение с помощью слепой деконволюции. 193
deconvlucy Восстановить изображение по методу Люси-Ричардсона. 190
deconvreg Восстановить изображение с помощью регуляризующего 188
фильтра.
deconwnr Восстановить изображение с помощью винеровского фильтра. 184
edgetaper Смазать края с помощью функции разброса точек. 185
otf 2psf Преобразовать оптическую передаточную функцию в функ- 155
цию разброса точек,
psf 2otf Преобразовать функцию разброса точек в оптическую пере- 155
даточную функцию.
Преобразования изображений
dct2 Двумерное дискретное косинусное преобразование. 337
dctmtx Матрица дискретного косинусного преобразования. 338
f an2para Преобразовать центрально-лучевую проекцию в параллель-online
но-лучевую.
f anbeam Вычислить центрально-лучевую проекцию. online
f f t2 Выполнить быстрое двумерное преобразование Фурье 126
(MATLAB).
fftn Выполнить быстрое N-мерное преобразование Фурье online
(MATLAB).
fftshift Перевернуть квадранты выхода FFT (MATLAB). 126
idct2 Двумерное обратное дискретное косинусное преобразование, online
if anbeam Вычислить обратное центрально-лучевое преобразование, online
ifft2 Двумерное обратное быстрое преобразование Фурье 128
(MATLAB).
if ftn N-мерное обратное быстрое преобразование Фурье online
(MATLAB).
iradon Вычислить обратное преобразование Радона. online
para2f an Преобразовать параллельно-лучевую проекцию в централь-online
но-лучевую.
phantom Построить заглавное искусственное изображение. online
radon Вычислить преобразование Радона. online
Вейвлеты
wavecopy (DIPUM)
vavecut (DIPUM)
wave2gray (DIPUM) Отобразить коэффициенты вейвлетного разложения. 280
waveback (DIPUM) Выполнить многоуровневое двумерное обратное FWT. 284
Извлечь коэффициенты из структуры вейвлетного разложения. 278
Вырезать коэффициенты из структуры вейвлетного раз л о- 277
жения.
wavefast (DIPUM) Выполнить многоуровневое двумерное быстрое вейвлетное 268
преобразование.
wavef ilter (DIPUM)Создать вейвлетное разложение и фильтры реконструкции. 265
wavepaste (DIPUM) Вставить коэффициенты в структуру вейвлетного разложения. 278
wavework (DIPUM) Редактировать структуру вейвлетного разложения. 275
Приложение А
wavezero (DIPUM)Обнулить вейвлетные коэффициенты деталей. 290
Обработка областей и блоков
bestblk Выбрать блочный размер для обработки блока. online
blkproc Выполнить индивидуальную блочную обработку 337
изображения.
col2im Разместить столбцы матрицы в виде блока. 338
coif ilt Окрестностные операции по столбцам. 111
im2col Разместить блоки изображений в виде столбцов. 337
nlf ilter Выполнить общую нелинейную фильтрацию. 111
Морфологические операции (полутоновые и двоичные изображения)
conndef Связность по умолчанию. online
imbothat Выполнить преобразование «дно шляпы». 390
imclearborder Подавить светлые структуры, примыкающие к грани- 383
цам изображения.
imclose Замкнуть изображение. 365
imdilate Выполнить дилатацию изображения. 357
imerode Выполнить эрозию изображения. 363
imextendedmax Расширенное преобразования максимума. online
imextendedmin Расширенное преобразования минимума. online
imf ill Заполнить области изображения и отверстия. 383
imhmax H-максимум преобразование. online
imhmin Н-минимум преобразование. 392
imimposemin Выполнить процедуру минимального подъема. 441
imopen Разомкнуть изображение. 365
imreconstruct Морфологическая реконструкция. 381
imregionalmax Найти все локальные максимумы. online
imregionalmin Найти все локальные минимумы. 440
imtophat Выполнить преобразование «верх шляпы». 389
watershed Преобразование водораздела. 437
Морфологические операции (двоичные изображения)
applylut Выполнить окрестностные операции на основе поиско- 370
вой таблицы.
bwarea Вычислить площадь объектов двоичного изображения, online
bvareaopen Разомкнуть двоичную область (удалить малые объек- online
ты),
bwdist Вычислить преобразование расстоянием для двоичного 436
изображения,
bweuler Вычислить эйлерову характеристику двоичного изоб- online
ражения.
bwhitmiss Двоичная операция успех/неудача. 369
bwlabel Найти компоненты связности двумерного двоичного 379
изображения.
bwlabeln Найти компоненты связностигь-мерного двоичного изображения, online
bwmorph Выполнить морфологические операции для двоичного 373
изображения.
АЛ. Функции IPT и DIPUM 537
Создание структурообразующих элементов (STREL) и действия с ними
bwpack Запаковать двоичное изображение.
bwperim Вычислить периметр объектов двоичного изображения.
bwselect Выбрать объекты на двоичном изображении.
bwulterode Окончательная эрозия.
bwunpack Распаковать двоичное изображение.
endpoints (О1РиМ)Вычислить концевые точки двоичного изображения.
makelut
getheight
getneighbors
getnhood
getsequence
isflat
reflect
strel
translate
histroi (DIPUM)
poly2mask
roicolor
roifill
roifilt2
roipoly
brighten
cmpermute
cmunique
colormap
imapprox
rgbplot
applycform
hsv2rgb
iccread
Iab2double
Iab2uintl6
Iab2uint8
makecform
online
463
online
online
online
371
370
online
Построить поисковую таблицу для использования
в applylut.
Получить высоту strel.
Получить координаты смещения и высоту окрестностейопИпе
strel.
Получить окрестность strel. online
Получить последовательность разложенных strels. 361
Вернуть «true» для плоских strels. online
Симметрично отразить strel относительно его центра. online
Создать морфологический структурообразующий элемент. 359
Сдвинуть strel. online
Обработка на основе областей
Вычислить гистограмму области ROI изображения. 170
Преобразовать многоугольник ROI в маску. online
Выбрать интересующую область (RIO) по цвету. online
Гладкая интерполяция по произвольной области. online
Фильтровать область RIO. online
Выбрать RIO в форме многоугольника, отмечая интерак- 169
тивно его вершины.
Действия с цветовой картой
Изменить яркость цветовой карты (MATLAB). online
Переставить цвета в цветовой карте. online
Найти соответствие цветов карты и изображения. online
Задать или получить цветовую таблицу (MATLAB). 146
Аппроксимировать индексированное изображение другим 209
изображением с меньшим набором цветов.
Построить график компонент RGB цветовой карты (MATLAB).online
Преобразования цветовых пространств
Применить преобразование цветового пространства, незави-online
симое от аппаратных средств.
Преобразовать из HSV в RGB (MATLAB). 216
Считать цветовой профиль ICC. online
Преобразовать L*a*b* цветовые значения в класс double, online
Преобразовать L*a*b* цветовые значения в класс uintl6. online
Преобразовать L*a*b* цветовые значения в класс uint8. online
Создать структуру преобразования цветового пространства, online
независимую от аппаратных средств.
Приложение А
ntsc2rgb
rgb2hsv
rgb2ntsc
rgb2ycbcr
ycbcr2rgb
rgb2hsi (DIPUM)
hsi2rgb (DIPUM)
whitepoint
xyz2double
xyz2uintl6
Преобразовать из NTSC в RGB. 215
Преобразовать из RGB в HSV (MATLAB). 216
Преобразовать из RGB в NTSC. 215
Преобразовать из RGB в YCBCR. 215
Преобразовать из YCBCR в RGB. 216
Преобразовать из RGB в HSI. 220
Преобразовать из HSI в RGB. 221
Преобразовать из XYZ в пространство стандартныхопИпе
осветителей.
Преобразовать величины из XYZ в класс double, online
Преобразовать величины из XYZ в класс uintl6. online
Операции с массивами
circshift Сдвинуть массив циклически (MATLAB). 451
dftuv (DIPUM) Вычислить сеточные массивы. 141
padarray Дополнить массив. 112
paddedsize (О1РиМ)Вычислить минимальный размер расширения мае- 131
сива для использования в FFTs.
Типы изображений и преобразования типов
changeclass Сменить класс изображения (недокументированная 86
функция IPT).
dither Преобразовать изображение с помощью алгоритма 212
дрожания.
gray2ind Преобразовать полутоновое изображение в индекси- 212
рованное.
grayslice Создать индексированное изображение по монохром- 212
ному с помощью пороговой обработки.
im2bw Преобразовать изображение в двоичное с помощью 43
пороговой обработки.
im2double Преобразовать массив изображения в изображение 43
с двойной точностью.
im2java Преобразовать изображение в изображение Javaonline
(MATLAB).
im2java2d Преобразовать изображение в буферизованный ви-online
зуальный объект Java.
im2uint8 Преобразовать массив изображения в 8-ми битный 43
целый массив без знака.
im2uintl6 Преобразовать массив изображения в 16-ми битный 43
целый массив без знака.
ind2gray Преобразовать индексированное изображение в по- 213
лутоновое.
ind2rgb Преобразовать индексированное изображение в изоб- 213
ражение RGB (MATLAB).
Iabel2rgb Преобразовать размечающую матрицу в изображе-online
ние RGB.
mat2gray Преобразовать матрицу в полутоновое изображе- 43
ние.
rgb2gray Преобразовать цветовое изображение RGB (или дру- 213
гое) в монохромное.
rgb2ind Преобразовать изображение RGB в индексирован- 212
ное изображение.
Различные действия
conwaylaws (DIPUM)Применить законы Конвея к выбранному пикселу. 372
manualhist (DIPUM)Сгенерировать интерактивно двухмодовую гисто- 101
грамму.
А. 2. Функции MAT LAB
twomodegauss (О1РиМ)Сгенерировать двухмодовую функцию Гаусса. 100
uintlut Вычислить новые значения массива по поисковой таблице.опНпе
iptgetpref
iptsetpref
Пакетные предпочтения
Получить значение предпочтения пакета IPT. online
Установить значение предпочтения пакета IPT. online
А.2. Функции MATLAB
Ниже приводится алфавитный перечень функций MATLAB, использованных в
этой книге. Слева указан номера страниц, на которых имеются соответствующие
материалы.
Функция
MATLAB
Описание
Стр.
А
abs
all
ans
any
axis
В
bar
bin2dec
blanks
break
С
cart2pol
cat
ceil
cell
celldisp
cellfun
cellplot
cellstr
char
Абсолютное значение или комплексный модуль.
Проверить, все ли элементы ненулевые.
Последний результат (ответ).
Проверить, есть ли ненулевой элемент.
Отображение и масштабирование осей.
Столбчатая диаграмма.
Преобразование из двоичного в десятичное.
Строка пробелов.
Оборвать выполнение циклов for или while.
Преобразовать декартовы координаты в полярные или цилиндри-
цилиндрические.
Соединить массивы.
Округлить в сторону плюс бесконечности.
Построить смешанный массив.
Отобразить содержимое смешанного массива.
Применить функцию к каждому элементу смешанного массива.
Отобразить графически структуру смешанного массива.
Построить смешанный массив по символьному.
Построить символьный массив (строку).
circshift Сдвинуть массив циклически.
Оператор двоеточие (:).
Задать и получить текущую цветовую карту.
Идентифицировать информацию о компьютере, на котором дей-
действует данная система MATLAB.
Передать управление следующей итерации цикла for или while.
Двумерная свертка.
colon
colormap
computer
continue
conv2
ctransposeКомплексное транспонирование.
(См. транспонирование вещественных данных),
cumsum Кумулятивная (накопленная) сумма.
D
dec2base
dec2bin
diag
diff
Преобразование из десятичной в другую систему счисления.
Преобразование десятичного в двоичное.
Диагональные матрицы и диагонали матриц.
Разности и приближенные производные.
126
62
63
62
92
91
314
516
64
469
207
128
306
308, 446
446
308
517
76, 517
451
46, 57
146, 210
63
64
268
57
97
525
312
252
392
dir
disp
double
E
edit
eig
end
eps
error
eval
eye
Приложение А
Отобразить список папок (директорий).
Отобразить текст или массив.
Преобразовать в число с двойной точностью.
Редактировать или создать М-файл.
Найти собственные значения и собственные векторы.
Закончить оператор for, while, switch, try, if или обозна-
обозначить последний индекс.
Относительная точность вычислений с плавающей запятой.
Отобразить сообщение об ошибке.
Выполнить команду, записанную в виде символьной строки.
Единичная матрица.
297
74
40
55
494
47
63, 84
65
519
511
F
false
feval
fft2
fftshift
Создать логический массив из нулей (false). 52, 427
Вычисление функции. 432
Двумерное дискретное преобразование Фурье. 126
Переместить нулевую частотную компоненту DFT в центр 126
спектра,
fieldnames Вернуть имена полей структуры или названия свойств объ- 297
екта.
figure Закрепить текущий график. 34
find Найти индексы и значения ненулевых элементов. 160
f liplr Перевернуть матрицу слева направо. 489
f lipup Перевернуть матрицу сверху вниз. 489
floor Округлить в сторону минус бесконечности. 128
for Повторить группу операторов заданное число раз. 64
full Преобразовать разреженную матрицу в стандартную. 413
G
gca
get
getfield
global
grid
guidata
guide
H
help
hist
histc
hold on
I
if
ifft2
ifftshift
imag
intl6
inpolygon
input
int2str
int32
int8
interplq
inv
is*
iscellstr
islogical
Использовать текущие оси. 92
Получить свойства объекта. 238
Получить поля массива структур. 558
Задать глобальную переменную. 306
Координатные линии двумерного или трехмерного графика. 146
Сохранить или восстановить данные приложения. 556
Запустить программу GUI Layout Editor. 544
Отобразить справку функции MATLAB в командном окне. 55
Вычислить и/или отобразить гистограмму. 165
Гистограммный счетчик. 312
Сохранить текущий график и текущие свойства осей. 94
Условная команда. 64
Двумерное дискретное обратное преобразование Фурье. 128
Обратное преобразования FFT со сдвигом. 128
Мнимая часть комплексного числа. 129
Преобразовать в целое со знаком. 40
Обнаружить точки внутри многоугольной области. 465
Запросить пользовательский ввод. 74
Преобразование целого в строчное представление. 524
Преобразовать в целое со знаком. 40
Преобразовать в целое со знаком. 40
Быстрая одномерная линейная интерполяция. 237
Вычислить обратную матрицу. 419
См. табл. 2.9. 63
Определить, является ли смешанным массивом строк. 63, 519
Определить, является ли логическим массивом. 41
А. 2. Функции МАТЬ А В
L
ldivide
length
linspace
load
log
loglO
Iog2
logical
lookfor
lower
M
magic
mat2str
max
mean
median
mesh
meshgrid
mf ilename
min
minus
mldivide
mpower
mrdivide
mtimes
N
nan or NaNHe число.
nargchk Проверить число входных аргументов.
nargin Число входных аргументов функции.
nargout Число выходных аргументов функции.
ndims Число размерностей массива.
nextpow2 Наименьшая степень числа два, большая данного числа.
norm Норма вектора или матрицы.
numel Число элементов массива.
О
ones
Деление массива слева. (См. mldivide для деления матриц 57
слева.)
Длина вектора. 65
Построить вектор с равноотстоящими элементами. 47
Загрузить переменные рабочего пространства с диска. 324
Натуральный логарифм. 82
Десятичный логарифм. 82
Логарифм по основанию 2. 82
Преобразовать числовые значения в логические. 41
Найти ключевое слово на всех справочных страницах. 55
Преобразовать в строчные буквы. 77
Построить магический квадрат. 52
Преобразовать матрицу в строку. 524
Максимальный элемент массива. 57
Среднее значение массива. 379
Значение медианы массива. 119
Сеточный график. 145
Построить матрицы X и Y для трехмерного графика. 70
Имя текущего выполняемого М-файла. 550
Минимальный элемент массива. 57
Вычитание массивов и матриц. 57
Матричное деление слева. (См. ldivide для деления масси- 57
вов слева).
Матричная степень, (см. функцию power для степени мае- 57
сивов).
Матричное деление справа. (См. rdivide для деления мае- 57
сивов справа).
Умножение матриц. (См. times для умножение массивов). 57
63
85
85
85
52
131
502
66
52
Построить массив из одних единиц.
Р
patch Закрасить графический объект по образцам,
permute Переставить размерности многомерного массива,
persistent Определить устойчивые переменные.
Pi
plot
plus
pol2cart
pow2
power
print
prod
207
503
370
Отношение длины окружности к ее диаметру. 63
Линейный двумерный график. 94
Сложение массивов и матриц. 57
Преобразовать полярные или цилиндрические координаты 469
в декартовы.
Массив из упорядоченных степеней числа 2. 314
Степень массивов. (См. mpower для степени матриц). 57
Записать в файл или печатать на бумаге. 39
Перемножить элементы массива. 113
542 Приложение А
R
rand
Случайные числа и массивы с равномерным распределением. 52, 160
randn Случайные числа и массивы с нормальным распределением.52, 160
rdivide Деление массивов справа. (См. mrdivide для деления мат- 57
риц справа).
real Вещественная часть комплексного числа. 129
realmax Наибольшее число с плавающей точкой, которое представи- 63
мо на компьютере,
realmin Наименьшее число с плавающей точкой, которое представи- 63
мо на компьютере.
regexp Найти регулярные выражения. 519
regexpi Найти регулярные выражения, не различая строчные и за- 521
главные.
ге§ехргерЗаменить регулярное выражение на строку. 521
г em Остаток от деления. 268
repmat Тиражирование и повторение массивов. 277
reshape Переформировать массив. 314
return Вернуться назад в вызывающую функцию. 64
rot90 Поворот матрицы на угол, кратный 90 градусам. 108
round Округлить до ближайшего целого. 38
S
save Сохранить переменные рабочего пространства на диске. 315
set Задать свойства объектов. 92
set field Задать поле структурного массива. 563
shading Задать параметры фасеточного тонирования. 148
(В данной книге используется мода interp.)
sign Функция знак числа. 343
single Преобразовать в данные с обычной точностью. 40
size Вернуть размеры массива. 32
sort Упорядочить элементы по возрастанию. 307
sort rows Упорядочить строки по возрастанию. 451
sparse Создать разреженную матрицу. 412
spline Кубическая сплайновая интерполяция данных. 237
sprintf Записать форматированные данные в строку. 67
stem Построить стеблевую диаграмму дискретных данных. 93
str* Операции со строками. См. табл. 12.2. 517
str2num Преобразовать из строки в число. 75
str cat Присоединить строку. 521
strcmp Сравнить строки. 76, 522
strcmpi Сравнить строки, не различая строчные и заглавные. 522
strf ind Найти одну строку внутри другой. 522
str just Выровнять символьный массив. 523
strmatch Найти возможные соответствия (совпадения) строк. 523
strncmp Сравнить первые п символов двух строк. 522
strncmpi Сравнить первые п символов двух строк, не различая строч- 522
ные и заглавные.
strread Считать форматированные данные из строки. 75
strrep Поиск и замена строк. 523
strtok Первая метка строки. 524
strvcat Соединение строк по вертикали. 521
subplot Разделить окно графиков на несколько подокон или подгра- 261
фиков.
sum Суммировать элементы массива. 50
surf Трехмерный график поверхности. 148
switch Переключить выполнение действия при выполнении одного 64
из условий.
А.2. Функции MATLAB
Т
text Создать фрагмент текста. 93
tic, toe Функции хронометрирования. 72
хронометр Умножение массивов. (См. mtimes для умножения матриц). 57
title Добавить заголовок к текущему графику. 93
transpose Транспонирование матриц или векторов. (См. ctranspose 46, 57
для комплексных данных),
true Создать логический массив из одних единиц (true). 52, 427
try. . .catchCM. табл. 2.11.
U
uicontrol
uintl6
uint32
uint8
uiresume
uiwait
uminus
uplus
unique
upper
V
varargin
vararout
version
view
W
warning
while
whitebg
whos
X
xlabel
xlim
xor
xtick
Y
ylabel
ylim
ytick
Z
zeros
Создать пользователем объект интерфейсного контроля.
Преобразовать в целое без знака.
Преобразовать в целое без знака.
Преобразовать в целое без знака.
Контролировать исполнение программы.
Контролировать исполнение программы.
Унарный минус.
Унарный плюс.
Удалить повторные элементы вектора.
Преобразовать в заглавные.
Передать переменное число аргументов.
Возвратить переменное число аргументов.
Получить номер версии MATLAB.
Задать точку обзора.
Показать предупреждающее сообщение.
Повторять группу операций неопределенное число раз.
Поменять цвет фона.
Перечислить переменные рабочего пространства.
Разметить ось х.
Задать или запросить пределы по оси х.
Исключающее ИЛИ.
Разместить метки на горизонтальной оси.
Разметить ось у.
Задать или запросить пределы по оси у.
Разместить метки на вертикальной оси.
Создать массив из одних нулей.
64
551
40
40
40
557
557
57
57
451
77
85
85
63
146
172
64
210
32
92
94
62
92
92
94
92
52
ПРИЛОЖЕНИЕ Б
Введение
В этом приложении будет подробно рассмотрена функция ice (Interactive Color
Editor, интерактивное редактирование цвета), которая была введена в гл. 6. При
этом предполагается, что читатель уже изучил материал § 6.4, где рассмотрено
много примеров использования функции ice применительно к обработке полно-
полноцветных и псевдоцветных изображений (примеры с 6.3 по 6.7), а также разобран
синтаксис вызова этой функции, описаны входные параметры и элементы гра-
графического интерфейса (они подытожены в табл. 6.4-6.6). Достоинство функции
ice состоит в том, что пользователь получает возможность интерактивно строить
кривые цветовых преобразований, наблюдая графический результат действия ва-
варьируемого преобразования в режиме реального (или почти реального) времени.
Б. I. Построение графического интерфейса ICE
Функциональный набор MATLAB GUIDE (Graphical User Interface Development
Environment, окружение для разработки графического интерфейса пользовате-
пользователя) имеет весьма богатый набор инструментов для внедрения графических поль-
пользовательских интерфейсов (GUI, Graphical User Interfaces) в программный код
М-функций. С помощью GUIDE такие процессы, как:
A) элементы GUI (т.е. разные кнопки, выпадающие меню и т.п.) и
B) программирование действий GUI,
разделяются на две легко контролируемые и относительно независимые задачи.
Результирующая графическая М-функция состоит из двух файлов, имеющих
тождественные имена (если не учитывать их расширения):
1. Файл с расширением .fig, который называется FIG-файлом. В нем содер-
содержится полное графическое описание всех объектов и элементов функций
GUI, а также их местоположений в окне программы. В файле .fig записа-
записаны двоичные данные, которые не нужно анализировать при вызове ассоци-
ассоциированного М-файла, написанного со встроенным GUI. FIG-файл для ICE
(ice.fig) описывается далее в этом параграфе.
2. Файл с расширением .ш, который называется GUI М-файлом. Он содержит
программный код, контролирующий операции GUI. В этом файле имеются
функции, которые вызываются при запуске и завершении основной про-
программы, а также функции вызова, которые активируются при взаимодей-
взаимодействии пользователя с объектами GUI — например, при нажатии некоторой
кнопки. GUI М-файл для ICE (ice .m) разбирается в следующем параграфе.
Чтобы запустить GUIDE, в командном окне MATLAB следует набрать
guide filename,
Б.1. Построение графического интерфейса ICE
где filename обозначает имя существующего FIG-файла, который обнаружива-
обнаруживается по текущему пути. Если параметр filename опущен, то GUIDE открывает
новое (т. е. пустое) окно.
Редактор Редактор Контролер Просмотр
_ М-файлов меню свойств объекта «ыпппнитк
Выровнять \ . / / ьыполнить
\ \ I / / /
Инструмент Объект
выбора \
Палитра
компонентов
ICE
Объекты
компонентов
ICE
Область Полоса
раскладки <^ , изменения
графика ICE /^ размера
графика
Рис. Б.1. Макет ICE GUI в редакторе раскладки GUIDE
На рис. Б.1 показано окно редактора раскладки GUIDE (который запускается
командой guide ice после стандартного приглашения MATLAB >>) для ком-
компоновки элементов ICE (Interactive Color Editor, интерактивный редактор цве-
цветов). Редактор раскладки позволяет выбирать и размещать графические объек-
объекты, устанавливать их размеры, выравнивать и манипулировать этими объектами
на макете разрабатываемого пользовательского интерфейса. Кнопки слева обра-
образуют палитру компонентов, в которой отображены объекты, поддерживаемые
GUI: нажимаемые кнопки, переключаемые кнопки, кнопки настройки, окошки
меток, редактируемый текст, неизменяемый текст, слайды, рамки, окна спис-
списков, выпадающие меню и оси. Каждый объект ведет себя так, как и одноименный
объект операционной системы WINDOWS. Любую комбинацию объектов мож-
можно добавить на рисунке объектов в области раскладки в правой части редакто-
редактора раскладки. Отметим, что ICE GUI имеет окошки меток (Smooth, Clamp Ends,
Show PDF, Show CDF, Map Bars и Map Image), неизменяемый текст («Component: »,
«Curve», ... ), рамку, выделяющую контролируемые кривые, две нажимаемые
кнопки (Reset и Reset All), выпадающее меню для выбора кривой цветового
преобразования, а также три объекта axes для отображения выбранной кривой
Приложение Б
(вместе с наложенными контрольными точками), который действуют как для
монохромных, так и для цветных приложений. Иерархический список элемен-
элементов, содержащихся в ICE (который появляется после нажатия мышью на кнопку
просмотр объекта, расположенную в полосе задач в верхней части редактора
раскладки), показан на рис. Б.2, а). Отметим, что каждому элементу присвое-
присвоено уникальное имя или тэг. Например, объекту axes для отображения графи-
графика кривой (в самом вверху списка) приписано имя (идентификатор) curve_axes
[идентификатор отображается в первой записи после открытой круглой скобки
на рис. Б.2, а)].
Рис. В.2. а) Просмотр объекта в GUIDE и б) контролер свойств объекта figure из ICE
Тэги входят в набор свойств, который имеется у каждого объекта GUI. Про-
Прокручиваемый список свойств, которые характеризуют специфический объект,
можно получить, отметив этот объект [в списке просмотр объекта из рис. Б.2, а)
или в области раскладки на рис. Б.1 с помощью инструмента выбора], а за-
затем нажав на кнопку контролер свойств, расположенную в полосе задач ре-
редактора раскладки. На рис. Б.2, б) показан список, который формируется при
выборе объекта figure1 на рис. Б.2, а). Заметим, что свойством Tag [оно вы-
выделено на рис. Б.2, а)] объекта figure является идентификатор ice. Это свой-
свойство весьма важно, так как GUIDE использует его при автоматической гене-
генерации имен функций вызова для figure. Таким образом, например, свойство
WindowButtonDownFcn внизу окна прокрутки контролера свойств получает имя
ice „WindowButtonDownFcn. Напомним, что функции вызова являются М-функ-
1 Сгенерированный GUIDE объект f igure является оболочкой для всех других объектов интер-
интерфейса.
Б.2. Программируемый интерфейс ICE
циями, которые выполняются при взаимодействии пользователя с объектом GUI.
Другими заметными (и общими для всех объектов GUI) свойствами являются
Position и Units, которые задают размер и местоположение объекта.
Наконец, отметим, что некоторые свойства являются уникальными для ря-
ряда объектов. Например, объект «нажимаемая кнопка» имеет свойство Callback,
определяющее функцию, которая выполняется при нажатии данной кнопки, и
свойство String, которое обозначает метку кнопки. Свойством Callback кноп-
кнопки Reset из ICE является reset_pushbutton_Callback [обратите внимание на
вставку ее имени Tag из рис. Б.2, а) в имя функций вызова], а ее свойством
String является «Reset». Заметим, однако, что кнопка Reset не имеет свойства
WindowButtonMotionFcn, оно является специфическим для объекта figure.
Б.2. Программируемый интерфейс ICE
Когда FIG-файл для ICE из предыдущего параграфа сохраняется в первый раз
или совершается его первый вызов (например, при нажатии кнопки Run в по-
полосе задач редактора раскладки), то GUIDE генерирует стартовый GUI М-файл
с именем ice.m. Этот файл можно модифицировать в любом стандартном тек-
текстовом редакторе или в редакторе М-файлов MATLAB, и в нем определяется
то, как интерфейс откликается на действия пользователя. GUI М-файл для ICE
имеет следующий вид:1
function varargout = ice(varargin)
°/о Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_NameJ, mfilename, ...
'gui_SingletonJ, gui_Singleton, ...
'gui_OpeningFcn', Oice.OpeningFcn, . ..
'gui.OutputFcn', @ice_OutputFcn, ...
'gui.LayoutFcn', [] , ...
>gui_Callback', []) ;
if nargin & ischar(varargin{l})
gui_State.gui_Callback = str2func(varargin{l});
end
if nargout
[varargout{l:nargout}] = gui.mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
У, End initialization code - DO NOT EDIT
function ice_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
°/o uiwait (handles .figurel);
1 Начальный М-файл, генерируемый GUIDE.
Приложение Б
function varargout = ice_OutputFcn(hObject, eventdata, handles)
varargout{l} = handles.output;
function ice_WindowButtonDownFcn(hObject, eventdata, handles)
function ice_WindowButtonMotionFcn(hObject, eventdata, handles)
function ice_WindowButtonUpFcn(hObject, eventdata, handles)
function component_popup_Callback(hObject, eventdata, handles)
function smooth_checkbox_Callback(hObject, eventdata, handles)
function reset_pushbutton_Callback(hObject, eventdata, handles)
function slope_checkbox_Callback(hObject, eventdata, handles)
function resetall_pushbutton_Callback(hObject, eventdata, handles)
function pdf_checkbox_Callback(hObject, eventdata, handles)
function cdf_checkbox_Callback(hObject, eventdata, handles)
function mapbar_checkbox_Callback(hObject, eventdata, handles)
function mapimage_checkbox_Callback(hObject, eventdata, handles)
Этот автоматически генерируемый файл является хорошей отправной точкой
или прототипом для разработки полностью функционирующего интерфейса ice.
(Отметим, что здесь мы выбросили из файла множество комментариев, генери-
генерируемых GUIDE, для экономии места). В следующих параграфах мы разобьем
этот программный код на четыре основные раздела:
A) код инициализации, расположенный между двумя строками комментариев
«DO NOT EDIT»,
B) открытие окна и вывод функций (ice.OpeningFcn и ice.OutputFcn),
C) функции вызова окна (т.е., функции ice_WindowButtonDownFcn,
ice_WindowButtonMotion-Fcnи ice_WindowButtonUpFcn), и
D) функции вызова объектов (например, reset_pushbutton_Callback).
При рассмотрении каждого из этих разделов будут разработаны рабочие вер-
версии функций ice, относящихся к данному разделу. При этом будут обсуждаться
вопросы, которые будут интересны большинству разработчиков GUI М-файлов.
Программные коды каждого раздела (для краткости) не будут помещаться в
единый файл ice.m. Он будет представлен здесь по кускам.
Обращение к функции ice были описаны в § 6.4. Оно также кратко изложено
в приводимом ниже полном справочном разделе М-функции ice.m:2
°/oICE Interactive Color Editor.
°/о
% OUT = ICE('Property Name', 'Property Value', ...) transforms an
% image's color components based on interactively specified mapping
°/0 functions. Inputs are Property Name/Property Value pairs:
°/o
°/0 Name Value
•/.
% 'image' An RGB or monochrome input image to be
°/0 transformed by interactively specified
2Справочный раздел окончательной версии функции ice.
Б. 2. Программируемый интерфейс ICE
Уо mappings.
Уо 'space' The color space of the components to be
У, modified. Possible values are 'rgb', 'any',
°/o 'hsi', 'hsv', 'ntsc' (or 'yiq'), 'ycbcr'. When
Уо omitted, the RGB color space is assumed.
% 'wait' If 'on' (the default), OUT is the mapped input
У, image and ICE returns to the calling function
Уо or workspace when closed. If 'off, OUT is the
У, handle of the mapped input image and ICE
% returns immediately.
У.
°/o EXAMPLES:
°/o ice OR iceCwait', 'off') °/e Demo user interface
У, ice ('image', f) °/e Map RGB or mono image
Уо ice ('image', f, 'space', 'hsv') °/0 Map HSV of RGB image
У, g = ice ('image', f) У, Return mapped image
°/o g = ice ('image', f, 'wait', 'off); У, Return its handle
У,
°/o ICE displays one popup menu selectable mapping function at a
У, time. Each image component is mapped by a dedicated curve (e.g.,
У, R, G, or B) and then by an all-component curve (e.g., RGB). Each
У, curve's control points are depicted as circles that can be moved,
У, added, or deleted with a two- or three-button mouse:
Уо Mouse Button Editing Operation
У, Left Move control point by pressing and dragging.
Уо Middle Add and position a control point by pressing
У» and dragging. (Optionally Shift-Left)
У, Right Delete a control point. (Optionally
У, Control-Left)
°/o
У, Checkboxes determine how mapping functions are computed, whether
У, the input image and reference pseudo- and full-color bars are
У, mapped, and the displayed reference curve information (e.g.,
У, PDF) :
У,
Уо Checkbox Function
У, Smooth Checked for cubic spline (smooth curve)
°/o interpolation. If unchecked, piecewise linear.
°/o Clamp Ends Checked to force the starting and ending curve
°/o slopes in' cubic spline interpolation to 0. No
°/o effect on piecewise linear.
% Show PDF Display probability density function(s) [i.e.,
Уо histogram(s)] of the image components affected
Приложение Б
У, by the mapping function.
e/e Show CDF Display cumulative distributions function(s)
7, instead of PDFs.
°/e <Note: Show PDF/CDF are mutually exclusive. >
e/e Map Image If checked, image mapping is enabled; else
e/o not.
У, Map Bars If checked, pseudo- and full-color bar mapping
У» is enabled; else display the unmapped bars (a
°/e gray wedge and hue wedge, respectively).
°/,
% Mapping functions can be initialized via pushbuttons:
У.
°/e Button Function
%
°/o Reset Init the currently displayed mapping function
e/e and uncheck all curve parameters.
% Reset All Initialize all mapping functions.
Б.2.1. Программный код инициализации
Открывающим разделом исходного GUI М-файла (см. начало § Б.2) являет-
является стандартный GUIDE-блок инициализации. Его целью является построение и
отображение ICE GUI с использованием соответствующего парного FIG-файла
(см. § Б.1), а также контроль доступа ко всем внутренним функциям М-файла.
Как указано в окружающих строках комментариев «DO NOT EDIT», этот блок ини-
инициализации нельзя изменять. При каждом вызове ice блок инициализации созда-
создает структуру с именем gui_State, которая содержит информацию для доступа к
функциям ice. Например, поле с именем gui_Name (т. е. gui_State. gui_Name) со-
содержит функцию MATLAB mf ilename, которая возвращает имя текущего испол-
исполняемого М-файла. Аналогично, поля fields gui__OpeningFcn и gui_OutputFcn
загружаются вместе со сгенерированными GUIDE-ом именами открывающих и
выходных функций ice (они будут обсуждаться в следующем параграфе). Если
некоторый объект ICE GUI активируется пользователем (например, при нажа-
нажатии кнопки), то имя функции, вызывающий этот объект, добавляется в виде поля
gui.Callback [имя этой функции должно было быть передано в виде строки в
varargin(l)].
После формирования gui_State, эта структура передается в виде входного ар-
аргумента вместе с varargin(r) в функцию gui_mainfcn. Эта функция MATLAB
отвечает за создание, компоновку и отправку вызова GUI. Для ice она строит и
отображает пользовательский интерфейс и генерирует все необходимые обраще-
обращения для ее открытия, вывода и вызова функций. Поскольку предыдущие версии
MATLAB могли не иметь этой функции, GUIDE в состоянии построить независи-
независимую версию нормального GUI М-файла (т. е. способного работать без FIG-файла)
с помощью выбора пункта Export... из меню File. В независимой версии функ-
функция gui_mainf en и две подфункции, ice_LayoutFcn и local.openf ig, добавля-
добавляются к нормальному М-файлу, зависящему от FIG-файла. Задача ice_LayoutFcn
Б. 2. Программируемый интерфейс ICE
состоит в создании ICE GUI. Независимая версия ice начинается командами
hi = figure(...
'Units', 'characters',...
'Color', [0.87843137254902 0.874509803921569 0.890196078431373]
'Colormap', [0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;...
0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 l;0 0.0625 1;...
0.125 l;0 0.1875 l;0 0.25 l;0 0.3125 l;0 0.375 1;...
0 0.4375 l;0 0.5 l;0 0.5625 l;0 0.625 l;0 0.6875 1;...
0 0.75 l;0 0.8125 l;0 0.875 l;0 0.9375 l;0 1 1;...
0.0625 1 l;0.125 1 0.9375;0.1875 1 0.875;...
0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;...
0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;...
0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;...
0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;...
1 1 0.0625;l 1 0;l 0.9375 0;l 0.875 0;l 0.8125 0;...
1 0.75 0;l 0.6875 0;l 0.625 0;l 0.5625 0;l 0.5 0;...
1 0.4375 0;l 0.375 0;l 0.3125 0;l 0.25 0;...
1 0.1875 0;l 0.125 0;l 0.0625 0;l 0 0;0.9375 0 0;...
0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;...
0.5625 0 0],...
'IntegerHandle', 'off , ...
'InvertHardcopy', get@, 'defaultfigureInvertHardcopy'),...
'MenuBar', 'none',...
'Name', 'ICE - Interactive Color Editor',...
'NumberTitle', 'off, ...
'PaperPosition', get@, 'defaultfigurePaperPosition'),...
'Position', [0.8 65.2307692307693 92.6 30.0769230769231],...
'Renderer', get@, 'defaultfigureRenderer'),...
'RendererMode', 'manual',...
'WindowButtonDownFcn', 'ice(>ice_WindowButtonDownFcn", gcbo, [],...
guidata(gcbo))',...
'WindowButtonMotionFcn', 'ice(>ice_WindowButtonMotionFcn>, gcbo,...
[], guidata(gcbo))',...
'WindowButtonUpFcn', 'ice(>ice_WindowButtonUpFcn>, gcbo, [],...
guidata(gcbo))',...
'HandleVisibility', 'callback'
'Tag', 'ice',...
'UserData', zeros(l,0));
для создания основного окна программы. Затем объекты GUI добавляются опе-
операторами типа3
hl3 = uicontroK. . .
'Parent', hi,...
3Функция uicontroK 'PropertyNamel', Valuel, ...) задает пользовательское интерфейсное
управление с заданными свойствами и возвращает его манипулятор.
Приложение Б
'Units', 'normalized',...
'Callback', 'ice(>reset_pushbutton_Callback>, gcbo, [],...
guidata(gcbo))',...
'FontSize', 10,...
'ListboxTop', 0,...
'Position', [0.710583153347732 0.508951406649616...
0.211663066954644 0.0767263427109974]
'String', 'Reset',...
'Tag', 'reset.pushbutton');
которые добавляют кнопку Reset. Отметим, что эти команды явно описывают
свойства, которые изначально были определены с помощью контролера свойств
редактора раскладки GUIDE. Наконец, обратим ваше внимание на то, что функ-
функция figure была введена в § 3.2, а функция uicontrol обеспечивает пользова-
пользовательское управление интерфейсом (т.е. объектом GUI) в текущем окне программы, учи-
учитывая свойства пар имя/значение (например, пары 'Tag' и 'reset_pushbutton'),
и возвращает ее манипулятор.
Б.2.2. Открытие окна и вывод функций
Первые две функции, расположенные после блока инициализации в исходном
GUI М-файле, называются функциями открытия и вывода. Эти две функции вы-
выполняются сразу после того, как GUI становится виден пользователю на экране, и
когда GUI возвращает свой вывод в командную строку или в вызвавшую его про-
программу. Обеим функциям передаются аргументы hObject, eventdata и handles.
(Эти аргументы будут также входами вызывающих функций в следующих двух
параграфах). Аргумент hObject является манипулятором графического объекта,
eventdata зарезервирован для будущего использования, a handles — это струк-
структура, которая обеспечивает манипуляторы объектов интерфейса, а также любых
специфических данных пользователя или приложения. Чтобы реализовать заду-
задуманную функциональность интерфейса ICE (см. справочный текст), обе функ-
функции ice_0peningFcn и ice_0utputFcn должны быть расширением «скелетных»
версий исходного GUI М-файла. Вот этот расширяющий блок4:
I %
function ice_0peningFcn(hObject, eventdata, handles, varargin)
% When ICE is opened, perform basic initialization (e.g., setup
°/o globals, ...) before it is made visible.
% Set ICE globals to defaults.
handles.updown = 'none'; % Mouse updown state
handles.plotbox =[0011]; °/0 Plot area parameters in pixels
handles.set 1 = [0 0; 1 1] ; 7, Curve 1 control points
handles. set2 = [0 0; 1 1] ; 7e Curve 2 control points
handles.set3 = [0 0; 1 1] ; °/0 Curve 3 control points
handles. set4 = [0 0; 1 1]; '/, Curve 4 control points
handles.curve = 'setl'; e/. Structure name of selected curve
4 Взято из окончательной версии М-файла.
Б. 2. Программируемый интерфейс ICE
handles, с index = 1; °/0 Index of selected curve
handles.node =0; % Index of selected control point
handles.below = 1; °/e Index of node below control point
handles.above = 2; °/0 Index of node above control point
handles.smooth = [0; 0; 0; 0] ; % Curve smoothing states
handles.slope = [0; 0; 0; 0]; % Curve end slope control states
handles.cdf = [0; 0; 0; 0] ; % Curve CDF states
handles.pdf = [0; 0; 0; 0] ; °/, Curve PDF states
handles.output = []; % Output image handle
handles.df = [] ; % Input PDFs and CDFs
handles. colortype = 'rgb'; °/e Input image color space
handles. input = [] ; 7e Input image data
handles.imagemap = 1; % Image map enable
handles.barmap = 1; 7, Bar map enable
handles.graybar = [] ; % Pseudo (gray) bar image
handles.colorbar = [] ; % Color (hue) bar image
% Process Property Name/Property Value input argument pairs.
wait = 'on';
if (nargin > 3)
for i = 1:2:(nargin - 3)
if nargin - 3 == i
break;
end
switch lower(varargin{i})
case 'image'
if ndims(varargin{i + 1}) == 3
handles.input = varargin{i + 1};
elseif ndims(varargin{i + 1}) == 2
handles.input = catC, varargin{i +1}, ...
varargin{i + 1}, varargin{i + 1});
end
handles.input = double(handles.input);
inputmax = max(handles.input ( :)) ;
if inputmax > 255
handles.input = handles.input / 65535;
elseif inputmax > 1
handles.input = handles.input / 255;
end
case 'space'
handles.colortype = lower(varargin{i + 1});
switch handles.colortype
case 'any'
list = {'CMY' 'Cyan' 'Magenta' 'Yellow'};
case {'ntsc', 'yiq'}
list = {'YIQ' 'Luminance' 'Hue' 'Saturation'};
handles.colortype = 'ntsc';
Приложение Б
case 'ycbcr'
list = {'YCbCr' 'Luminance' 'Blue' ...
'Difference' 'Red Difference'};
case 'hsv'
list = {'HSV 'Hue' 'Saturation' 'Value'};
case 'hsi'
list = {'HSI' 'Hue' 'Saturation' 'Intensity'};
otherwise
list = {'RGB' 'Red' 'Green' 'Blue'};
handles.colortype = 'rgb';
end
set(handles.component.popup, 'String', list);
case 'wait'
wait = lower(varargin{i + 1});
end
end
end
°/e Create pseudo- and full-color mapping bars (grays and hues). Store
У, a color space converted 1x128x3 line of each bar for mapping,
xi = 0:1/127:1; x = 0:1/6:1; x = x';
y= [1100011; 011100 0; 000111 0]';
gb = repmat(xi, [1 1 3]); cb = interplq(x, y, xi');
cb = reshape (cb, [1 128 3]);
if ~strcmp(handles.colortype, 'rgb')
gb = eval(['rgb2' handles.colortype '(gb)']);
cb = eval(['rgb2' handles.colortype '(cb)']);
end
gb = roundB55 * gb); gb = max@, gb); gb = minB55, gb);
cb = roundB55 * cb); cb = max@, cb); cb = minB55, cb);
handles.graybar = gb; handles.colorbar = cb;
У, Do color space transforms, clamp to [0, 255] , compute histograms
У, and cumulative distribution functions, and create output figure,
if size(handles.input, 1)
if ~strcmp(handles.colortype, 'rgb')
handles.input = eval(['rgb2' handles.colortype ...
'(handles.input)']);
end
handles.input = roundB55 * handles.input);
handles.input = max@, handles.input);
handles.input = minB55, handles.input);
for i = 1:3
color = handles.input(:, :, i);
df = hist(color(:), 0:255);
handles.df = [handles.df; df / max(df(:))];
df = df / sum(df(:)); df = cumsum(df);
handles.df = [handles.df; df];
end
Б. 2. Программируемый интерфейс ICE
figure; handles.output = gcf;
end
e/e Compute ICE's screen position and display image/graph.
set@, 'Units', 'pixels'); ssz = get(O, 'Screensize');
set(handles.ice, 'Units', 'pixels');
uisz = get(handles.ice, 'Position');
if size(handles.input, 1)
fsz = get(handles.output, 'Position');
be = (fszD) - uiszD)) / 3;
if be > 0
be = be + fszB);
else
be = fszB) + fszD) - uiszD) - 10;
end
lc = fsz(l) + (size(handles.input, 2) / 4) + C * fszC) / 4);
lc = min(lc, sszC) - uiszC) - 10);
set(handles.ice, 'Position', [lc be 463 391]);
else
be = round((sszD) - uiszD)) / 2) - 10;
lc = round((sszC) - uiszC)) / 2) - 10;
set(handles.ice, 'Position', [lc be uiszC) uiszD)]);
end
set(handles.ice, 'Units', 'normalized');
graph(handles); render(handles);
e/e Update handles and make ICE wait before exit if required.
guidata(hObject, handles);
if strempi(wait, 'on')
uiwait(handles.ice);
end
I •/,
function varargout = ice_OutputFcn(hObject, eventdata, handles)
7, After ICE is closed, get the image data of the current figure
7, for the output. If 'handles' exists, ICE isn't closed (there was
У. no 'uiwait') so output figure handle,
if max(size(handles)) == 0
figh = get(gcf);
imageh = get(figh.Children);
if max(size(imageh)) > 0
image = get(imageh.Children);
varargout{l} = image.CData;
end
else
varargout{l} = hObject;
end
556 Приложение Б
Вместо того, чтобы вдаваться в детали этих функций (см. комментарии, прило-
приложение А и справочные разделы конкретных функций), мы отметим некоторые
общие свойства функций открытия и вывода:
1. Структура handles (как видно из множества обращений к ней) играет цент-
центральную роль в большинстве GUI М-файлов. Она выполняет две основные
функции. Поскольку она обеспечивает манипуляторы для всех графических
объектов интерфейса, ее можно использовать для доступа к свойствам объ-
объектов и их модификации. Например, открывающая функция ice использует
команды
set(handles.ice, 'Units', 'pixels');
uisz = get(handles.ice, 'Position');
для доступа к размеру и местоположению ICE GUI (которые даны в пик-
пикселах). Эти действия состоят в присвоении свойству Units окна ice, чей
манипулятор доступен в handles, ice, значения 'pixels', после чего счи-
тывается свойство Position окна (с помощью функции get). Функция get,
которая возвращает значение свойства, ассоциированного с графическим
объектом, также используется для получения отображаемой на экране обла-
области с помощью оператора ssz = get@, 'Screensize'), который имеется
в конце открывающей функции. Здесь 0 является манипулятором дисплея
компьютера (т.е. корневого окна), a 'Screensize' — это свойство, содер-
содержащее его размер.
Помимо обеспечения доступа к объектам GUI, структура handles является
мощным каналом для совместного использования данных в приложениях.
Отметим, что в ней хранятся значения по умолчанию двадцати трех гло-
глобальных параметров ice (начиная состоянием мыши в handles, updo wn и
заканчивая всем входным изображением в handles.input). Эти парамет-
параметры должны сохраняться при каждом вызове ice, поэтому они добавляются
к handles при запуске ice_OpeningFcn. Например, глобальная переменная
handles. setl создается командой
handles.setI = [0 0; 1 1],
где setl — это имя поля, хранящего контрольные точки функции отображе-
отображения цветов, которые надо сохранить в структуре handles, a [0 0; 1 1] —
их значения по умолчанию [координаты концевых точек кривой @,0) и
A,1)]. Перед тем, как завершить выполнение функции, в которой модифи-
модифицировалась структура handles, необходимо сделать вызов5
guidata(hObject, handles)
и сохранить переменную handles в виде данных приложения в окне с ма-
манипулятором hObject.
5Функция guidata(H, DATA) сохраняет специфические данные в виде окна данных приложения.
Н — это манипулятор, который идентифицирует окно — он может быть самим окном или любым
объектом этого окна.
Б. 2. Программируемый интерфейс ICE
2. Как и многие встроенные графические функции, ice_OpeningFcn обраба-
обрабатывает входные аргументы (за исключением hObject, eventdatan handles)
по парам: имя и значение свойства. Если имеется более трех входных аргу-
аргументов (т.е. nargin > 3), то выполняется цикл, который пропускает вход-
входные аргументы по парам [for i = 1:2: (nargin 3)]. Для каждой входной
пары первый аргумент используется для управления конструкцией switch,
switch lower(varargin{i}),
которая обрабатывает второй аргумент соответствующим образом. Напри-
Например, в случае ' space', команда
handles.colortype = lower(varargin{i+l});
присваивает полю colortype значение второго аргумента входной пары.
Это значение затем используется для задания в ICE цветовых компонент
выпадающих опций (т. е. свойства String объекта component_popup). Позже
это значение используется для преобразования компонент входного изобра-
изображения в желаемое пространство посредством команды
handles . input = eval ( [' rgb2' . . .
handles.colortype '(handles.input)']);
где встроенная функция eval(s) побуждает MATLAB выполнить строку s
как команду или оператор (см § 12.4.1). Если, к примеру, handles. input —
это 'hsv', то eval от аргумента ['rgb2' 'hsv' ' (handles. input)'] , озна-
означающего соединенную строку 'rgb2hsv(handles, input)', выполняет стан-
стандартную команду преобразования компонент входного RGB -изображения
в цветовое пространство HSV (см. § 6.2.3).
3. Команда
uiwait(handles.figurel);
в стартовом GUI М-файле преобразуется в условный оператор
if strcmpi(wait, 'on') uiwait(handles.ice); end
в конечной версии функции ice_OpeningFcn. В общем случае команда
uiwait(fig)
блокирует выполнение кодового потока MATLAB до тех пор, пока выпол-
выполняется uiresume или пока окно fig не будет уничтожено (т.е. закрыто).
[При отсутствии входных аргументов uiwait эквивалентно uiwait (gcf),
где функция MATLAB gcf возвращает манипулятор текущего окна]. Когда
ice не занят выполнением преобразования входного изображения, но сразу
возвращает результат (до закрытия ICE GUI), входная пара имя/значения
'wait '/'off' должна содержаться в обращении. В противном случае, ICE
не вернет управление вызвавшей ее программе или командной строке до
Приложение Б
тех пор, пока сама она не будет закрыта, т. е. до тех пор, пока пользователь
не закончит взаимодействовать с интерфейсом (и с функциями преобразо-
преобразования цвета). В этой ситуации функция ice_OutputFcn не может получить
преобразованное изображение из структуры handles, поскольку она уже не
будет существовать после закрытия GUI. Как можно обнаружить в оконча-
окончательной версии функции, ICE извлекает данные изображения из свойства
CData сохраненного выходного окна преобразованного изображения. Если
выходное преобразованное изображение не должно возвращаться функцией
ice, оператор uiwait в ice_OpeningFcnHe выполняется, ice .Output Fen вы-
вызывается сразу после открывающей функции (задолго до закрытия GUI), и
манипулятор выходного окна преобразованного изображения возвращается
в вызвавшую программу или в командную строку.
Наконец, отметим, что ряд внутренних функций вызывается с помощью
ice_OpeningFcn. Все они являются внутренними функциями ice. Ниже приво-
приводится их список. Обратите внимание на то, что эти функции дают дополнитель-
дополнительные примеры использования структуры handles при работе с GUI MATLAB.
Например, команды
nodes = getfield(handles, handles.curve)
nodes = getfield(handles, ['set'num2str(i)])
из внутренних функций graph и render используются для доступа к заданным
интерактивно контрольным точкам различных кривых отображений ICE. В об-
общей форме
F = getfield(S, 'field')
возвращает в F содержимое поля 'field' структуры S.6
% у,
function graph(handles)
Ув Interpolate and plot mapping functions and optional reference
e/. PDF(s) or CDF(s).
nodes = getfield(handles, handles.curve);
с = handles.сindex; dfx = 0:1/255:1;
colors = ['k' 'r' 'g' 'b'];
У, For piecewise linear interpolation, plot a map, map + PDF/CDF, or
У, map + 3 PDFs/CDFs.
if "handles.smooth(handles.cindex)
if (~handles.pdf(c) & "handles.cdf(с)) | ...
(size(handles.df, 2) == 0)
plot(nodes(:, 1), nodes(:, 2), 'b-', ...
nodes(:, 1), nodes(:, 2), 'ko', ...
'Parent', handles.curve_axes);
elseif с > 1
6Окончательная версия М-файла с внутренними функциями.
Б. 2. Программируемый интерфейс ICE
i=2*c-2- handles.pdf(с);
plot(dfx, handles.df(i, :), [colors(с) '-'], ...
nodes(:, 1), nodes(:, 2), 'k-', ...
nodesd, 1), nodes(:, 2), 'ко', ...
'Parent', handles.curve_axes);
elseif с == 1
i = handles.cdf(c);
plot(dfx, handles.df(i +1, :), 'r-', ...
dfx, handles.df(i +3, :), 'g-', ...
dfx, handles.df(i + 5, :), 'b-', ...
nodes(:, 1), nodes(:, 2), 'k-', ...
nodes(:, 1), nodesd, 2), 'ко', ...
'Parent', handles.curve_axes);
end
7, Do the same for smooth (cubic spline) interpolations,
else
x = 0:0.01:1;
if "handles.slope(handles.cindex)
у = spline(nodes(:, 1), nodes(:, 2), x);
else
у = spline (nodes (: , 1), [0; nodes(:, 2); 0], x) ;
end
i = find(y > 1); y(i) = 1;
i = find(y < 0); y(i) = 0;
if (~handles.pdf(c) & "handles.cdf (с)) | ...
(size(handles.df, 2) == 0)
plot(nodes(:, 1), nodes(:, 2), 'ко', х, у, 'b-',,...
'Parent', handles.curve_axes);
elseif с > 1
i = 2*c-2- handles.pdf(c);
plot(dfx, handles.df(i, :), [colors(c) '-'], ...
nodes(:, 1), nodes(:, 2), 'ко', х, у, 'к-', ...
'Parent', handles.curve_axes);
elseif с == 1
i = handles.cdf(c);
plot(dfx, handles.df(i + 1, :), 'r-\ ...
dfx, handles.df(i + 3, :), 'g-\ ...
dfx, handles.df(i + 5, :), 'b-', ...
nodes(:, 1), nodes(:, 2), 'ко', х, у, 'к-', ...
'Parent', handles.curve_axes);
end
end
e/e Put legend if more than two curves are shown,
s = handles.colortype;
if strcmp(s, 'ntsc')
s = 'yiq';
end
Приложение Б
if (с == 1) & (handles.pdf(с) | handles.cdf(с))
si = ['- ' upper(s(l))];
if length(s) == 3
s2 = ['- ' upper(sB))]; s3 = ['- ' upper(sC))];
else
s2 = ['- ' upper(sB)) sC)]; s3 = ['- ' upper(sD)) sE)] ;
end
else
si = >; s2 = >; s3 = >;
end
set(handles.red_text, 'String', si);
set(handles.green_text, 'String', s2);
set(handles.blue_text, 'String', s3);
•/,
function [inplot, x, y] = cursor(h, handles)
7, Translate the mouse position to a coordinate with respect to
'/« the current plot area, check for the mouse in the area and if so
°/e save the location and write the coordinates below the plot.
set(h, 'Units', 'pixels');
p = get(h, 'CurrentPoint');
x = (p(l, 1) - handles.plotbox(l)) / handles.plotboxC);
у = (p(l, 2) - handles.plotboxB)) / handles.plotboxD);
if x > 1.05 | x < -0.05 | у > 1.05 | у < -0.05
inplot = 0;
else
x = min(x, 1) ; x = max(x, 0);
у = min(y, 1); у = max(y, 0);
nodes = getfield(handles, handles.curve);
x = roundB56 * x) / 256;
inplot = 1;
set(handles.input.text, 'String', num2str(x, 3));
set(handles.output_text, 'String', num2str(y, 3));
end
set(h, 'Units', 'normalized');
•/,
function у = render(handles)
% Map the input image and bar components and convert them to RGB
e/e (if needed) and display.
set(handles.ice, 'Interruptible', 'off');
set(handles.ice, 'Pointer', 'watch');
ygb = handles.graybar; ycb = handles.colorbar;
yi = handles.input; mapon = handles.barmap;
imageon = handles.imagemap & size(handles.input, 1);
for i = 2:4
nodes = getfield(handles, ['set' num2str(i)]);
t = lut(nodes, handles.smooth(i), handles.slope(i));
Б. 2. Программируемый интерфейс ICE 561
if imageon
yi(:, :, i - 1) = t(yi(:, :, i - 1) + 1);
end
if mapon
ygb(:, :, i - 1) = t(ygb(:, : , i - 1) + 1) ;
ycb(:, :, i - 1) = t(ycb(:, :, i - 1) + 1);
end
end
t = lut(handles.set1, handles.smoothA) , handles.slopeA));
if imageon
yi = t(yi + 1);
end
if mapon
ygb = t(ygb + 1); ycb = t(ycb + 1);
end
if ~strcmp(handles.colortype, 'rgb')
if size(handles.input, 1)
yi = yi / 255;
yi = eval([handles.colortype '2rgb(yi)']);
yi = uint8B55 * yi);
end
ygb = ygb / 255; ycb = ycb / 255;
ygb = eval([handles.colortype '2rgb(ygb)']);
ycb = eval([handles.colortype '2rgb(ycb)']);
ygb = uint8B55 * ygb); ycb = uint8B55 * ycb);
else
yi = uint8(yi); ygb = uint8(ygb); ycb = uint8(ycb);
end
if size(handles.input, 1)
figure(handles.output); imshow(yi);
end
ygb = repmat(ygb, [32 11]); ycb = repmat(ycb, [32 11]);
axes(handles.gray_axes); imshow(ygb);
axes(handles.color_axes); imshow(ycb);
figure(handles.ice);
set(handles.ice, 'Pointer', 'arrow');
set(handles.ice, 'Interruptible', 'on');
0/ 0/
/e — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — /0
function t = lut(nodes, smooth, slope)
7e Create a 256 element mapping function from a set of control
У« points. The output values are integers in the interval [0, 255] .
У, Use piecewise linear or cubic spline with or without zero end
°/e slope interpolation.
t = 255 * nodes; i = 0:255;
if ~smooth
t = [t; 256 256]; t = interplq(t(:, 1), t(:, 2), i');
562 Приложение Б
else
if "slope
t = spline(t(:, 1), t(:, 2), i);
else
t = spline(t(:, 1), [0; t(:, 2); 0], i) ;
end
end
t = round(t); t = max@, t); t = minB55, t);
% 1
function out = spreadout(in)
У, Make all x values unique.
У, Scan forward for non-unique x's and bump the higher indexed x-
У, but don't exceed 1. Scan the entire range.
nudge = 1 / 256;
for i = 2:size(in, 1) - 1
if in(i, 1) <= in(i - 1, 1)
in(i, 1) = min(in(i - 1, 1) + nudge, 1);
end
end
У, Scan in reverse for non-unique x's and decrease the lower indexed
У, x -- but don't go below 0. Stop on the first non-unique pair,
if in(end, 1) == in(end -1,1)
for i = size(in, 1):-1:2
if in(i, 1) <= in(i - 1, 1)
in(i - 1, 1) = max(in(i, 1) - nudge, 0);
else
break;
end
end
end
У, If the first two x's are now the same, init the curve,
if in(l, 1) == inB, 1)
in - [0 0; 1 1];
end
out = in;
•/,
function g = rgb2cmy(f)
54 Convert RGB to CMY using IPT's imcomplement.
g = imcomplement(f);
•/, •
function g = cmy2rgb(f)
У, Convert CMY to RGB using IPT's imcomplement.
g = imcomplement (f);
Б. 2. Программируемый интерфейс ICE
Б.2.3. Функции вызовов окна
Сразу после функций открытия и вывода ICE в исходном GUI М-файле рас-
расположены три функции вызова (см. начало § Б.2) ice_WindowButtonDownFcn,
ice_WindowButtonMotionFcn и ice_WindowButtonUpFcn. В автоматически гене-
генерируемом М-файле они являются фиктивными функциями, т. е. одними заголов-
заголовками function, за которыми не следует никакой программный код. Полностью
разработанные коды этих трех функций, задачей которых является обработка
действий с мышью (нажатие кнопок, перетаскивание контрольных точек ICE-
объектов кривых curve_axes), приведены ниже.78
ув 1
function ice_WindowButtonDownFcn(hObject, eventdata, handles)
У, Start mapping function control point editing. Do move, add, or
7, delete for left, middle, and right button mouse clicks ('normal',
7e 'extend', and 'alt' cases) over plot area.
set(handles.curve.axes, 'Units', 'pixels');
handles.plotbox = get(handles.curve_axes, 'Position');
set(handles.curve_axes, 'Units', 'normalized');
[inplot, x, y] = cursor(hObject, handles);
if inplot
nodes = getfield(handles, handles.curve);
i = find(x >= nodes(:, 1)); below = max(i);
above = min (below + 1, size (nodes, D);
if (x - nodes (below, 1)) > (nodes (above, 1) - x)
node = above;
else
node = below;
end
deletednode = 0;
switch get(hObject, 'SelectionType')
case 'normal'
if node == above
above = min(above + 1, size(nodes, 1));
elseif node == below
below = max(below - 1, 1);
end
if node == size(nodes, 1)
below = above;
elseif node — 1
above = below;
end
if x > nodes (above, 1)
x = nodes(above, 1);
7Функция S = setfieldCS, 'field», V) присваивает обозначенным полям значения V. Затем
возвращается модифицированная структура.
8Функции вызовов окна ice.
Прилосисение Б
elseif x < nodes(below, 1)
x = nodes(below, 1);
end
handles.node = node; handles.updown = 'down';
handles.below = below; handles.above = above;
nodes(node, :) = [x y];
case 'extend'
if ~length(find(nodes(:, 1) == x))
nodes = [nodesA:below, :); [x y]; nodes(above:end, :)];
handles.node = above; handles.updown = 'down';
handles.below = below; handles.above = above + 1;
end
case 'alt'
if (node ~= 1) & (node ~= size(nodes, 1))
nodes(node, :)=[]; deletednode = 1;
end
handles.node = 0;
set(handles.input_text, 'String', >);
set(handles.output_text, 'String', >);
end
handles = setfield(handles, handles.curve, nodes);
guidata(hObject, handles);
graph(handles);
if deletednode
render(handles);
end
end
%
function ice_WindowButtonMotionFcn(hObject, eventdata, handles)
e/e Do nothing unless a mouse 'down' event has occurred. If it has,
°/e modify control point and make new mapping function,
if ~strcmpi(handles.updown, 'down')
return;
end
[inplot, x, y] = cursor(hObject, handles);
if inplot
nodes = getfield(handles, handles.curve);
nudge = handles, smooth (handles, cindex) / 256;
if (handles.node ~= 1) & (handles.node ~= size(nodes, 1))
if x >= nodes(handles.above, 1)
x = nodes(handles.above, 1) - nudge;
elseif x <= nodes(handles.below, 1)
x = nodes(handles.below, 1) + nudge;
end
else
if x > nodes(handles.above, 1)
Б. 2. Программируемый интерфейс ICE
х = nodes(handles.above, 1);
elseif x < nodes(handles.below, 1)
x = nodes(handles.below, 1);
end
end
nodes(handles.node, :) = [x y] ;
handles = setfield(handles, handles.curve, nodes);
guidata(hObject, handles);
graph(handles);
end
•/, yo
function ice_WindowButtonUpFcn(hObject, eventdata, handles)
e/. Terminate ongoing control point move or add operation. Clear
e/, coordinate text below plot and update display.
update = strcmpi(handles.updown, 'down');
handles.updown = 'up'; handles.node = 0;
guidata(hObject, handles);
if update
set(handles.input_text, 'String', >);
set(handles.output_text, 'String', >);
render(handles);
end
В общем случае вызовы окна совершаются в ответ на взаимодействия с объектами
или окном — неактивным объектом uicontrol. Более точно,
- Выполняется WindowButtonDownFcn при нажатии кнопки мыши, когда кур-
курсор стоит в окне, но не над разрешенным объектом ui control (например,
кнопка или выпадающее меню).
- Выполняется WindowButtonMotionFcn при перемещении мыши с нажатой
кнопкой по рабочему окну.
- Выполняется WindowButtonUpFcn, когда пользователь освобождает кнопку
мыши после нажатия этой кнопки в окне, но не над разрешенным объектом
uicontrol.
Задачи и поведение функций вызовов окна задокументированы (с помощью
комментариев) в программном коде. Сделаем некоторые общие вспомогательные
наблюдения по поводу окончательной реализации.
1. Поскольку функция ice_WindowButtonDownFcn вызывается при всех нажа-
нажатиях кнопок мыши в окне ice (за исключением расположения над актив-
активными объектами), первая задача вызываемой функции состоит в определе-
определении, находится ли курсор в пределах области графика ice (т. е. в объекте
curve_axes). Если курсор расположен вне этой области, то мышь должна
игнорироваться. Эта проверка совершается внутренней функцией cursor,
текст которой был приведен в предыдущем параграфе. В коде cursor ко-
команда
р = get(h, 'CurrentPoint');
Приложение Б
возвращает текущие координаты курсора. Переменная h передается из
ice.WindowButtonDownFcn и происходит из входного аргумента hObject. Во
всех вызовах окна hObject является манипулятором сервиса, запрашивае-
запрашиваемого окном. Свойство 'CurrentPoint' содержит положение курсора в окне
в виде вектора-строки из двух компонент [х у].
2. Поскольку ice сконструирована для работы с двух- или трехкнопочной мы-
мышью, функция ice_WindowButtonDownFcn должна определить, какая кнопка
активировала каждый вызов. Как видно из программного кода, это де-
делается с помощью конструкции switch с использованием свойства окна
'SelectionType'. События 'normal', 'extent' и 'alt' обозначают, соот-
соответственно, нажатие левой, средней и правой кнопок трехкнопочной мыши
(или, соответственно, левой, левой+shift и левой+ctrl кнопки двухкнопоч-
ной мыши). Они используются для операций переключения добавленной
контрольной точки, ее перемещения и удаления.
3. Отображаемая в ICE функция преобразования обновляется (через внут-
внутреннюю функцию graph) каждый раз, когда изменяется контрольная точ-
точка, но выходное окно, чей манипулятор хранится в поле handles, out put,
обновляется только при освобождении кнопки мыши. Это предусмотрено
по той причине, что вычисление выходного изображения, которое совер-
совершается функцией render, может быть достаточно затратным по времени.
При этом совершается раздельное преобразование трех цветовых компонент
изображения, преобразование изображения по «всекомпонентной» кривой
и конвертирование результата в RGB-пространство для показа на дисплее.
Отметим, что без надлежащей осторожности контрольные точки отобра-
отображающей функции могут быть случайно неправильно модифицированы в
процессе длительной обработки выходного изображения.
Чтобы избежать этой неприятности, ice контролирует возможные программ-
программные прерывания от разных вызывающих функций. Все графические объек-
объекты MATLAB имеют свойство ' Interruptible', которое установлено в ' on',
что означает разрешение на прерывание объекта. Если оно переключено в
'off, то вызов, который совершается во время совершения теперь непре-
непрерываемой функции или игнорируется (т.е. отменяется), или помещается в
очередь событий для позднейшей обработки. Судьба прерывающих вызо-
вызовов определяется свойством 'BusyAction' прерываемого объекта. Если оно
установлено в 'cancel', то происходит отмена, если же оно равно 'queue',
то вызов обрабатывается после завершения непрерываемого процесса.
Функция ice_WindowButtonUpFcn использует описанный выше механизм
для приостановки (на время вычисления выходного изображения) возмож-
возможности пользователя манипулировать контрольными точками функции отоб-
отображения. Последовательность
set(handles.ice, 'Interruptible', 'off');
set(handles.ice, 'Pointer', 'watch');
set(handles.ice, 'Pointer', 'arrow');
set(handles.ice, 'Interruptible', 'on');
Б.2. Программируемый интерфейс ICE
из внутренней функции render переключает свойство 'Interruptible' ра-
рабочего окна ice в положение 'off во время выполнения преобразования
входного изображения и изменения его (полных или псевдо) цветов. Это
предотвращает случайное изменение положения контрольных точек отоб-
отображающих функций при выполнении самого преобразования. Отметим так-
также, что свойство окна 'Pointer' устанавливается в положение 'watch', что
указывает на то, что ice занята, а положение 'arrow' говорит о том, что
выходные вычисления завершены.
Б.2.4. Функции вызовов объектов
Последние девять строк исходного GUI М-файла из начала § Б.2 являются фик-
фиктивными функциями вызовов объектов. Подобно функциям вызовов окна из
предыдущего параграфа, в автоматически генерируемом макете функций вы-
вызовов объектов отсутствует программный код. Далее приводится полностью раз-
разработанный текст этих программ. Отметим, что каждая функция обрабатывает
взаимодействие пользователя с различными объектами ice uicontrol (нажима-
(нажимаемые кнопки и т. п.), и ее имя получается присоединением к свойству Tag строки
'.Callback'. Например, вызов функции, ответственной за выбор функции отоб-
отображения имеет имя component_popup_Callback. Она вызывается, когда пользо-
пользователь активирует (нажимает) соответствующий пункт меню. Отметим также,
что входной аргумент hObject является манипулятором выпадающего графиче-
графического объекта, а не манипулятором окна ice (как это было для функций оконных
вызовов в предыдущем параграфе). Вызовы объектов ICE имеют небольшие про-
программные коды и их документация является достаточно подробной.9
у, %
function component_popup_Callback(hObject, eventdata, handles)
°/e Accept color component selection, update component specific
У, parameters on GUI, and draw the selected mapping function.
с = get(hObject, 'Value');
handles.сindex = c;
handles. curve = strcatCset', num2str(c));
guidata(hObject, handles);
set(handles.smooth_checkbox, 'Value', handles.smooth(c)) ;
set(handles.slope_checkbox, 'Value', handles.slope(c));
set(handles.pdf.checkbox, 'Value', handles.pdf(c));
set (handles, cdf ..checkbox, 'Value', handles, cdf (c)) ;
graph(handles);
% •/,
function smooth.checkbox_Callback(hObject, eventdata, handles)
У, Accept smoothing parameter for currently selected color
7e component and redraw mapping function,
if get(hObject, 'Value')
handles.smooth(handles.cindex) = 1;
9Функции вызовов объектов ice.
Приложение Б
nodes = getfield(handles, handles.curve);
nodes = spreadout(nodes);
handles = setfield(handles, handles.curve, nodes);
else
handles.smooth(handles.cindex) = 0;
end
guidata(hObject, handles);
set(handles.ice, 'Pointer', 'watch');
graph(handles); render(handles);
set(handles.ice, 'Pointer', 'arrow');
•/. %
function reset_pushbutton_Callback(hObject, eventdata, handles)
У, Init all display parameters for currently selected color
У, component, make map 1:1, and redraw it.
handles = setfield(handles, handles.curve, [0 0; 1 1]);
с = handles.cindex;
handles.smooth(c) = 0; set(handles.smooth.checkbox, 'Value', 0);
handles.slope(c) = 0; set(handles.slope_checkbox, 'Value', 0);
handles.pdf(c) = 0; set(handles.pdf.checkbox, 'Value', 0);
handles.cdf(c) = 0; set(handles.cdf.checkbox, 'Value', 0);
guidata(hObject, handles);
set(handles.ice, 'Pointer', 'watch');
graph(handles); render(handles);
set(handles.ice, 'Pointer', 'arrow');
•/, %
function slope_checkbox_Callback(hObject, eventdata, handles)
У, Accept slope clamp for currently selected color component and
У» draw function if smoothing is on.
if get(hObject, 'Value')
handles.siope(handles.cindex) = 1;
else
handles.slope(handles.cindex) = 0;
end
guidata(h0bject, handles);
if handles.smooth(handles.cindex)
set(handles.ice, 'Pointer', 'watch');
graph(handles); render(handles);
set(handles.ice, 'Pointer', 'arrow');
end
y. •/,
function resetall_pushbutton_Callback(hObject, eventdata, handles)
Ув Init display parameters for color components, make all maps 1:1,
Ув and redraw display,
for с = 1:4
handles.smooth(с) = 0; handles.slope(с) = 0;
handles.pdf(с) = 0; handles.cdf(с) = 0;
Б.2. Программируемый интерфейс ICE
handles = setfield(handles, ['set' num2str(c)], [0 0; 1 1]);
end
set(handles.smooth.checkbox, 'Value', 0);
set(handles.slope.checkbox, 'Value', 0);
set(handles.pdf_checkbox, 'Value', 0);
set(handles.cdf„checkbox, 'Value', 0);
guidata(h0bject, handles);
set(handles.ice, 'Pointer', 'watch');
graph(handles); render(handles);
set(handles.ice, 'Pointer', 'arrow');
y, •/,
function pdf_checkbox_Callback(hObject, eventdata, handles)
% Accept PDF (probability density function or histogram) display
e/e parameter for currently selected color component and redraw
7, mapping function if smoothing is on. If set, clear CDF display.
if get(hObject, 'Value')
handles.pdf(handles.cindex) = 1;
set(handles.cdf.checkbox, 'Value', 0);
handles.cdf(handles.cindex) = 0;
else
handles.pdf(handles.cindex) = 0;
end
guidata(hObject, handles); graph(handles);
•/. •/.
function cdf_checkbox_Callback(hObject, eventdata, handles)
7, Accept CDF (cumulative distribution function) display parameter
7e for selected color component and redraw mapping function if
7e smoothing is on. If set, clear CDF display.
if get(hObject, 'Value')
handles.cdf(handles.cindex) = 1;
set(handles.pdf.checkbox, 'Value', 0);
handles.pdf(handles.cindex) = 0;
else
handles.cdf(handles.cindex) = 0;
end
guidata(hObject, handles); graph(handles);
•/. 7,
function mapbar_checkbox_Callback(hObject, eventdata, handles)
7e Accept changes to bar map enable state and redraw bars.
handles.barmap = get(hObject, 'Value');
guidata(hObject, handles); render(handles);
% %
function mapimage_checkbox_Callback(hObject, eventdata, handles)
7e Accept changes to the image map state and redraw image,
handles.imagemap = get(hObject, 'Value');
guidata(hObject, handles); render(handles);
ПРИЛОЖЕНИЕ В
Введение
Это приложение содержит тексты всех М-функций, которые не были приведены
ранее в этой книге. Функции упорядочены по алфавиту. Первые строки каждой
функции набраны жирным шрифтом, что дает краткое описание функции, а
также помогает при поиске нужной функции.
function f = adpmedian(g, Smax)
%ADPMEDIAN Perform adaptive median filtering.
°/e F = ADPMEDIAN(G, SMAX) performs adaptive median filtering of
°/e image G. The median filter starts at size 3-by-3 and iterates up
°/e to size SMAX-by-SMAX. SMAX must be an odd integer greater than 1.
°/e SMAX must be an odd, positive integer greater than 1.
if (Smax <= 1) | (Smax/2 == round(Smax/2)) | (Smax ~= round(Smax))
error ('SMAX must be an odd integer > 1.')
end
[M, N] = size(g);
% Initial setup.
f = g;
f(:) = 0;
alreadyProcessed = false(size(g));
°/o Begin filtering.
for k = 3:2:Smax
zmin = ordfilt2(g, 1, ones(k, k), 'symmetric');
zmax = ordfilt2(g, k * k, ones(k, k), 'symmetric');
zmed = medfilt2(g, [k k] , 'symmetric');
processUsingLevelB = (zmed > zmin) & (zmax > zmed) & ...
"alreadyProcessed;
zB = (g > zmin) & (zmax > g) ;
outputZxy = processUsingLevelB & zB;
outputZmed = processUsingLevelB & ~zB;
f(outputZxy) = g(outputZxy);
f(outputZmed) = zmed(outputZmed);
alreadyProcessed = alreadyProcessed | processUsingLevelB;
if all(alreadyProcessed(:))
break;
end
end
°/o Output zmed for any remaining unprocessed pixels. Note that this
e/o zmed was computed using a window of size Smax-by-Smax, which is
Приложение В
7, the final value of к in the loop.
f (~alreadyProcessed) = zmed(~alreadyProcessed) ;
В
function rc_new = bound2eight(rc)
%BOUND2EIGHT Convert 4-connected boundary to 8-connected boundary.
e/o RC_NEW = B0UND2EIGHT(RC) converts a four-connected boundary to an
e/, eight-connected boundary. RC is a P-by-2 matrix, each row of
e/e which contains the row and column coordinates of a boundary
e/e pixel. RC must be a closed boundary; in other words, the last
e/o row of RC must equal the first row of RC. B0UND2EIGHT removes
7, boundary pixels that are necessary for four-connectedness but not
7e necessary for eight-connectedness. RC_NEW is a Q-by-2 matrix,
7e where Q <= P.
if ~isempty(rc) & ~isequal(rc(l, :), re(end, :))
error('Expected input boundary to be closed.');
end
if size(rc, 1) <= 3
7» Degenerate case.
rc_new = re;
return;
end
7o Remove last row, which equals the first row.
rc_new = rc(lrend - 1, :);
% Remove the middle pixel in four-connected right-angle turns. We
7e can do this in a vectorized fashion, but we can't do it all at
7e once. Similar to the way the 'thin' algorithm works in bwmorph,
7e we'll remove first the middle pixels in four-connected turns where
7e the row and column are both even; then the middle pixels in all
7o the remaining four-connected turns where the row is even and the
7o column is odd; then again where the row is odd and the column is
7e even; and finally where both the row and column are odd.
remove.locations = compute_remove_locations(rc_new);
fieldl = remove_locations к (rem(rc_new(:, 1), 2) ==0) & ...
(rem(rc_new(:, 2), 2) == 0);
rc_new(fieldl, :)=[];
remove.locations = compute_remove_locations(rc_new);
field2 = remove.locations & (rem(rc_new(:, 1), 2) ==0) & ...
(rem(rc_new(:, 2), 2) == 1);
rc_new(field2, :)=[];
remove_loсations = compute_remove_locations(rc_new);
field3 = remove_locations & (rem(rc_new(:, 1), 2) == 1) & ...
(rem(rc_new(:, 2), 2) == 0);
Приложение В
rc_new(field3, :) = [];
remove_locations = compute_remove_locations(rc_new);
field4 = remove_locations & (rem(rc_new(:, 1), 2) ==1) & ...
(rem(rc_new(:, 2), 2) == 1);
rc_new(field4, :) = [];
°/o Make the output boundary closed again.
rc_new = [rc_new; rc__new(l, :)];
% •/,
function remove = compute_remove_locations(rc)
°/o Circular diff.
d = [rcB:end, :); rc(l, :)] - re;
°/o Dot product of each row of d with the subsequent row of d,
7e performed in circular fashion.
dl = [dB:end, :); d(l, :)] ;
dotprod = sum(d .* dl, 2);
°/e Locations of N, S, E, and W transitions followed by
°/o a right-angle turn.
remove = ~all(d, 2) & (dotprod == 0);
% But we really want to remove the middle pixel of the turn.
remove = [remove(end, :); removed:end - 1, :)];
if ~any(remove)
done = 1;
else
idx = find(remove);
rc(idx(l), :) = [];
end
function rc_new = bound2four(rc)
%BOUND2FOUR Convert 8-connected boundary to 4-connected boundary.
°/o RC.NEW = B0UND2F0UR(RC) converts an eight-connected boundary to a
°/o four-connected boundary. RC is a P-by-2 matrix, each row of
7, which contains the row and column coordinates of a boundary
% pixel. B0UND2F0UR inserts new boundary pixels wherever there is
% a diagonal connection.
if size(rc, 1) > 1
% Phase 1: remove diagonal turns, one at a time until they are
°/e all gone.
done = 0;
rcl = [re(end - 1, :); re];
while ~done
d = diff(rcl, 1);
diagonal_locations = all(d, 2);
double_diagonals = diagonal_locations(l:end - 1) & ...
(diff(diagonal_locations, 1) == 0);
double_diagonal_idx = find(double_diagonals);
turns = any(d(double_diagonal_idx, :) ~= ...
Приложение В
d(double_diagonal_idx + 1, :), 2);
turns.idx = double_diagonal_idx(turns);
if isempty(turns_idx)
done = 1;
else
first.turn = turns_idx(l);
rcl(first_turn + 1, :) = (rcl(first.turn, :)+...
rcl(first„turn + 2, :)) / 2;
if first_turn == 1
rcl(end, :) = rclB, :);
end
end
end
rcl = rclB:end, :) ;
end
У, Phase 2: insert extra pixels where there are diagonal connections.
rowdiff = diff(rcl(:, 1));
coldiff = diff(rcl(:, 2));
diagonal.locations = rowdiff & coldiff;
num_old_pixels = size(rcl, 1);
num_new_pixels = num_old_pixels + sum(diagonal_locations);
rc_new = zeros(num_new_pixels, 2);
У, Insert the original values into the proper locations in the new RC
У. matrix.
idx = A:num_old_pixels)' + [0; cumsum(diagonal ..locations)];
rc_new(idx, :) = rcl;
У, Compute the new pixels to be inserted.
new_pixel_offsets = [0 1; -1 0; 1 0; 0 -1];
offset_codes = 2 * A - (coldiff(diagonal.locations) + l)/2) + ...
B - (rowdiff(diagonal.locations) + l)/2);
new_pixels = rcl(diagonal_locations, :) + ...
new_pixel_offsets(offset_codes, :);
Ув Where do the new pixels go?
insertion_locations = zeros(num_new_pixels, 1);
insertion_locations(idx) = 1;
insertion_locations = ~insertion_locations;
У, Insert the new pixels.
rc_new(insertion_locations, :) = new_pixels;
function В = bound2im(b, M, N, xO, yO)
%BOUND2IM Converts a boundary to an image.
Ув В = B0UND2IM(b) converts b, an np-by-2 or 2-by-np array
Ув representing the integer coordinates of a boundary, into a binary
Ув image with Is in the locations defined by the coordinates in b
Ув and 0s elsewhere.
У.
Прилоэюение В
Уо В = B0UND2IM(b, M, N) places the boundary approximately centered
°/o in an M-by-N image. If any part of the boundary is outside the
°/o M-by-N rectangle, an error is issued.
•/•
Уо В = B0UND2IM(b, M, N, XO, YO) places the boundary in an image of
Уо size M-by-N, with the topmost boundary point located at XO and
У» the leftmost point located at YO. If the shifted boundary is
°/o outside the M-by-N rectangle, an error is issued. XO and XO must
У» be positive integers.
[np, nc] = size(b);
if np < nc
b = b'; У» To convert to size np-by-2.
[np, nc] = size(b);
end
Уо Make sure the coordinates are integers.
x = round(b(:, 1));
у = round(b(:,2));
°/o Set up the default size parameters.
x = x - min(x) + 1;
у = у - min(y) + 1;
В = false(max(x), max(y));
С = max(x) - min(x) + 1;
D = max(y) - min(y) + 1;
if nargin == 1
Уо Use the preceding default values.
elseif nargin == 3
if С > M | D > N
error('The boundary is outside the M-by-N region.')
end
Уо The image size will be M-by-N. Set up the parameters for this.
В = false(M, N);
°/o Distribute extra rows approx. even between top and bottom.
NR = round((M - C)/2);
NC = round((N - D)/2); У, The same for columns.
x = x + NR; У» Offset the boundary to new position.
у = у + NC;
elseif nargin == 5
if xO < 0 | yO < 0
error('xO and yO must be positive integers.')
end
x = x + round(xO) - 1;
у = у + round(yO) - 1;
С = С + xO - 1;
D = D + yO - 1;
if С > M I D > N
Приложение В
error('The shifted boundary is outside the M-by-N region.')
end
В = false(M, N);
else
error('Incorrect number of inputs.')
end
B(sub2ind(size(B), x, y)) = true;
function В = boundaries (В W, conn, dir)
%BOUNDARIES Trace object boundaries.
e/0 В = BOUNDARIES(BW) traces the exterior boundaries of objects in
У. the binary image BW. В is a P-by-1 cell array, where P is the
7e number of objects in the image. Each cell contains a Q-by-2
7, matrix, each row of which contains the row and column coordinates
°/o of a boundary pixel. Q is the number of boundary pixels for the
°/e corresponding object. Object boundaries are traced in the
°/e clockwise direction.
У.
°/« В = BOUNDARIES (BW, CONN) specifies the connectivity to use when
°/e tracing boundaries. CONN may be either 8 or 4. The default
У. value for CONN is 8.
У.
У, В = BOUNDARIES (BW, CONN, DIR) specifies the direction used for
7o tracing boundaries. DIR should be either 'cw' (trace boundaries
7e clockwise) or 'ccw' (trace boundaries counterclockwise). If DIR
7e is omitted BOUNDARIES traces in the clockwise direction.
if nargin < 3
dir = 'cw';
end
if nargin < 2
conn = 8;
end
L = bwlabel(BW, conn);
7e The number of objects is the maximum value of L. Initialize the
7e cell array В so that each cell initially contains a 0-by-2 matrix.
numObjects = max(L(:));
if numObjects > 0
В = {zeros@, 2)};
В = repmat(B, numObjects, 1);
else
В = О;
end
У, Pad label matrix with zeros. This lets us write the
У, boundary-following loop without worrying about going off the edge
'/• of the image.
Lp = padarray(L, [1 1], 0, 'both');
576 Приложение В
Ус Compute the linear indexing offsets to take us from a pixel to its
°/o neighbors.
M = size(Lp, 1);
if conn == 8
У. Order is N NE E SE S SW W NW.
offsets = [-1, M - 1, M, M + 1, 1, -M + 1, -M, -M-l];
else
% Order is N E S W.
offsets = [-1, M, 1, -M];
end
°/0 next_search_direction_lut is a lookup table. Given the direction
°/0 from pixel к to pixel k+1, what is the direction to start with when
7e examining the neighborhood of pixel k+1?
if conn == 8
next_search_direction_lut = [8 822446 6];
else
next_search_direction_lut = [4123];
end
°/0 next_direction_lut is a lookup table. Given that we just looked at
°/0 neighbor in a given direction, which neighbor do we look at next?
if conn == 8
next_direction_lut = [2 345678 1];
else
next_direction_lut = [2341];
end
7e Values used for marking the starting and boundary pixels.
START = -1;
BOUNDARY = -2;
7o Initialize scratch space in which to record the boundary pixels as
°/e well as follow the boundary.
scratch = zerosA00, 1);
°/0 Find candidate starting locations for boundaries.
[rr, cc] = find((LpB:end-l, :) > 0) & (Lp(l:end-2, :) == 0));
rr = rr + 1;
for к = 1:length(rr)
r = rr(k);
с = cc(k);
if (Lp(r,c) > 0) & (Lp(r - 1, c) == 0) & isempty(B{Lp(r, c)})
°/o We've found the start of the next boundary. Compute its
% linear offset, record which boundary it is, mark it, and
°/0 initialize the counter for the number of boundary pixels.
idx = (c-l)*size(Lp, 1) + r;
which = Lp(idx);
scratch(l) = idx;
Lp(idx) = START;
numPixels = 1;
Приложение В
currentPixel = idx;
initial_departure_direction = [] ;
done = 0;
next_search_direction = 2;
while ~done
У, Find the next boundary pixel.
direction = next_search_direction;
found_next_pixel = 0;
for к = l:length(offsets)
neighbor = currentPixel + offsets(direction);
if Lp(neighbor) ~= 0
У« Found the next boundary pixel.
if (Lp(currentPixel) == START) & ...
isempty(initial_departure_direction)
У« We are making the initial departure from
У, the starting pixel.
initial_departure_direction = direction;
elseif (Lp(currentPixel) == START) & ...
(initial_departure_direction == direction)
У, We are about to retrace our path.
e/e That means we're done.
done = 1;
found_next_pixel = 1;
break;
end
7e Take the next step along the boundary.
next_search_direction = ...
next_search_direction_lut(direction);
found_next.pixel = 1;
numPixels = numPixels + 1;
if numPixels > size(scratch, 1)
У, Double the scratch space.
scratchB*size(scratch, 1)) = 0;
end
scratch(numPixels) = neighbor;
if Lp(neighbor) ~= START
Lp(neighbor) = BOUNDARY;
end
currentPixel = neighbor;
break;
end
direction = next_direction_lut(direction);
end
if ~found_next_pixel
У, If there is no next neighbor, the object must just
Ув have a single pixel.
Приложение В
numPixels = 2;
scratchB) = scratch(l);
done = 1;
end
end
У, Convert linear indices to row-column coordinates and save
У» in the output cell array.
[row, col] = ind2sub(size(Lp) , scratchd :numPixels));
B{which} = [row - 1, col - 1];
end
end
if strcmp(dir, 'ccw')
for к = l:length(B)
B{k} = B{k}(end:-l:l, :);
end
end
function [s, su] = bsubsamp(b, gridsep)
%BSUBSAMP Subsample a boundary.
У. [S, SU] = BSUBSAMP(B, GRIDSEP) subsamples the boundary В by
У, assigning each of its points to the grid node to which it is
У. closest. The grid is specified by GRIDSEP, which is the
54 separation in pixels between the grid lines. For example, if
54 GRIDSEP = 2, there are two pixels in between grid lines. So, for
У, instance, the grid points in the first row would be at A,1),
°/, A,4), A,6), ..., and similarly in the у direction. The value
У, of GRIDSEP must be an even integer. The boundary is specified by
У, a set of coordinates in the form of an np-by-2 array. It is
Ув assumed that the boundary is one pixel thick.
У.
Ув Output S is the subsampled boundary. Output SU is normalized so
Ув that the grid separation is unity. This is useful for obtaining
Ув the Freeman chain code of the subsampled boundary.
Ув Check input.
[np, nc] = size(b);
if np < nc
error('B must be of size np-by-2.');
end
if gridsep/2 ~= round(gridsep/2)
error('GRIDSEP must be an even integer.')
end
У, Some boundary tracing programs, such as boundaries.m, end with
У, the beginning, resulting in a sequence in which the coordinates
Ув of the first and last points are the same. If this is the case
У» in b, eliminate the last point.
if isequal(b(l, :), b(np, :))
Приложение В
np = np - 1;
Ъ = ЪA:пр, :);
end
e/e Find the max x and у spanned by the boundary.
xmax = max(b(:, 1));
ymax = max(b(:, 2));
7e Determine the number of grid lines with gridsep points in
e/e between them that can fit in the intervals [l,xmax], [l,ymax],
7e without any points in b being left over. If points are left
7o over, add zeros to extend xmax and ymax so that an integral
У, number of grid lines are obtained.
e/. Size needed in the x-direction:
L = gridsep + 1;
n = ceil(xmax/L);
T = (n - 1)*L + 1;
7e Zx is the number of zeros that would be needed to have grid
°/e lines without any points in b being left over.
Zx = abs(xmax - T - L);
if Zx == L
Zx = 0;
end
7, Number of grid lines in the x-direction, with L pixel spaces
7e in between each grid line.
GLx = (xmax + Zx - 1)/L + 1;
7e And for the y-direction:
n = ceil(ymax/L);
T = (n - 1)*L + 1;
Zy = abs(ymax - T - L);
if Zy == L
Zy = 0;
end
GLy = (ymax + Zy - 1)/L + 1;
7e Form vectors of x and у grid locations.
I = l:GLx;
7e Vector of grid line locations intersecting x-axis.
X(I) = gridsep*I + (I - gridsep);
J = l:GLy;
7e Vector of grid line locations intersecting y-axis.
Y(J) = gridsep*J + (J - gridsep);
7e Compute both components of the cityblock distance between each
7e element of b and all the grid-line intersections. Assign each
7o point to the grid location for which each comp of the cityblock
7o distance was less than gridsep/2. Because gridsep is an even
7e integer, these assignments are unique. Note the use of meshgrid to
7e optimize the code.
DIST = gridsep/2;
Приложение В
[XG, YG] = meshgrid(X, Y);
Q = 1;
for k=l:np
[I,J] = find(abs(XG - b(k, 1)) <= DIST & abs(YG - b(k, 2)) <= . . .
DIST);
IL = length(I);
ord = k*ones(IL, 1); °/e To keep track of order of input coordinates
К = Q + IL - 1;
dl(Q:K, :) = catB, X(I), ord);
d2(Q:K, :) = catB, Y(J), ord);
Q = К + 1;
end
°/o d is the set of points assigned to the new grid with line
°/e separation of gridsep. Note that it is formed as d=(d2,dl) to
У, compensate for the coordinate transposition inherent in using
°/e meshgrid (see Chapter 2) .
d = catB, d2(:, 1), dl) ; °/e The second column of dl is ord.
e/e Sort the points using the values in ord, which is the last col in
e/o d.
d = fliplr(d); % So the last column becomes first.
d = sortrows(d);
d = fliplr(d); % Flip back.
°/e Eliminate duplicate rows in the first two components of
°/e d to create the output. The cw or ccw order MUST be preserved.
s = d(:, 1:2);
[s, m, n] = unique(s, 'rows');
e/e Function unique sorts the data-Restore to original order
e/o by using the contents of m.
s = [s, m] ;
s = fliplr(s);
s = sortrows(s);
s = fliplr(s);
s = s(:, 1:2);
°/o Scale to unit grid so that can use directly to obtain Freeman
°/e chain code. The shape does not change.
su = round(s./gridsep) + 1;
function image = changeclass(class, varargin)
%CHANGECLASS changes the storage class of an image.
У. 12 = CHANGECLASS (CLASS, I);
У. RGB2 = CHANGECLASS (CLASS, RGB);
У. BW2 = CHANGECLASS (CLASS, BW) ;
Приложение В
7. Х2 = CHANGECLASS(CLASS, X, 'indexed');
У, Copyright 1993-2002 The MathWorks, Inc. Used with permission.
7, SRevision: 1.2 $ $Date: 2003/02/19 22:09:58 $
switch class
case 'uint8'
image = im2uint8(varargin{:});
case 'uintl6'
image = im2uint16(varargin{:});
case 'double'
image = im2double(varargin{:});
otherwise
error('Unsupported IPT data class.');
end
function [VG, A, PPG]= colorgrad(f, T)
%COLORGRAD Computes the vector gradient of an RGB image.
7. [VG, VA, PPG] = C0L0RGRAD(F, T) computes the vector gradient, VG,
e/0 and corresponding angle array, VA, (in radians) of RGB image
e/e F. It also computes PPG, the per-plane composite gradient
e/e obtained by summing the 2-D gradients of the individual color
e/, planes. Input T is a threshold in the range [0, 1] . If it is
e/e included in the argument list, the values of VG and PPG are
7e thresholded by letting VG(x,y) = 0 for values <= T and VG(x,y) =
7, VG(x,y) otherwise. Similar comments apply to PPG. If T is not
e/e included in the argument list then T is set to 0. Both output
7, gradients are scaled to the range [0, 1].
if (ndims(f) ~= 3) | (size(f, 3) ~= 3)
error('Input image must be RGB.');
end
7e Compute the x and у derivatives of the three component images
7e using Sobel operators.
sh = fspecial('sobel');
sv = sh';
Rx = imfilter(double(f(:
Ry = imfilter(double(f(:
Gx = imfilter(double(f(:
Gy = imfilter(double(f(:
Bx = imfilter(double(f(:
By = imfilter(double(f(:
1)), sh, 'replicate');
D), sv, 'replicate');
2)), sh, 'replicate');
2)), sv, 'replicate');
3)), sh, 'replicate');
3)), sv, 'replicate');
7e Compute the parameters of the vector gradient.
gxx = Rx.~2 + Gx.~2 + Bx.~2;
gyy = Ry.~2 + Gy.~2 + By.~2;
gxy = Rx.*Ry + Gx.*Gy + Bx.*By;
A = 0.5*(atanB*gxy./(gxx - gyy + eps)));
Gl = 0.5*((gxx + gyy) + (gxx - gyy).*cosB*A) + 2*gxy.*sinB*A));
7, Now repeat for angle + pi/2. Then select the maximum at each point.
Приложение В
А = А + pi/2;
G2 = 0.5*((gxx + gyy) + (gxx - gyy).*cosB*A) + 2*gxy.*sinB*A));
Gl = Gl.~0.5;
G2 = G2.~0.5;
e/e Form VG by picking the maximum at each (x,y) and then scale
e/, to the range [0, 1] .
VG = mat2gray(max(Gl, G2));
У, Compute the per-plane gradients.
RG = sqrt(Rx.~2 + Ry.~2);
GG = sqrt(Gx.~2 + Gy.~2);
BG = sqrt(Bx.~2 + By.~2);
У, Form the composite by adding the individual results and
e/e scale to [0, 1] .
PPG = mat2gray(RG + GG + BG);
У, Threshold the result.
if nargin == 2
VG = (VG > T).*VG;
PPG = (PPG > T).*PPG;
end
function I = colorseg(varargin)
%COLORSEG Performs segmentation of a color image.
e/e S = COLORSEG('EUCLIDEAN', F, T, M) performs segmentation of color
e/e image F using a Euclidean measure of similarity. M is a l-by-3
e/e vector representing the average color used for segmentation (this
У, is the center of the sphere in Fig. 6.26 of DIPUM) . T is the
Ув threshold against which the distances are compared.
°/o
% S = COLORSEG('MAHALANOBIS', F, T, M, C) performs segmentation of
У» color image F using the Mahalanobis distance as a measure of
Ув similarity. С is the 3-by-3 covariance matrix of the sample color
°/e vectors of the class of interest. See function covmatrix for the
У, computation of С and M.
У.
Ув S is the segmented image (a binary matrix) in which 0s denote the
°/e background.
Ув Preliminaries.
°/e Recall that varargin is a cell array.
f = varargin{2};
if (ndims(f) ~= 3) | (size(f, 3) ~= 3)
error('Input image must be RGB.>);
end
M = size(f, 1); N = size(f, 2);
У, Convert f to vector format using function imstack2vectors.
[f, L] = imstack2vectors(f);
f = double(f);
Приложение В
У, Initialize I as a column vector. It will be reshaped later
У, into an image.
I = zeros(M*N, 1);
T = varargin{3};
m = varargin{4};
m = m(:)'; e/e Make sure that m is a row vector.
if length(varargin) == 4
method = 'euclidean';
elseif length(varargin) == 5
method = 'mahalanobis';
else
error('Wrong number of inputs.');
end
switch method
case 'euclidean'
% Compute the Euclidean distance between all rows of X and m. See
°/e Section 12.2 of DIPUM for an explanation of the following
У, expression. D(i) is the Euclidean distance between vector X(i,:)
У, and vector m.
p = length(f);
D = sqrt(sum(abs(f - repmat(m, p, 1)).~2, 2));
case 'mahalanobis'
С = varargin{5};
D = mahalanobis(f, C, m);
otherwise
error('Unknown segmentation method.')
end
У, D is a vector of size MN-by-1 containing the distance computations
Ув from all the color pixels to vector m. Find the distances <= T.
J = find(D <= T);
Ув Set the values of I(J) to 1. These are the segmented
У, color pixels.
KJ) = 1;
У, Reshape I into an M-by-N image.
I = reshaped, M, N);
function с = connectpoly(x, y)
%CONNECTPOLY Connects vertices of a polygon.
У, С = C0NNECTP0LY(X, Y) connects the points with coordinates given
У, in X and Y with straight lines. These points are assumed to be a
Ув sequence of polygon vertices organized in the clockwise or
Ув counterclockwise direction. The output, C, is the set of points
У, along the boundary of the polygon in the form of an nr-by-2
Ув coordinate sequence in the same direction as the input. The last
Ув point in the sequence is equal to the first.
v = [x(:), y(:)];
584 Приложение В
Уо Close polygon.
if ~isequal(v(end, :), v(l, :))
v(end + 1, :) = v(l, :);
end
°/o Connect vertices.
segments = cell(l, length(v) - 1);
for I = 2:length(v)
[x, y] = intline(v(I - 1, 1), v(I, 1), v(I - 1, 2), v(I, 2));
segments{I - 1} = [x, y] ;
end
с = cat(l, segments{:});
D
function s = diameter(L)
%DIAMETER Measure diameter and related properties of image regions.
7o S = DIAMETER(L) computes the diameter, the major axis endpoints,
°/0 the minor axis endpoints, and the basic rectangle of each labeled
°/o region in the label matrix L. Positive integer elements of L
°/0 correspond to different regions. For example, the set of elements
°/0 of L equal to 1 corresponds to region 1; the set of elements of L
°/e equal to 2 corresponds to region 2; and so on. S is a structure
°/0 array of length max(L(:)). The fields of the structure array
°/0 include:
°/o
°/o Diameter
°/o Major Ax is
7e Minor Axis
°/o BasicRectangle
°/o
°/0 The Diameter field, a scalar, is the maximum distance between any
% two pixels in the corresponding region.
1
°/0 The MajorAxis field is a 2-by-2 matrix. The rows contain the row
°/0 and column coordinates for the endpoints of the major axis of the
°/0 corresponding region.
°/o
°/0 The MinorAxis field is a 2-by-2 matrix. The rows contain the row
°/0 and column coordinates for the endpoints of the minor axis of the
°/o corresponding region.
7.
°/0 The BasicRect angle field is a 4-by-2 matrix. Each row contains
°/0 the row and column coordinates of a corner of the
°/e region-enclosing rectangle defined by the major and minor axes.
Приложение В
У,
°/о For more information about these measurements, see Section 11.2.1
7o of Digital Image Processing, by Gonzalez and Woods, 2nd edition,
7, Prentice Hall.
s = regionprops(L, {'Image', 'BoundingBox'});
for к = l:length(s)
[s(k).Diameter, s(k).MajorAxis, perim_r, perim_c] = ...
compute_diameter(s(k));
[s(k).BasicRectangle, s(k).MinorAxis] = ...
compute_basic_rectangle(s(k), perim_r, perim_c);
end
function [d, majoraxis, r, c] = compute_diameter(s)
7, [D, MAJORAXIS, R, C] = COMPUTE_DIAMETER(S) computes the diameter
У, and major axis for the region represented by the structure S. S
7o must contain the fields Image and BoundingBox. COMPUTE.DIAMETER
7o also returns the row and column coordinates (R and C) of the
°/o perimeter pixels of s. Image.
7e Compute row and column coordinates of perimeter pixels.
[r, c] = find(bwperim(s.Image));
r = r(:);
с = c(:);
[rp, cp] = prune_pixel_list(r, c);
num__pixels = length (rp) ;
switch num_pixels
case 0
d = -Inf;
majoraxis = onesB, 2);
case 1
d = 0;
majoraxis = [rp cp; rp cp];
case 2
d = (rpB) - rp(l))~2 + (cpB) - cp(l))~2;
majoraxis = [rp cp];
otherwise
7e Generate all combinations of l:num_pixels taken two at at time.
У, Method suggested by Peter Acklam.
[idx(:, 2) idx(:, 1)] = find(tril(ones(num_pixels), -1));
rr = rp(idx);
cc = cp(idx);
dist.squared = (rr(:, 1) - rr(:, 2)).~2+ ...
(cc(:, 1) - cc(: , 2)).~2;
[max_dist_squared, idx] = max(dist_squared);
majoraxis = [rr(idx,:)' cc(idx,:)'];
d = sqrt(max_dist_squared);
upper.image_row = s.BoundingBoxB) + 0.5;
Приложение В
left_image_col = s.BoundingBox(l) + 0.5;
majoraxis(:, 1) = majoraxisd, 1) + upper_image_row - 1;
majoraxis(:, 2) = majoraxis(:, 2) + left_image_col - 1;
end
function [basicrect, minoraxis] = compute_basic_rectangle(s, ...
perim_r, perim_c)
°/o [BASICRECT,MINORAXIS] = COMPUTE_BASIC_RECTANGLE(S, PERIM.R,
°/e PERIM_C) computes the basic rectangle and the minor axis
e/o end-points for the region represented by the structure S. S must
e/o contain the fields Image, BoundingBox, Major Axis, and
7e Diameter. PERIM_R and PERIM_C are the row and column coordinates
% of perimeter of s.Image. BASICRECT is a 4-by-2 matrix, each row
7o of which contains the row and column coordinates of one corner of
°/e the basic rectangle.
e/e Compute the orientation of the major axis.
theta = atan2(s. Major Axis B, 1) - s.MajorAxisd, 1), ...
s. Major Axis B, 2) - s.MajorAxisd, 2));
°/e Form rotation matrix.
T = [cos(theta) sin(theta); -sin(theta) cos(theta)];
°/e Rotate perimeter pixels.
p = [perim_c perim_r];
P = P * T>;
'/. Calculate minimum and maximum x- and y-coordinates for the rotated
7, perimeter pixels.
x = p(:, 1);
У = p(:, 2);
min_x = min(x);
max_x = max(x);
min_y = min(y);
max_y = max(y);
corners_x = [min_x max_x max_x min_x]';
corners_y = [min_y min_y max_y max_y]';
e/e Rotate corners of the basic rectangle.
corners = [corners_x corners_y] * T;
°/o Translate according to the region's bounding box.
upper.image_row = s.BoundingBoxB) + 0.5;
left_image_col = s.BoundingBoxA) + 0.5;
basicrect = [cornersd, 2) + upper.image_row - 1, ...
corners(:, 1) + left_image_col - 1];
e/e Compute minor axis end-points, rotated.
x = (min_x + max_x) / 2;
yl = min_y;
y2 = max_y;
endpoints = [x yl; x y2];
Ус Rotate minor axis end-points back.
Приложение В
endpoints = endpoints * Т;
°/e Translate according to the region's bounding box.
minoraxis = [endpoints(:, 2) + upper.image_row - 1, ...
endpoints(:, 1) + left_image_col - 1];
•/. %
function [r, c] = prune_pixel_list (r, c)
*/• [R, C] = PRUNE_PIXEL_LIST(R, C) removes pixels from the vectors
% R and С that cannot be endpoints of the major axis. This
У, elimination is based on geometrical constraints described in
e/o Russ, Image Processing Handbook, Chapter 8.
top = min(r);
bottom = max(r);
left = min(c);
right = max(c);
7o Which points are inside the upper circle?
x = (left + right)/2;
У = top;
radius = bottom - top;
inside_upper = ( (c - x).~2 + (r - y).~2 ) < radius~2;
7o Which points are inside the lower circle?
у = bottom;
inside_lower = ( (c - x).~2 + (r - y).~2 ) < radius~2;
7o Which points are inside the left circle?
x = left;
у = (top + bottom)/2;
radius = right - left;
inside.left = ( (c - x).~2 + (r - y).~2 ) < radius~2;
7e Which points are inside the right circle?
x = right;
inside.right = ( (c - x).~2 + (r - y).~2 ) < radius~2;
7o Eliminate points that are inside all four circles.
delete.idx = find(inside_left & inside_right & ...
inside.upper & inside.lower);
r(delete_idx) = [] ;
c(delete_idx) = [] ;
function с = fchcode(b, conn, dir)
%FCHCODE Computes the Freeman chain code of a boundary.
°/e С = FCHCODE(B) computes the 8-connected Freeman chain code of a
e/e set of 2-D coordinate pairs contained in B, an np-by-2 array. С
7e is a structure with the following fields:
7e c.fcc = Freeman chain code A-by-np)
588 Приложение В
W
% c.diff = First difference of code c.fcc A-by-np)
e/o c.nun = Integer of minimum magnitude from c.fcc A-by-np)
e/e c.diff mm = First difference of code c.mm A-by-np)
e/e c.xOyO = Coordinates where the code starts (l-by-2)
Уо
e/e С = FCHC0DE(B, CONN) produces the same outputs as above, but
У, with the code connectivity specified in CONN. CONN can be 8 for
Ув an 8-connected chain code, or CONN can be 4 for a 4-connected
У, chain code. Specifying C0NN=4 is valid only if the input
У, sequence, B, contains transitions with values 0, 2, 4, and 6,
У, exclusively.
'/•
Ув С = FHC0DE(B, CONN, DIR) produces the same outputs as above, but,
Ув in addition, the desired code direction is specified. Values for
У, DIR can be:
У.
У. 'same' Same as the order of the sequence of points in b.
У, This is the default.
У.
У, 'reverse' Outputs the code in the direction opposite to the
У, direction of the points in B. The starting point
Ув for each DIR is the same.
У.
У, The elements of В are assumed to correspond to a 1-pixel-thick,
У, fully-connected, closed boundary. В cannot contain duplicate
У, coordinate pairs, except in the first and last positions, which
У, is a common feature of boundary tracing programs.
У.
Ув FREEMAN CHAIN CODE REPRESENTATION
Ув The table on the left shows the 8-connected Freeman chain codes
Ув corresponding to allowed deltax, deltay pairs. An 8-chain is
У, converted to a 4-chain if A) if conn = 4; and B) only
У, transitions 0, 2, 4, and 6 occur in the 8-code. Note that
Ув dividing 0, 2, 4, and 6 by 2 produce the 4-code.
У.
У, deltax | deltay | 8-code corresp 4-code
У. 0 1 0 0
°/. -1 1 1
У. -10 2 1
'/• -1 -1 3
Ув 0-142
У. 1 -1 5
У. 1 0 6 3
Уо 1 1 7
Приложение В
У,
% The formula z = 4*(deltax + 2) + (deltay + 2) gives the following
% sequence corresponding to rows 1-8 in the preceding table: z =
7o 11,7,6,5,9,13,14,15. These values can be used as indices into the
°/o table, improving the speed of computing the chain code. The
7e preceding formula is not unique, but it is based on the smallest
°/o integers D and 2) that are powers of 2.
°/e Preliminaries.
if nargin == 1
dir = 'same';
conn = 8;
elseif nargin == 2
dir = 'same';
elseif nargin == 3
°/0 Nothing to do here.
else
error('Incorrect number of inputs.')
end
[np, nc] = size(b);
if np < nc
error('B must be of size np-by-2.');
end
°/e Some boundary tracing programs, such as boundaries.m, output a
°/o sequence in which the coordinates of the first and last points are
7o the same. If this is the case, eliminate the last point.
if isequal(b(l, :), b(np, :))
np = np - 1;
b = b(l:np, :);
end
°/o Build the code table using the single indices from the formula
% for z given above:
C(ll)=0; CG)=l; CF)=2; CE)=3; C(9)=4;
CA3)=5; CA4)=6; CA5)=7;
°/o End of Preliminaries.
°/o Begin processing.
xO = b(l, 1);
yO = b(l,,2);
с.xOyO = [xO, yO];
°/o Make sure the coordinates are organized sequentially:
°/o Get the deltax and deltay between successive points in b. The
% last row of a is the first row of b.
a = circshift(b, [-1, 0]);
% DEL = a - b is an nr-by-2 matrix in which the rows contain the
°/o deltax and deltay between successive points in b. The two
°/0 components in the kth row of matrix DEL are deltax and deltay
У. between point (xk, yk) and (xk+1, yk+1) . The last row of DEL
Приложение В
°/о contains the deltax and deltay between (xnr, ynr) and (xl, yl) ,
7o (i.e., between the last and first points in b) .
DEL = a - b;
°/e If the abs value of either (or both) components of a pair
e/e (deltax, deltay) is greater than 1, then by definition the curve
°/o is broken (or the points are out of order), and the program
°/o terminates.
if any(abs(DEL(:, 1)) > 1) | any(abs(DEL(:, 2)) > 1);
error('The input curve is broken or points are out of order.')
end
°/o Create a single index vector using the formula described above.
z = 4*(DEL(:, 1) + 2) + (DEL(:, 2) +2);
°/e Use the index to map into the table. The following are
°/o the Freeman 8-chain codes, organized in a 1-by-np array.
fee = C(z);
°/e Check if direction of code sequence needs to be reversed.
if strcmp(dir, 'reverse')
fee = coderev(fcc) ; 7e See below for function coderev.
end
°/0 If 4-connectivity is specified, check that all components
°/o of fee are 0, 2, 4, or 6.
if conn == 4
val = find(fcc == 1 | fcc == 3 | fee == 5 | fee ==7 ) ;
if isempty(val)
fee = fee./2;
else
warningCThe specified 4-connected code cannot be satisfied.')
end
end
°/e Freeman chain code for structure output.
c.fcc = fee;
°/o Obtain the first difference of fee.
c.diff = codediff (fee, conn) ; °/0 See below for function codedif f.
°/e Obtain code of the integer of minimum magnitude.
c.mm = minmag(fcc); °/0 See below for function minmag.
°/o Obtain the first difference of fee
c.diffmm = codediff(c.mm, conn);
•/, •/,
function cr = coderev(fcc)
7e Traverses the sequence of 8-connected Freeman chain code fee in
У, the opposite direction, changing the values of each code
'/. segment. The starting point is not changed, fee is a 1-by-np
°/o array.
% Flip the array left to right. This redefines the starting point
% as the last point and reverses the order of >travel> through the
°/o code.
Приложение В
cr = fliplr(fcc);
7о Next, obtain the new code values by traversing the code in the
°/e opposite direction. @ becomes 4, 1 becomes 5, ... , 5 becomes 1,
°/o 6 becomes 2, and 7 becomes 3).
indl = find@ <= cr & cr <= 3);
ind2 = findD <= cr & cr <= 7);
cr(indl) = cr(indl) + 4;
cr(ind2) = cr(ind2) - 4;
•/. %
function z = minmag(c)
°/0MINMAG Finds the integer of minimum magnitude in a chain code.
°/o Z = MINMAG(C) finds the integer of minimum magnitude in a given
7o 4- or 8-connected Freeman chain code, C. The code is assumed to
°/o be a 1-by-np array.
7o The integer of minimum magnitude starts with min(c) , but there
°/0 may be more than one such value. Find them all,
I = find(c == min(c));
°/o and shift each one left so that it starts with min(c) .
J = 0;
A = zeros(length(I), length(c));
for к = I;
J = J + 1;
A(J, :) = circshift(c, [0 -(k-1)]);
end
°/o Matrix A contains all the possible candidates for the integer of
°/e minimum magnitude. Starting with the 2nd column, succesively find
°/o the minima in each column of A. The number of candidates decreases
7o as the seach moves to the right on A. This is reflected in the
°/0 elements of J. When length(J)=l, one candidate remains. This is
°/0 the integer of minimum magnitude.
[M, N] = size(A);
J = A:M)';
for к = 2:N
DA:M, 1) = Inf;
D(J, 1) = A(J, k);
amin = min(A(J, k));
J = find(D(:, 1) == amin);
if length(J)==l
z = A(J, :);
return
end
end
•/. 1
function d = codediff(fcc, conn)
VoCODEDIFF Computes the first difference of a chain code.
°/, D = CODEDIFF(FCC) computes the first difference of code, FCC. The
Приложение В
Ус code FCC is treated as a circular sequence, so the last element
% of D is the difference between the last and first elements of
% FCC. The input code is a 1-by-np vector.
У.
У, The first difference is found by counting the number of direction
У, changes (in a counter-clockwise direction) that separate two
У, adjacent elements of the code.
sr = circshift(fcc, [0, -1]); У, Shift input left by 1 location.
delta = sr - fee;
d = delta;
I = find(delta < 0);
type = conn;
switch type
case 4 e/e Code is 4-connected
d(I) = d(I) + 4;
case 8 У, Code is 8-connected
d(I) = d(I) + 8;
end
function g = gscale(f, varargin)
%GSCALE Scales the intensity of the input image.
У, G = GSCALE(F, Jfull8') scales the intensities of F to the full
У, 8-bit intensity range [0, 255] . This is the default if there is
У, only one input argument.
У.
У, G = GSCALE(F, 'fulll6') scales the intensities of F to the full
У. 16-bit intensity range [0, 65535] .
'/•
У, G = GSCALE(F, 'minmax', LOW, HIGH) scales the intensities of F to
Ув the range [LOW, HIGH] . These values must be provided, and they
У, must be in the range [0, 1], independently of the class of the
У, input. GSCALE performs any necessary scaling. If the input is of
У, class double, and its values are not in the range [0, 1] , then
У, GSCALE scales it to this range before processing.
У.
Ув The class of the output is the same as the class of the input.
if length (varargin) == 0 e/0 If only one argument it must be f.
method = 'full8';
else
method = varargin{l};
end
if strcmp(class(f), 'double') & (max(f(:)) > 1 | min(f(:)) < 0)
Приложение В
f = mat2gray(f);
end
7e Perform the specified scaling.
switch method
case 'full8'
g = im2uint8(mat2gray(double(f)));
case 'fulll6'
g = im2uint16(mat2gray(double(f)));
case 'minmax'
low = varargin{2}; high = varargin{3};
if low > 1 | low < 0 | high > 1 | high < 0
error('Parameters low and high must be in the range [0, 1].')
end
if strcmp(class(f), 'double')
low__in = min(f (:)) ;
high_in = max(f(:));
elseif strcmp(class(f), 'uint8')
low.in = double(min(f(:)))./255;
high.in = double(max(f(:)))./255;
elseif strcmp(class(f), 'uintl6')
low.in = double(min(f(:)))./65535;
high.in = double(max(f(:)))./65535;
end
7, imadjust automatically matches the class of the input.
g = imadjust(f, [low_in high_in], [low high]);
otherwise
error('Unknown method.')
end
function [X, R] = imstack2vectors(S, MASK)
%IMSTACK2VECTORS Extracts vectors from an image stack.
7e [X, R] = imstack2vectors(S, MASK) extracts vectors from S, which
7, is an M-by-N-by-n stack array of n registered images of size
7e M-by-N each (see Fig. 11.24). The extracted vectors are arranged
7. as the rows of array X. Input MASK is an M-by-N logical or
У, numeric image with nonzero values (Is if it is a logical array)
°/o in the locations where elements of S are to be used in forming X
Ув and 0s in locations to be ignored. The number of row vectors in X
Уо is equal to the number of nonzero elements of MASK. If MASK is
У, omitted, all M*N locations are used in forming X. A simple way to
°/e obtain MASK interactively is to use function roipoly. Finally, R
Ув is an array whose rows are the 2-D coordinates containing the
Приложение В
7e region locations in MASK from which the vectors in S were
°/o extracted to form X.
°/0 Preliminaries.
[M, N, n] = size(S);
if nargin == 1
MASK = true(M, N);
else
MASK = MASK ~= 0;
end
°/o Find the set of locations where the vectors will be kept before
°/e MASK is changed later in the program.
[I, J] = find(MASK);
R = [I, J];
7, Now find X.
7e First reshape S into X by turning each set of n values along the
7e third dimension of S so that it becomes a row of X. The order is
7e from top to bottom along the first column, the second column,
7o and so on.
Q = M*N;
X = reshape(S, Q, n);
У, Now reshape MASK so that it corresponds to the right locations
°/e vertically along the elements of X.
MASK = reshape(MASK, Q, 1);
°/o Keep the rows of X at locations where MASK is not 0.
X = X(MASK, :);
function [x, y] = intline(xl, x2, yl, y2)
°/eINTLINE Integer-coordinate line drawing algorithm.
°/o [X, Y] = INTLINE(XI, X2, Yl, Y2) computes an
°/e approximation to the line segment joining (XI, Yl) and
У. (X2, Y2) with integer coordinates. XI, X2, Yl, and Y2
°/o should be integers. INTLINE is reversible; that is,
°/. INTLINE(XI, X2, Yl, Y2) produces the same results as
У, FLIPUD(INTLINE(X2, XI, Y2, Yl)).
'/. Copyright 1993-2002 The MathWorks, Inc. Used with permission.
У. $Revision: 5.11 $ $Date: 2002/03/15 15:57:47 $
dx = abs(x2 - xl);
dy = abs(y2 - yl);
°/o Check for degenerate case.
if ((dx == 0) & (dy == 0))
x = xl;
у = yi;
return;
end
flip = 0;
if (dx >= dy)
if (xl > x2)
Приложение В
°/о Always >draw> from left to right.
t = xl; xl = x2; x2 = t;
t = yl; yl = y2; y2 = t;
flip = 1;
end
m = (y2 - yl)/(x2 - xl);
x = (xl:x2) . ' ;
у = round(yl + m*(x - xl));
else
if (yl > y2)
У, Always >draw> from bottom to top.
t = xl; xl = x2; x2 = t;
t = yl; yl = y2; y2 = t;
flip = 1;
end
m = (x2 - xl)/(y2 - yl);
у = (yl:y2).>;
x = round(xl + m*(y - yl));
end
if (flip)
x = flipud(x);
у = flipud(y);
end
function phi = invmoments(F)
VelNVMOMENTS Compute invariant moments of image.
°/, PHI = INVMOMENTS(F) computes the moment invariants of the image
°/« F. PHI is a seven-element row vector containing the moment
°/o invariants as defined in equations A1.3-17) through A1.3-23) of
°/o Gonzalez and Woods, Digital Image Processing, 2nd Ed.
7,
°/p F must be a 2-D, real, nonsparse, numeric or logical matrix.
if (ndims(F) ~= 2) | issparse(F) | ~isreal(F) | ~(isnumeric(F) | ...
islogical(F))
error(['F must be a 2-D, real, nonsparse, numeric or logical '...
'matrix.']);
end
F = double(F);
phi = compute_phi(compute_eta(compute_m(F)));
/o- -------------------------------- /0
function m = compute_m(F)
[M, N] = size(F);
[x, y] = meshgrid(l:N, 1:M);
У, Turn x, y, and F into column vectors to make the summations a bit
°/o easier to compute in the following.
x = x(:);
У - y(:);
596 Приложение В
F = F(:);
У. DIP equation A1.3-12)
m.mOO = sum(F);
У, Protect againsi
if (m.mOO == 0)
m.mOO = eps;
end
: divide-by-zero warnings.
Ус The other central moments:
m.mlO = sum(x .*
m.mOl = sum(y .*
m.mll = sum(x .*
m.m20 = sum(x.~2
m.mO2 = sum(y.~2
m.m30 = sum(x.~3
т.тОЗ = sum(y.
m.ml2 = sum(x . *
m.m21 = sum(x.~2
F);
F);
У .* F);
.* F);
.* F);
.* F);
.* F);
У--2 .* F);
.* у .* F);
function e = compute_eta(m)
У, DIP equations A1.3-14) through A1.3-16).
xbar = m.mlO / m.mOO;
ybar = m.mOl / m.mOO;
e.etall = (m.mll - ybar*m.mlO) / т.тОСГ2;
e.eta20 = (m.m20 - xbar*m.mlO) / m.m00~2;
e.etaO2 = (m.mO2 - ybar*m.m01) / m.mOCT2;
e.eta30 = (т.тЗО - 3 * xbar ¦ m.m20 + 2 ¦ xbar~2 * m.mlO) / m.m00~2.5;
e.etaO3 = (т.тОЗ - 3 * ybar * m.mO2 + 2 * ybar~2 * m.mOl) / т.тО(Г2.5;
e.eta21 = (m.m21 - 2 * xbar ¦ m.mll - ybar * m.m20 + ...
2 * xbar~2 * m.mOl) / m.mOCT2.5;
e.etal2 = (m.ml2 - 2 * ybar ¦ m.mll - xbar * m.mO2 + ...
2 * ybar~2 ¦ m.mlO) / m.mO(T2.5;
7 7
/o- ------------------------------- -/0
function phi = compute_phi(e)
У, DIP equations A1.3-17) through A1.3-23).
phi(l) = e.eta20 + e.etaO2;
phiB) = (e.eta20 - e.etaO2)~2 + 4*e.etall~2;
phiC) = (e.eta30 - 3*e.etal2)~2 + C*e.eta21 - e.etaO3)~2;
phiD) = (e.eta30 + e.etal2)~2 + (e.eta21 + e.etaO3)^2;
phiE) = (e.eta30 - 3*e.etal2) * (e.eta30 + e.etal2) * ...
( (e.eta30 + e.etal2)^2 - 3*(e.eta21 + e.etaO3)~2 ) + ...
C*e.eta21 - e.etaO3) * (e.eta21 + e.etaO3) * ...
( 3*(e.eta30 + e.etal2)^2 - (e.eta21 + e.etaO3)^2 );
phiF) = (e.eta20 - e.etaO2) * ( (e.eta30 + e.etal2)'42 - ...
(e.eta21 + e.etaO3)^2 ) + ...
4 * e.etall * (e.eta30 + e.etal2) * (e.eta21 + e.etaO3);
phiG) = C*e.eta21 - e.etaO3) * (e.eta30 + e.etal2) * ...
Приложение В
( (e.eta30 + e.etal2)~2 - 3*(e.eta21 + e.etaO3)~2 ) +
C*e.etal2 - e.eta30) ¦ (e.eta21 + e.etaO3) * ...
( 3*(e.eta30 + e.etal2)~2 - (e.eta21 + e.etaO3)~2 );
M
function [x, y] = minperpoly(B, cellsize)
%MINPERPOLY Computes the minimum perimeter polygon.
% [X, Y] = MINPERPOLY(F, CELLSIZE) computes the vertices in [X, Y]
7e of the minimum perimeter polygon of a single binary region or
7e boundary in image B. The procedure is based on Slansky's
7. shrinking rubber band approach. Parameter CELLSIZE determines the
У, size of the square cells that enclose the boundary of the region
7, in B. CELLSIZE must be a nonzero integer greater than 1.
7,
7e The algorithm is applicable only to boundaries that are not
7e self-intersecting and that do not have one-pixel-thick
7e protrusions.
if cellsize <= 1
error ('CELLSIZE must be an integer > 1.');
end
7e Fill В in case the input was provided as a boundary. Later
7e the boundary will be extracted with 4-connectivity, which
7e is required by the algorithm. The use of bwperim assures
'/, that 4-connectivity is preserved at this point.
В = imfilKB, 'holes');
В = bwperim(B);
[M, N] = size(B);
7e Increase image size so that the image is of size K-by-K
7o with (а) К >= max(M,N) and (b) K/cellsize = a power of 2.
К = nextpow2(max(M, N)/cellsize);
К = B~K)*cellsize;
7e Increase image size to nearest integer power of 2, by
7e appending zeros to the end of the image. This will allow
7e quadtree decompositions as small as cells of size 2-by-2,
7e which is the smallest allowed value of cellsize.
M = К - M;
N = К - N;
В = padarray(B, [M N] , 'post'); °/0 f is now of size K-by-K
7e Quadtree decomposition.
Q = qtdecomp(B, 0, cellsize);
7e Get all the subimages of size cellsize-by-cellsize.
[vals, r, c] = qtgetblk(B, Q, cellsize);
7e Get all the subimages that contain at least one black
Приложение В
°/в pixel. These are the cells of the wall enclosing the boundary.
I = f ind(sum(sum(vals(:, :, :)) >= 1));
x = r(I);
У = c(I);
°/o [x', y'] is a length (I )-by-2 array. Each member of this array is
У, the left, top corner of a black cell of size cellsize-by-cellsize.
°/o Fill the cells with black to form a closed border of black cells
°/e around interior points. These cells are the cellular complex.
for к = l:length(I)
B(x(k):x(k) + cellsize-1, y(k):y(k) + cellsize-1) = 1;
end
BF = imfilKB, 'holes');
°/e Extract the points interior to the black border. This is the region
°/o of interest around which the MPP will be found.
В = BF & (~B);
e/e Extract the 4-connected boundary.
В = boundaries(B, 4, 'cw');
У, Find the largest one in case of parasitic regions.
J = cellfun('length', B);
I = find(J == max(J));
В = BUU)};
°/e Function boundaries outputs the last coordinate pair equal to the
°/o first. Delete it.
В = B(l:end-1,:);
p/e Obtain the xy coordinates of the boundary.
x = B(:, 1);
У = В(:, 2);
°/0 Find the smallest x-coordinate and corresponding
°/0 smallest y-coordinate.
ex = find(x == min(x));
cy = find(y == min(y(cx)));
7o The cell with top leftmost corner at (xl, yl) below is the first
°/e point considered by the algorithm. The remaining points are
°/e visited in the clockwise direction starting at (xl, yl).
xl = x(cx(l));
yl = y(cy(l));
e/o Scroll data so that the first point is (xl, yl) .
I = find(x == xl & у == yl);
x = circshift(x, [-(I - 1), 0]);
у = circshift(y, [-(I - 1), 0]);
e/o The same shift applies to B.
В = circshift(B, [-(I - 1), 0]);
e/e Get the Freeman chain code. The first row of В is the required
°/e starting point. The first element of the code is the transition
°/e between the 1st and 2nd element of B, the second element of
°/0 the code is the transition between the 2nd and 3rd elements of B,
Прилоэюение В
7e and so on. The last element of the code is the transition between
7, the last and 1st elements of B. The elements of В form a cw
°/e sequence (see above), so we use 'same' for the direction in
% function fchcode.
code = fchcode(B, 4, 'same');
code = code.fee;
°/o Follow the code sequence to extract the Black Dots, BD, (convex
% corners) and White Dots, WD, (concave corners). The transitions are
7, as follows: 0-to-l=WD; 0-to-3=BD; l-to-0=BD; l-to-2=WD; 2-to-l=BD;
7o 2-to-3=WD; 3-to-0=WD; 3-to-2=dot. The formula t = 2*first - second
7o gives the following unique values for these transitions: -1, -3, 2,
У, 0, 3, 1, 6, 4. These are applicable to travel in the cw direction.
% The WD's are displaced one-half a diagonal from the BD's to form
7, the half-cell expansion required in the algorithm.
7o Vertices will be computed as array >vertices> of dimension nv-by-3,
7o where nv is the number of vertices. The first two elements of any
7o row of array vertices are the (x,y) coordinates of the vertex
7e corresponding to that row, and the third element is 1 if the
7o vertex is convex (BD) or 2 if it is concave (WD) . The first vertex
7e is known to be convex, so it is black.
vertices = [xl, yl, 1];
n = 1;
к = 1;
for к = 2:length(code)
if code(k - 1) ~= code(k)
n = n + 1;
t = 2*code(k-l) - code(k); °/0 t = value of formula.
if t == -3 | t == 2 | t == 3 | t == 4 У, Convex: Black Dots.
vertices(n, 1:3) = [x(k), y(k), 1];
elseif t == -1 | t == 0 | t == 1 | t == 6 7o Concave: White Dots.
if t == -1
vertices(n, 1:3) = [x(k) - cellsize, y(k) - cellsize,2];
elseif t==0
vertices(n, 1:3) = [x(k) + cellsize, y(k) - cellsize,2];
elseif t==l
vertices(n, 1:3) = [x(k) + cellsize, y(k) + cellsize,2];
else
vertices(n, 1:3) = [x(k) - cellsize, y(k) + cellsize,2];
end
else
7o Nothing to do here.
end
end
end
7o The rest of minperpoly.m processes the vertices to
7o arrive at the MPP.
Приложение В
flag = 1;
while flag
°/e Determine which vertices lie on or inside the
e/e polygon whose vertices are the Black Dots. Delete all
У, other points.
I = find(vertices(:, 3) == 1);
xv = vertices(I, 1); % Coordinates of the Black Dots.
yv = vertices (I, 2);
X = verticesd, 1); °/0 Coordinates of all vertices.
Y = vertices (: , 2);
IN = inpolygon(X, Y, xv, yv);
I = find(IN ~= 0);
vertices = vertices(I, :);
°/e Now check for any Black Dots that may have been turned into
У, concave vertices after the previous deletion step. Delete
e/e any such Black Dots and recompute the polygon as in the
У, previous section of code. When no more changes occur, set
°/e flag to 0, which causes the loop to terminate.
x = vertices ( :, 1);
у = vertices(:, 2);
angles = polyangles(x, y) ; °/0 Find all the interior angles.
I = find(angles > 180 & vertices(:, 3) == 1);
if isempty(I)
flag = 0;
else
J = l:length(vertices);
for к = l:length(I)
К = find(J ~= I(k));
J = J(K);
end
vertices = vertices(J, :);
end
end
У» Final pass to delete the vertices with angles of 180 degrees.
x = vertices(:, 1);
у = vertices(:, 2);
angles = polyangles(x, y);
I = find(angles ~= 180);
У, Vertices of the MPP:
x = vertices(I, 1);
у = vertices(I, 2);
Приложение В
function В = pixeldup(A, m, n)
%PIXELDUP Duplicates pixels of an image in both directions.
У. В = PIXELDUP(A, M, N) duplicates each pixel of AM times in the
°/o vertical direction and N times in the horizontal direction.
°/o Parameters M and N must be integers. If N is not included, it
°/. defaults to M.
°/o Check inputs.
if nargin < 2
error('At least two inputs are required.5);
end
if nargin == 2
n = m;
end
°/o Generate a vector with elements l:size(A, 1).
u = 1:size(A, 1);
7o Duplicate each element of the vector m times.
m = round(m) ; °/0 Protect against nonintergers.
u = u(ones(l, m), :);
u = u(:);
°/o Now repeat for the other direction.
v = l:size(A, 2);
n = round(n);
v = v(ones(l, n), :);
v = v(:);
В = A(u, v);
function angles = polyangles(x, y)
%POLYANGLES Computes internal polygon angles.
e/. ANGLES = POLYANGLES(X, Y) computes the interior angles (in
°/o degrees) of an arbitrary polygon whose vertices are given in
7o [X, Y] , ordered in a clockwise manner. The program eliminates
°/o duplicate adjacent rows in [X Y] , except that the first row may
°/o equal the last, so that the polygon is closed.
°/o Preliminaries.
[x y] = dupgone(x, y) ; °/0 Eliminate duplicate vertices.
xy = [x(:) y(:)];
if isempty(xy)
°/o No vertices!
angles = zeros@, 1);
return;
end
if size(xy, 1) == 1 | ~isequal(xy(l, :), xy(end, :))
°/o Close the polygon
xy(end + 1, :) = xy(l, :);
end
Приложение В
°/о Precompute some quantities.
d = diff(xy, 1);
vl = -d(l:end, :);
v2 = [dB:end, :); d(l, :)];
vl_dot_v2 = sum(vl .* v2, 2);
mag_vl = sqrt(sum(vl., 2));
mag_v2 = sqrt(sum(v2.~2, 2));
°/o Protect against nearly duplicate vertices; output angle will be 90
°/o degrees for such cases. The <real> further protects against
°/o possible small imaginary angle components in those cases.
mag_vl(~mag_vl) = eps;
mag_v2(~mag_v2) = eps;
angles = real(acos(vl_dot_v2 ./ mag_vl ./ mag_v2) * 180 / pi);
% The first angle computed was for the second vertex, and the
У. last was for the first vertex. Scroll one position down to
°/o make the last vertex be the first.
angles = circshift(angles, [1, 0]);
°/e Now determine if any vertices are concave and adjust the angles
°/o accordingly.
sgn = convex_angle_test(xy);
°/o Any element of sgn that's -1 indicates that the angle is
°/e concave. The corresponding angles have to be subtracted
e/o from 360.
I = find(sgn == -1);
angles(I) = 360 - angles(I);
•/. •/,
function sgn = convex_angle_test(xy)
°/e The rows of array xy are ordered vertices of a polygon. If the
°/o kth angle is convex (>0 and <= 180 degress) then sgn(k) =
% 1. Otherwise sgn(k) = -1. This function assumes that the first
°/o vertex in the list is convex, and that no other vertex has a
e/o smaller value of x-coordinate. These two conditions are true in
% the first vertex generated by the MPP algorithm. Also the
% vertices are assumed to be ordered in a clockwise sequence, and
°/o there can be no duplicate vertices.
У.
% The test is based on the fact that every convex vertex is on the
°/o positive side of the line passing through the two vertices
7o immediately following each vertex being considered. If a vertex
7e is concave then it lies on the negative side of the line joining
°/o the next two vertices. This property is true also if positive and
°/o negative are interchanged in the preceding two sentences.
У. It is assumed that the polygon is closed. If not, close it.
if size(xy, 1) == 1 | ~isequal(xy(l, :), xy(end, :))
xy(end +1, :) = xy(l, :);
end
Приложение В
% Sign convention: sgn = 1 for convex vertices (i.e, interior
°/o angle > 0 and <= 180 degrees), sgn = -1 for concave vertices.
7e Extreme points to be used in the following loop. A 1 is appended
% to perform the inner (dot) product with w, which is l-by-3 (see
7, below) .
L = 1СГ25;
top_left = [-L, -L, 1] ;
top.right = [-L, L, 1] ;
bottom_left = [L, -L, 1] ;
bottom_right = [L, L, 1] ;
sgn = 1; % The first vertex is known to be convex.
7o Start following the vertices.
for к = 2:length(xy) - 1
pfirst= xy(k - 1, :);
psecond = xy(k, :); °/0 This is the point tested for convexity.
pthird = xy(k + 1, :);
°/o Get the coefficients of the line (polygon edge) passing
7, through pfirst and psecond.
w = polyedge(pfirst, psecond);
7o Establish the positive side of the line wlx + w2y + w3 = 0.
7o The positive side of the line should be in the right side of the
7o vector (psecond - pfirst) . deltax and deltay of this vector
7o give the direction of travel. This establishes which of the
7o extreme points (see above) should be on the + side. If that
7e point is on the negative side of the line, then w is replaced by -w.
deltax = psecondd, 1) - pfirstd, 1);
deltay = psecond(:, 2) - pfirst(:, 2);
if deltax == 0 к deltay == 0
error('Data into convexity test is 0 or duplicated.')
end
if deltax <= 0 & deltay >= 0 7o Bottom.right should be on + side.
vector_product = dot(w, bottom_right); 7o Inner product.
w = sign(vector_product)*w;
elseif deltax <= 0 & deltay <= 0 % Top.right should be on + side.
vector_product = dot(w, top_right);
w = sign(vector_product)*w;
elseif deltax >= 0 & deltay <= 0 °/0 Top.left should be on + side.
vector_product = dot(w, top_left);
w = sign(vector_product)*w;
else 7o deltax >= 0 & deltay >= 0, so bottom_left should be on + side.
vector_product = dot(w, bottom_left);
w = sign(vector_product)*w;
end
7o For the vertex at psecond to be convex, pthird has to be on the
% positive side of the line.
sgn(k) = 1;
Приложение В
if (w(l)*pthird(: , 1) + wB)*pthird(: , 2) + wC)) < 0
sgn(k) = -1;
end
end
yo
function w = polyedge(pl, p2)
У, Outputs the coefficients of the line passing through pi and
°/o p2. The line is of the form wlx + w2y + w3 = 0.
xl = pl(:, 1); yl = pl(:, 2);
x2 = p2(:, 1); y2 = p2(:, 2);
if xl==x2
w2 = 0;
wl = -1/xl;
w3 = 1;
elseif yl==y2
wl = 0;
w2 = -1/yl;
w3 = 1;
elseif xl == yl & x2 == y2
wl = 1;
w2 = 1;
w3 = 0;
else
wl = (yl - y2)/(xl*(y2 - yl) - yl*(x2 - xl) + eps) ;
w2 = -wl*(x2 - xl)/(y2 - yl);
w3 = 1;
end
w = [wl, w2, w3];
I .
function [xg, yg] = dupgone(x, y)
°/« Eliminates duplicate, adjacent rows in [x y] , except that the
°/e first and last rows can be equal so that the polygon is closed,
xg = x;
yg = y;
if size(xg, 1) > 2
I = find((x(l:end-l, :) == xB:end, :)) & ...
(y(l:end-l, :) == yB:end, :)));
xg(I) = [];
ygU) = C];
end
R
function [xn, yn] = randvertex(x, y, npix)
%RANDVERTEX Adds random noise to the vertices of a polygon.
e/e [XN, YN] = RANDVERTEX[X, Y, NPIX] adds uniformly distributed
Приложение В
°/о noise to the coordinates of vertices of a polygon. The
°/0 coordinates of the vertices are input in X and Y, and NPIX is the
% maximum number of pixel locations by which any pair (X(i), Y(i))
% is allowed to deviate. For example, if NPIX = 1, the location of
7o any X(i) will not deviate by more than one pixel location in the
°/o x-direction, and similarly for Y(i) . Noise is added independently
°/o to the two coordinates.
°/o Convert to columns.
x = x(:);
У = y(:);
°/o Preliminary calculations.
L = length(x);
xnoise = rand(L, 1);
ynoise = rand(L, 1);
xdev = npix*xnoise.*sign(xnoise - 0.5);
ydev = npix*ynoise.*sign(ynoise - 0.5);
°/o Add noise and round.
xn = round(x + xdev);
yn = round(у + ydev);
°/o All pixel locations must be no less than 1.
xn = max(xn, 1) ;
yn = max(yn, 1);
function [st, angle, xO, yO] = signature(b, varargin)
%SIGNATURE Computes the signature of a boundary.
% [ST, ANGLE, XO, YO] = SIGNATURE(B) computes the
°/o signature of a given boundary, B, where В is an np-by-2 array
°/o (np > 2) containing the (x, y) coordinates of the boundary
°/o ordered in a clockwise or counterclockwise direction. The
°/0 amplitude of the signature as a function of increasing ANGLE is
°/o output in ST. (XO,YO) are the coordinates of the centroid of the
°/o boundary. The maximum size of arrays ST and ANGLE is 360-by-l,
% indicating a maximum resolution of one degree. The input must be
°/0 a one-pixel-thick boundary obtained, for example, by using the
°/0 function boundaries. By definition, a boundary is a closed curve.
°/,
e/. [ST, ANGLE, XO, YO] = SIGNATURE(B) computes the signature, using
°/o the centroid as the origin of the signature vector.
°/o
e/. [ST, ANGLE, XO, YO] = SIGNATURE(B, XO, YO) computes the boundary
°/o using the specified (XO, YO) as the origin of the signature
°/o vector.
Приложение В
У» Check dimensions of b.
[np, nc] = size(b);
if (np < nc | nc ~= 2)
error('B must be of size np-by-2.');
end
°/e Some boundary tracing programs, such as boundaries.m, end where
в/в they started, resulting in a sequence in which the coordinates
Ув of the first and last points are the same. If this is the case,
°/o in b, eliminate the last point.
if isequal(b(l, :), b(np, :))
b = b(l:np - 1, :);
np = np - 1;
end
Ув Compute parameters.
if nargin == 1
xO = round(sum(b(: , l))/np); У, Coordinates of the centroid.
yO = round(sum(b(: , 2))/np);
elseif nargin == 3
xO = varargin{l};
yO = varargin{2};
else
error('Incorrect number of inputs.');
end
% Shift origin of coord system to (xO, yO)).
b(:, 1) = b(:, 1) - xO;
b(:, 2) = b(:, 2) - yO;
°/o Convert the coordinates to polar. But first have to convert the
°/o given image coordinates, (x, y) , to the coordinate system used by
Ув MATLAB for conversion between Cartesian and polar cordinates.
Уо Designate these coordinates by (xc, yc) . The two coordinate systems
Ув are related as follows: xc = у and yc = -x.
xc = b(:, 2);
yc = -b(:, 1);
[theta, rho] = cart2pol(xc, yc);
°/0 Convert angles to degrees.
theta = theta.*A80/pi);
У» Convert to all nonnegative angles.
j = theta == 0; У, Store the indices of theta = 0 for use below.
theta = theta.*@.5*abs(l + sign(theta)))...
- 0.5*(-l + sign(theta)).*C60 + theta);
theta(j) =0; в/в То preserve the 0 values.
temp = theta;
Ув Order temp so that sequence starts with the smallest angle.
Ув This will be used below in a check for monotonicity.
I = find(temp == min(temp));
Ув Scroll up so that sequence starts with the smallest angle.
Приложение В
°/о Use 1A) in case the min is not unique (in this case the
7o sequence will not be monotonic anyway) .
temp = circshift(temp, [-AA) - 1), 0]);
°/0 Check for monotonicity, and issue a warning if sequence
°/0 is not monotonic. First determine if sequence is
°/o cw or ccw.
kl = abs(temp(l) - tempB));
k2 = abs(temp(l) - tempC));
if k2 > kl
sense = 1; °/0 ccw
elseif k2 < kl
sense = -1; 7, cw
else
warning(['The first 3 points in В do not form a monotonic ' .
'sequence.']);
end
°/e Check the rest of the sequence for monotonicity. Because
% the angles are rounded to the nearest integer later in the
°/0 program, only differences greater than 0.5 degrees are
% considered in the test for monotonicity in the rest of
°/o the sequence.
flag = 0;
for к = 3:length(temp) - 1
diff = sense*(temp(k + 1) - temp(k));
if diff < -.5
flag = 1;
end
end
if flag
warning('Angles do not form a monotonic sequence.');
end
% Round theta to 1 degree increments.
theta = round(theta);
% Keep theta and rho together.
tr = [theta, rho];
°/e Delete duplicate angles. The unique operation
°/o also sorts the input in ascending order.
[w, u, v] = unique(tr(:, 1));
tr = tr(u,:); 7, u identifies the rows kept by unique.
7e If the last angle equals 360 degrees plus the first
7e angle, delete the last angle.
if tr(end, 1) == tr(l) + 360
tr = tr(l:end - 1, :);
end
7e Output the angle values.
angle = tr(:, 1);
Приложение В
°/о The signature is the set of values of rho corresponding
°/o to the angle values,
st = tr(:, 2);
function [srad, sang, S] = specxture(f)
%SPECXTURE Computes spectral texture of an image.
°/o [SRAD, SANG, S] = SPECXTURE(F) computes SRAD, the spectral energy
e/e distribution as a function of radius from the center of the
У, spectrum, SANG, the spectral energy distribution as a function of
°/o angle for 0 to 180 degrees in increments of 1 degree, and S =
°/e log(l + spectrum of f) , normalized to the range [0, 1] . The
°/e maximum value of radius is min(M,N) , where M and N are the number
7e of rows and columns of image (region) f. Thus, SRAD is a row
e/o vector of length = (min(M, N)/2) - 1; and SANG is a row vector of
'/. length 180.
Ув Obtain the centered spectrum, S, of f. The variables of S are
°/o (u, v) , running from 1:M and 1:N, with the center (zero frequency)
°/o at [M/2 + 1, N/2 + 1] (see Chapter 4).
S = fftshift(fft2(f));
S = abs(S);
[M, N] = size(S);
xO = M/2 + 1;
yO = N/2 + 1;
У, Maximum radius that guarantees a circle centered at (xO, yO) that
Ув does not exceed the boundaries of S.
rmax = min(M, N)/2 - 1;
Уо Compute srad.
srad = zerosA, rmax);
srad(l) = S(xO, yO);
for r = 2:rmax
[xc, yc] = halfcircle(r, xO, yO);
srad(r) = sum(S(sub2ind(size(S), xc, yc)));
end
°/0 Compute sang.
[xc, yc] = halfcircle(rmax, xO, yO);
sang = zeros(l, length(xc));
for a = l:length(xc)
[xr, yr] = radial(xO, yO, xc(a), yc(a));
sang(a) = sum(S(sub2ind(size(S), xr, yr)));
end
Ув Output the log of the spectrum for easier viewing, scaled to the
Ув range [0, 1] .
S = mat2gray(log(l + S));
•/, •/,
function [xc, yc] = halfcircle(r, xO, yO)
°/0 Computes the integer coordinates of a half circle of radius r and
Приложение В
7« center at (xO,yO) using one degree increments.
у.
У, Goes from 91 to 270 because we want the half circle to be in the
У, region defined by top right and top left quadrants, in the
У« standard image coordinates.
theta=91:270;
theta = theta*pi/180;
[xc, yc] = pol2cart(theta, r);
xc = round (xc)' + xO; °/e Column vector.
yc = round(yc)' + yO;
•/, %
function [xr, yr] = radial(xO, yO, x, y);
7, Computes the coordinates of a straight line segment extending
У. from (xO, yO) to (x, y) .
7.
7e Based on function intline.m. xr and yr are
7e returned as column vectors.
[xr, yr] = intline(xO, x, yO, y) ;
function [v, unv] = statmoments(p, n)
%STATMOMENTS Computes statistical central moments of image histogram.
У. [W, UNV] = STATMOMENTS(P, N) computes up to the Nth statistical
7e central moment of a histogram whose components are in vector
У, P. The length of P must equal 256 or 65536.
7,
7e The program outputs a vector V with V(l) = mean, VB) = variance,
7o VC) = 3rd moment, . . . V(N) = Nth central moment. The random
7o variable values are normalized to the range [0, 1] , so all
7e moments also are in this range.
У.
7e The program also outputs a vector UNV containing the same moments
7e as V, but using un-normalized random variable values (e.g., 0 to
7, 255 if length(P) = 2~8) . For example, if length(P) = 256 and V(l)
У. = 0.5, then UNV(l) would have the value UNV(l) = 127.5 (half of
У. the [0 255] range) .
Lp = length(p);
if (Lp ~= 256) & (Lp ~= 65536)
errorOP must be a 256- or 65536-element vector.');
end
G = Lp - 1;
7e Make sure the histogram has unit area, and convert it to a
7e column vector.
p = p/sum(p) ; p = p(:) ;
7e Form a vector of all the possible values of the
% random variable.
z = 0:G;
Приложение В
°/в Now normalize the z's to the range [0, 1] .
z = z./G;
°/e The mean.
m = z*p;
°/e Center random variables about the mean.
z = z - m;
7e Compute the central moments.
v = zerosA, n);
v(l) = m;
for j = 2:n
end
if nargout > 1
°/o Compute the uncentralized moments.
unv = zerosA, n);
unv(l)=m.*G;
for j = 2:n
unv(j) = ((z*G).~j)*p;
end
end
function [t] = statxture(f, scale)
%STATXTURE Computes statistical measures of texture in an image.
°/o T = STATXURE(F, SCALE) computes six measures of texture from an
У» image (region) F. Parameter SCALE is a 6-dim row vector whose
°/e elements multiply the 6 corresponding elements of T for scaling
e/e purposes. If SCALE is not provided it defaults to all Is. The
°/e output T is 6-by-l vector with the following elements:
°/o T(l) = Average gray level
7e TB) = Average contrast
7e TC) = Measure of smoothness
7, TD) = Third moment
7e TE) = Measure of uniformity
7e TF) = Entropy
if nargin == 1
scale(l:6) = 1;
else 7o Make sure it's a row vector.
scale = scale(:)';
end
7e Obtain histogram and normalize it.
p = imhist(f);
p = p./numel(f);
L = length(p);
7e Compute the three moments. We need the unnormalized ones
7e from function statmoments. These are in vector mu.
[v, mu] = statmoments(p, 3);
Приложение В
7o Compute the six texture measures:
7o Average gray level.
У» Standard deviation.
tB) = muB).~0.5;
% Smoothness.
7« First normalize the variance to [0 1] by
У. dividing it by (L-l)~2.
varn = muB)/(L - 1)~2;
tC) = 1 - 1/A + varn);
°/e Third moment (normalized by (L - 1)~2 also)
tD) = muC)/(L - 1)~2;
7o Uniformity.
tE) = sum(p.~2);
°/o Entropy.
tF) = -sum(p.*(log2(p + eps)));
7o Scale the values.
t = t.*scale;
X
function [B, theta] = x2majoraxis(A, B, type)
%X2MAJORAXIS Aligns coordinate x with the major axis of a region.
°/0 [B2, THETA] = X2MAJ0RAXIS(A, B, TYPE) aligns the x-coordinate
°/o axis with the major axis of a region or boundary. The y-axis is
°/e perpendicular to the x-axis. The rows of 2-by-2 matrix A are the
°/e coordinates of the two end points of the major axis, in the form
% A = [xl yl; x2 y2]. On input, В is either a binary image (i.e.,
°/0 an array of class logical) containing a single region, or it is
°/o an np-by-2 set of points representing a (connected) boundary. In
°/o the latter case, the first column of В must represent
7, x-coordinates and the second column must represent the
7e corresponding y-coordinates. On output, В contains the same data
7o as the input, but aligned with the major axis. If the input is an
7e image, so is the output; similarly the output is a sequence of
7o coordinates if the input is such a sequence. Parameter THETA is
7o the initial angle between the major axis and the x-axis. The
7e origin of the xy-axis system is at the bottom left; the x-axis is
7o the horizontal axis and the y-axis is the vertical.
У.
7e Keep in mind that rotations can introduce round-off errors when
7o the data are converted to integer coordinates, which is a
7e requirement. Thus, postprocessing (e.g., with bwmorph) of the
7o output may be required to reconnect a boundary.
Приложение В
% Preliminaries.
if islogical(B)
type = 'region';
elseif size(B, 2) == 2
type = 'boundary';
[M, N] = size(B);
if M < N
error('B is boundary. It must be of size np-by-2; np > 2.')
end
°/o Compute centroid for later use. с is a l-by-2 vector.
% Its 1st component is the mean of the boundary in the x-direction.
°/e The second is the mean in the y-direction.
c(l) = round((min(B(:, 1)) + max(B(:, l))/2));
cB) = round((min(B(:, 2)) + max(B(:, 2))/2));
% It is possible for a connected boundary to develop small breaks
У, after rotation. To prevent this, the input boundary is filled,
7o processed as a region, and then the boundary is re-extracted. This
°/o guarantees that the output will be a connected boundary.
m = max(size(B));
°/o The following image is of size m-by-m to make sure that there
% there will be no size truncation after rotation.
В = bound2im(B,m,m);
В = imfill(В,'holes');
else
error('Input must be a boundary or a binary image'.)
end
% Major axis in vector form.
v(l) = AB, 1) - A(l, 1);
vB) = AB, 2) - A(l, 2);
v = v(:) ; °/e v is a col vector
°/o Unit vector along x-axis.
u = [1; 0];
°/0 Find angle between major axis and x-axis. The angle is
°/o given by acos of the inner product of u and v divided by
% the product of their norms. Because the inputs are image
% points, they are in the first quadrant.
nv = norm(v);
nu = norm(u);
theta = acos(u'*v/nv*nu);
if theta > pi/2
theta = -(theta - pi/2);
end
theta = theta*180/pi; °/0 Convert angle to degrees.
°/0 Rotate by angle theta and crop the rotated image to original size.
В = imrotate(B, theta, 'bilinear', 'crop');
% If the input was a boundary, re-extract it.
Приложение В
if strcmp(type, 'boundary')
В = boundaries(В);
В = В{1};
У, Shift so that centroid of the extracted boundary is
У, approx equal to the centroid of the original boundary:
B(:, 1) = B(:, 1) - min(B(:, 1)) + c(l);
B(:, 2) = B(:, 2) - min(B(:, 2)) + cB);
end
Литература
Ссылки, применимые ко всем главам:
Gonzalez R. С., Woods R. Е. [2002]. Digital Image Processing, 2nd ed., Prentice
Hall, Upper Saddle River, NJ.
Hanselman D., Littlefield B. R. [2001]. Mastering MATLAB 6, Prentice Hall, Upper
Saddle River, NJ.
Image Processing Toolbox, Users Guide, Version 4- [2003], The MathWorks, Inc.,
Natick, MA.
Using MATLAB, Version 6.5 [2002], The MathWorks, Inc., Natick, MA.
Все остальные ссылки:
Acklam P. J. [2002]. "MATLAB Array Manipulation Tips and Tricks."
Можно загрузить со страницы
http: //home. online.no/_pj acklam/matlab/doc/mtt/ а также
www.prenhall.com/gonzalezwoodseddins.
Brigham E. O. [1988]. The Fast Fourier Transform and its Applications, Prentice
Hall, Upper Saddle River, NJ.
Bribiesca E. [1981]. "Arithmetic Operations Among Shapes Using Shape Numbers,"Pat-
Numbers,"Pattern Recog., vol. 13, no. 2, pp. 123-138.
Bribiesca E., Guzman A. [1980]. "How to Describe Pure Form and How to Measure
Differences in Shape Using Shape Numbers Pattern Recog., vol. 12, no. 2, pp.
101-112.
Canny J. [1986]. "A Computational Approach for Edge Detection,"IEEE Trans.
Pattern Anal. Machine Intell., vol. 8, no. 6, pp. 679-698.
Dempster A. P., Laird N. M., Ruben D. B. [1977]. "Maximum Likelihood from
Incomplete Data via the EM Algorithm,"J. R. Stat. Soc. B, vol. 39, pp. 1-37.
Zenzo S. [1986] . "A Note on the Gradient of a Multi-Image,"Computer Vision,
Graphics and Image Processing, vol. 33, pp. 116-125.
Floyd R. W., Steinberg L. [1975]. "An Adaptive Algorithm for Spatial Gray Scale,"In-
ternational Symposium Digest of Technical Papers, Society for Information Disp-
Displays, 1975, p. 36.
Gardner M. [1970]. "Mathematical Games: The Fantastic Combinations of John
Conway's New Solitaire Game 'Life', "Scientific American, October, pp. 120-123.
Gardner M. [1971]. "Mathematical Games On Cellular Automata, Self- Reproduction,
the Garden of Eden, and the Game 'Life', " Scientific American, February, pp. 112-117.
Hanisch R. J., White R. L., Gilliland R. L. [1997]."Deconvolution of Hubble Space
Telescope Images and Spectra,"in Deconvolution of Images and Spectra, P.A.
Jansson, ed., Academic Press, NY, pp. 310-360.
Haralick R. M., Shapiro L. G. [1992]. Computer and Robot Vision, vols. 1 & 2,
Addison-Wesley, Reading, MA.
Holmes T. J. [1992]. "Blind Deconvolution of Quantum-Limited Incoherent Imagery,
"J. Opt. Soc.Am.A, vol. 9, pp. 1052-1061.
Литература 615
Holmes Т. J., et al. [1995]. "Light Microscopy Images Reconstructed by Maximum
Likelihood Deconvolution,"in Handbook of Biological and Confocal Microscopy,
2nd ed., J. B. Pawley, ed., Plenum Press, NY, pp. 389-402.
Hough P. V.C. [1962]. "Methods and Means for Recognizing Complex Patterns."U.S.
Patent 3,069,654.
Jansson P. A., ed. [1997]. Deconvolution of Images and Spectra, Academic Press, NY.
Kim С. Е. Sklansky J. [1982]. "Digital and Cellular Convexity,"Pattern Recog., vol.
15, no. 5, pp. 359-367.
Leon-Garcia A. [1994]. Probability and Random Processes for Electrical Engineering,
2nd. ed.,Addison-Wesley, Reading, MA.
Lucy L. B. [1974]. "An Iterative Technique for the Rectification of Observed Dis-
Distributions, "The Astronomical Journal, vol. 79, no. 6, pp. 745-754.
Otsu N. [1979] "A Threshold Selection Method from Gray-Level Histograms,"IEEE
Trans. Systems, Man, and Cybernetics, vol. SMC-9, no. 1, pp. 62-66.
Peebles P. Z. [1993]. Probability, Random Variables, and Random Signal Principles,
3rd ed., McGraw-Hill, NY.
Poynton С. А. [1996]. A Technical Introduction to Digital Video,Wiley, NY.
Richardson W. H. [1972]. "Bayesian-Based Iterative Method of Image Restoration, "J.
Opt. Soc.Am., vol. 62, no. 1, pp. 55-59.
Rogers D. F. [1997]. Procedural Elements of Computer Graphics, 2nd ed., Me- Graw-
Hill, NY.
Russ J. С [1999]. The Image Processing Handbook, 3rd ed., CRC Press, Boca
Raton, FL.
Sklansky J., Chazin R. L., Hansen B. J. [1972]."Minimum-Perimeter Polygons of
Digitized Silhouettes,"IEEE Trans. Computers, vol. C-21, no. 3, pp. 260-268.
Soille P. [2003]. Morphological Image Analysis: Principles and Applications, 2nd ed.,
Springer-Verlag, NY.
Sze T. W., Yang Y. H. [1981]. "A Simple Contour Matching Algorithm,"IEEE Trans.
Pattern Anal. Machine Intell., vol. PAMI-3, no. 6, pp. 676-678.
Ulichney R. [1987], Digital Halftoning,The MIT Press, Cambridge, MA.
Van Trees H. L. [1968]. Detection, Estimation, and Modulation Theory, Part I,
Wiley,NY.
Vincent L. [1993], "Morphological Grayscale Reconstruction in Image Analysis:
Applications and Efficient Algorithms, "IEEE Trans, on Image Processing vol.
2, no. 2, pp. 176-201.
Vincent L., Soille P. [1991]. "Watersheds in Digital Spaces: An Efficient Algorithm
Based on Immersion Simulations, "IEEE Trans. Pattern Anal. Machine Intell.,
vol. 13, no. 6, pp. 583-598.
Wolbert G. [1990]. Digital Image Warping, IEEE Computer Society Press, Los Alami-
tos, CA.