5.15. Морфологічні операції¶
Морфологічні операції працюють із бінарними зображеннями – масками, що виходять із порогової обробки та виявлення країв. Кожна операція обходить те саме ковзне сусідство, що й фільтри згладжування, але питання, яке вона ставить у кожній позиції, має характер «так/ні»: чи є кожен піксель сусідства увімкненим, чи є хоча б один піксель увімкненим, який вигляд має патерн увімкнених/вимкнених пікселів? Відповіді дають змогу розширювати ділянки, звужувати їх і перекроювати їхні межі так, як не може жодний фільтр усереднення.
Морфологія – це те, що розміщується між початковою бінарною маскою – виводом порогової обробки, виявлення країв або іншого класифікатора – і чистою бінарною маскою, придатною для решти конвеєра. Вивід «сирого» порогу зазвичай містить ізольовані шумові пікселі, розкидані по ділянках справжнього переднього плану, невеликі отвори у суцільних ділянках та нерівні межі, де поріг лежить близько до краю об’єкта. Морфологія усуває ці дефекти.
5.15.1. Чотири класичні операції¶
Дві примітивні операції та дві їхні комбінації складають морфологічний інструментарій:
dilate() розширює кожну ділянку переднього плану. Правило: будь-який піксель, що має хоча б одного сусіда переднього плану у своєму вікні (2 * size + 1), стає переднім планом. Видимий ефект – ділянки переднього плану збільшуються на size пікселів у кожному напрямку, а отвори всередині них зменшуються (або зникають) на ту саму величину.
erode() виконує обернену операцію. Будь-який піксель, у якого не всі сусіди у вікні належать до переднього плану, стає фоном. Ділянки переднього плану зменшуються на size пікселів у кожному напрямку, ізольовані пікселі переднього плану (без сусідів переднього плану) зникають повністю, а вузькі з’єднання між більшими ділянками розриваються.
Чотири класичні морфологічні операції, застосовані до зашумленої бінарної ділянки. Erode звужує; dilate розширює; open – це erode, а потім dilate (видаляє шум); close – це dilate, а потім erode (заповнює отвори).¶
open() – це erode, за яким іде dilate. На еродованому зображенні видалені всі ізольовані шумові пікселі, але воно також звужене на size пікселів у кожному напрямку. Застосування dilate з тим самим розміром після erode відновлює справжні ділянки переднього плану приблизно до їхніх вихідних меж, залишаючи шум видаленим. Саме ця комбінація робить open стандартною операцією «видалення шуму» в класичній морфології: ізольовані пікселі переднього плану зникають, справжні ділянки повертаються неушкодженими.
close() – дзеркальна операція: dilate, за яким іде erode. Dilate заповнює невеликі отвори всередині ділянок переднього плану та з’єднує ділянки, розділені невеликими проміжками; erode звужує результат до вихідної зовнішньої межі, залишаючи заповнений внутрішній простір суцільним. close – стандартна операція «заповнення невеликих проміжків».
binary_mask.open(1) # remove single-pixel noise
binary_mask.close(2) # fill small holes and gaps
Параметр розміру має те саме значення, що й у фільтрах яскравості: size=1 означає сусідство 3 на 3, size=2 – 5 на 5 і так далі. Більші розміри означають більш агресивне очищення – і вищу вартість на піксель.
5.15.2. Циліндрична шапка та чорна шапка¶
Дві додаткові комбінації варті уваги, оскільки вони виділяють саме ті ознаки, які видаляють open та close:
top_hat() повертає різницю між оригінальним зображенням та його відкритою версією – тобто пікселі переднього плану, які open видалив би. Це буквально маска шумових пікселів, ізольованих невеликих ділянок переднього плану, тонких структур переднього плану, які операція відкриття не могла зберегти. Корисний для виділення дрібних ознак переднього плану, коли саме ці ознаки є метою застосунку, а не їхнє видалення.
black_hat() повертає різницю між закритою версією зображення та оригіналом – тобто пікселі фону, які close заповнив би. Це маска невеликих отворів усередині ділянок переднього плану, вузьких проміжків між ділянками, які операція закриття заповнила б.
До обох звертаються рідше, ніж до чотирьох базових операцій, але патерн варто запам’ятати – коли застосунку потрібно виділити дрібні або тонкі ознаки, які стандартний прохід очищення видаляє, циліндрична шапка і чорна шапка є природним способом їх отримати.
5.15.3. Режим порогу¶
Чотири основні морфологічні операції приймають ціле число threshold як ключове слово, що пом’якшує перевірку увімкнено/вимкнено в кожній позиції. Без нього операції поводяться так, як описано вище: erode() вимагає, щоб кожен сусід був увімкнений, dilate() вимагає хоча б одного. З threshold кожна операція допускає, що стільки сусідів проголосували інакше. Для erode threshold – це кількість фонових сусідів, яку може мати піксель і все одно вижити: threshold=4 зберігає будь-який піксель, що має принаймні чотири з восьми сусідів увімкненими (у вікні 3 на 3 центральний піксель має вісім сусідів), тому ерозія відбувається менш агресивно. Для dilate threshold – це кількість переднього плану сусідів, яку фоновий піксель повинен мати понад лімітом, щоб увімкнутися: threshold=2 вимагає принаймні трьох сусідів переднього плану замість одного, тому розширення відбувається менш агресивно.
Порогова форма корисна для налаштування агресивності морфологічного проходу без зміни розміру вікна, що також змінило б масштаб ознак, на які він діє. Більшість застосунків використовує поведінку за замовчуванням; порогова форма призначена для випадків, коли поведінка за замовчуванням є лише трохи надто сильною або слабкою.