Гонсалес Р., Вудс Р., Эддинс С. Цифровая обработка изображений в среде Matlab (2006), страница 14
Описание файла
DJVU-файл из архива "Гонсалес Р., Вудс Р., Эддинс С. Цифровая обработка изображений в среде Matlab (2006)", который расположен в категории "". Всё это находится в предмете "системы распознавания образов" из 10 семестр (2 семестр магистратуры), которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 14 - страница
В МАТ1,АВ предусмотрено восемь операторов условных переходов, которые приведены в табл. 2.11. Следует помнить, что МАТЬАВ трактует логическую единицу и любое ненулевое число как истина, а логический или числовой нуль --. как ложь. . ц в ан... яН~~ г 6~~5) Выражение ехргеяя/оп вычисляется, и если оно истинно, то выполняются операции, перечисленные в ясасетепгя, расположенные между строками 11 и епо.
Если выражение ехргеяяюп ложно, то МАТЮКАВ пропускает все операции между строками гй и епй. Если имеются вложенные операторы 11, то каждый из них обязан иметь парное слово еш1. Условные операторы е1ве и е1ве11 служат для дальнейшего условного разветвления оператора 11. Общая форма этих операторов имеет следующий вид; 11 ехргаягйоп) я(а(етепгя1 е1ве11 ехргеятйоп2 ясасетепся2 е1ве япагетепгяЗ епй Если ехргеяяюп) есть истина, то выполняется я(агетеп(я), после чего контроль передается на конец условного оператора (епо). Если ехргеягбоп1 есть ложь, то выполняется ехргеяя|опЗ. Если оно есть истина, то выполняется ясасетеппя2, и контроль передается на епа. В противном случае (е1ве) выполняется команда (или группа команд) ягагегпепгяЗ. Обратите внимание на то, что оператор е1ве не имеет условия. Операторы е1ве11 и е1ве могут появляться независимо друг от друга после 1Х. Они нс обязаны быть в паре, как показано в общем виде условного оператора 11, Также допускается многократное присутствие операторов е1ве11.
Пример 2.10. Условные развеговления и появление функций еггог, 1епЕСЬ и шппе1. Пусть требуется написать функцию, которая вычисляет среднюю яркость изображения. Как уже обсуждалось, двумерный массив 1 можно преобразовать в вектор-столбец ч, написав оператор ч =1(: ) . Поэтому желательно, чтобы функция могла работать и с векторами, и с матрицами-изображениями.
Программа должна выдавать сообщение об ошибке, если входной массив не является одномерным или двумерным. Хппсс1оп ан = ачегабе(А) '/АНЕЕАСЕ Сошрпсев сЬе анегабе на1пе от ап аггау. '/ АН = АНЕЕАСЕ(А) сошрпсев сЬе ачегабе ча1пе оХ Апрпс '/ аггау, А, чЬАсЬ шпвс Ье а 1-Р ог 2-Р аггау. '/ сьесь сье на11с)1су от сье 1прпс.
(кеер Ап ш1пй сьас % а 1-Р аггау 1в а врес1а1 саве о1 а 2-Р аггау.) 11 п61ш(А) ) 2 еггог('ТЬе о1шепв1оп о1 сЬе 1прпс саппос ехсеео 2/') еш1 '/ СошрпСе СЬе ачегабе ач = впш(А(:))/1епйсЬ(А(:)); Заметим, что входной массив преобразуется в одномерный с помощью оператора А(: ). В общем случае функция 1епбсЬ(А) возвращает длину самого большого измерения массива А. В рассмотренном примере массив А(:) является вектором, поэтому 1епбсЬ(А(: ) ) дает число элементов А.
Это позволяет исключить ~~~66 Глава 2. Цифровые иэображения е МАТЮКАВ проверку того, является ли входной массив вектором или матрицей. Другой способ прямого определения числа элементов массива заключается в использовании функции ппше1, которая имеет следующий синтаксис: и = пвше1(А) Если А является изображением, то пцше1(А) дает число пикселов. Применяя эту функцию, последнюю строку программы можно переписать в виде ач = ваш(А(:))/ппше1(А(:)); Наконец, отметим, что функция еггог прерывает выполнение программы и выдает на консоль сообщение, помещенное в круглые скобки (сообщение следует помещать в апострофы, как это сделано в нашем примере). П Операгпор Сог Как указано в табл. 2.11, цикл Сог выполняет группу операторов предписанное число раз.
Его синтаксис имеет вид Сот тс)ех = вгаггйпсгетепС:епс( вСагетепгв епс( . Циклы можно вкладывать один в другой следующим образом: Сот Спс(ех1 = вгагС1лпсгетепС1:епс)1 вгаСетепгв) Сот Ст1ех2 = вгягС2йпсгетепС2:ет)2 вгагетепСв2 епс1 вСагетепгвЗ епс) . Например, следующий цикл исполняется 11 раз: соцпс = 1 Сот )с = 0:0.1:1 сопят = соцпс + 1; ело . Если таг цикла опущен, то он принимается за 1. Шаг цикла может быть отрицательным, например, Сог )с = 0:-1:-10. Заметим, что в конце строки Сот не нужно ставить точку с запятой. МАТЮКАВ автоматически подавляет выдачу на печать значений индекса цикла. Как уже отмечалось в ~ 2.10.4, можно достигнуть существенного повышения скорости выполнения программы, если заменить цикл Сот везде, где это возможно, на так называемый еекторияоеаннмй код. 3.
О. В *и и-ф ь2у Пример 2.11. Использование цикла уот длл записи нескольких иэображений в файлы. В примере 2.2 сравнивалось несколько изображений с разными значениями качества сжатия ЗРЕС, Покажем, как можно записать все эти изображения на диск с помощью цикла Сот. Пусть имеется изображение С и требуется записать его в ряд файлов формата ПРЕС со значениями коэффициента качества от 0 до 100 и с шагом 5. Желательно также дать этим файлам имена вида вегйев ххх.
)ря, где ххх — это коэффициент качества изображения. Это можно сделать в следующем цикле Сог: Гог с) = 0:5:100 Х11епаше = врг1пьХ('вег1ев %3й.)рб', с)); 1шигйье(г, с11епаше, 'оиа11ьу', я); ело . В данном случае функция вргйпьг~, имеющая синтаксис в = врг1псС('сЬагассегв1/посЬагасгегв2', с1), записывает отформатированные данные в строку в. В этой синтаксической форме сЬагасьегв1 и сЬагассегв2 — это строки символов, а %пс) — обозначает десятичное число (для переменной с)) с и цифрами.
В нашем примере сЬагассегв1— это вег1ев, величина и равна 3, строка сЬагассегв2 — это . ) ря, а с) — это число, определяемое в цикле. П Оператор иЬ11е Цикл иЫ1е выполняет группу операторов до тех пор, пока контролирующее цикл условное выражение есть истина. Синтаксис имеет вид вЫ1е ехргезз)оп згаСегоепСз ело . Как и в случае с циклом Хог, циклы иЬ11е можно вкладывать друг в друга; ий11е ехргеззюп1 зСасетеп Сз1 вЬ11е ехргезз!оп2 зСаСегаепСз2 епо зСаСетепСзЗ еш1 . Например, следующие вложенные циклы вЬ11е прерываются, когда обе величины а и Ь становятся равными нулю: а=10; Ь=б; См. другие синтаксические формы арттптт на спраеочной странице этой функции.
~~~68 Глава 2. Цифроеые изображения и МАТЬАВ иЬ11е а а=а-1; нЬ11е Ь Ь=Ь вЂ” 1; епд еш1 . Здесь мы использовали соглашение МАТЬАВ трактовать числовые величины в логическом контексте как истина, когда они не равны нулю, и как ложь, когда они равны нулю. Иными словами, иЫ1е а и иЫ1е Ь истинны, пока а и Ь оба не равны нулю. Как и в случае цикла Хог, существенного выигрыша производительности программ можно достигнуть, если заменить циклы нЫ1е на векторизованный код (см. э 2.10.4) везде, где это возможно. Оператпор Ьгеак Из названия этого оператора следует, что он осуществляет прерывание циклов 1ог и иЬ11е.
При обнаружении команды Ьгеа1с выполнение программы продолжается со следующего оператора, находящегося вне цикла. Во вложенных циклах оператор Ьгеа1с вызывает прерывание лишь внутреннего цикла, в котором он находится. Оператор сопс1пие Оператор сопс1пце передает управление следующей итерации в циклах аког или нЫ1е, в которых он обнаруживается, пропуская стоящие после него операции в теле цикла и относящиеся к текущей итерации.
Во вложенных циклах оператор сопг1пце передает управление следующей итерации только внутреннего цикла, в котором он стоит. Оператор ви1ссЬ С помощью этого оператора можно сделать выбор среди нескольких возможных продолжений вычислительного процесса в М-функциях на основе различных типов входных данных.
Синтаксис имеет вид ви1ссЬ яиагсИ ехргеяя1оп саяе саяе ехргеяя1оп ягасешепся1 саве (саяе ехргеяяюп1, саяе ехргеяя1оп2, ...) ясасешеп гя2 осЬеги1яе яСаСетепгяЗ еш1 . Оператор яи1ссЬ строит группу выполняемых операторов, основываясь на величинах переменных и выражений. Ключевые слова саяе и осЬегн1яе очерчивают эти группы. Выполняется лишь первый подходящий оператор саяе~. В конце «В отличие от конструкции еиссеь языка С, и языке МАТЬАВ этот оператор не «сонершается до конца». Т.е. еисссь выполняет только первое подходящее действие саве. Все последующие саве игнорируются, так что не нужно прибегать к оператору Ьгеах.
оператора вчйссЬ должен обязательно находиться оператор епд. Фигурные скобки используются, если несколько выражений включены в одну группу операций саве. В качестве простого примера предположим, что имеется М-функция, которая принимает изображение 1 и конвертирует его в некоторый класс, назовем его печс1авв. Допускаются только три класса для конвертации: п1пс8, папс16 и допЫе. Следующий программный фрагмент осуществляет такую конвертацию и выдает сообщение об ошибке, если класс входного изображения не является допустимым: ач1ссЬ пеяс1азз саве 'пйпх8' 8 = 1ш2п(пт8(Х); саве 'п1пх16' — 1ш2п1пг16(1); саве 'бопЫе' Е = 1ш26опЫе(Х); осЬегч1ае еггог('Упкпочп ог 1шрторег 1шабе с1авв.') еш1 .
Конструкция вч1ссЬ будет интенсивно использоваться на протяжение всей книги. Пример 2.12. Изелечепие подизображения из заданного изображения. В этом примере мы напишем М-функцию (на основе цикла Хог) для извлечения прямоугольного подизображения из исходного изображения. Несмотря на то, что это действие можно осуществить с помощью одного оператора, который будет рассмотрен в следующем параграфе, мы используегя этот пример для сравнения скорости выполнения цикла и векторизованного кода. На вход этой функции подается изображение, размер (число строк и столбцов) извлекаемого подизображения и координаты верхнего левого конца подизображения.
Следует напомнить, что начало изображения в МАТ1.АВ имеет координаты (1, 1) (см. э 2.1.1). тппсс1оп в = впЫш(т, ш, и, тх, су) '/8()81й Ехсгассв а впЫшайе, в, 1гоп а 81неп 1шабе, % ТЬе апЫшабе 1в о1 в1хе ш-Ьу-п, апд сЬе соог61пасев '/ о1 1хв Сор, 1еХС сотпег ате (гх, су) . е = кетов(ш, и); гочЫЕЬ = гх + ш — 1; со1ЫЕЬ = су + и — 1; хсоппс = О; Хог г = гх:гочЫЕЬ хсоппс = хсоппс + 1; усоппс = О; 1ог с = су:со1ЬТЕЬ усонпс = усоппс +1; в(хсоппс, усоппс) = 1(г,с); епб епй . Глава 2. Цифровые изабранеенил в МАТ/АВ В следующем параграфе будет приведена более эффективная реализация этой программы.
В качестве упражнения предлагаем читателю самостоятельно написать программу, которая использует пикл яЬ11е вместо цикла Тот. Гз 2.10.4. Кодовая оптимизация программ Как уже говорилось в А 1.3, МАТЬАВ представляет собой язык программирования, специально разработанный для выполнения операций над массивами. Принимая во внимание этот факт, можно существенно повысить скорость вычислений. В этом параграфе будут обсуждаться два важных подхода к оптимизации кодов программ МАТЬАВ: вектпоризацил циклов и предварительное заполяение массивов.