OpenCV і обробка зображень

Доброго ранку, пані та панове. Уважні читачі помітили, що на російському ринку знову проклюнулися перекладні книги на тему комп'ютерного зору. Нас також не могла не зацікавити наступна книга:


Оскільки технології комп'ютерного зору в значній мірі зав'язані і на Python, і на C++, ми підібрали статтю з розбором проблеми і кодом на обох мовах. Крім того, щиро сподіваємося, що дівчина під катом вам сподобається.

У цій статті буде розказано, як згенерувати усереднене зображення особи за допомогою бібліотеки OpenCV (C++ / Python).


Рис. 1

Жінка, зображена на рис. 1, більшості читачів здасться симпатичною. Але ви можете вгадати її національність? А чому у неї така рівна шкіра? Правильно – цієї жінки не існує. Але і не можна сказати, що це повністю віртуальне зображення. Це усереднений портрет всіх співробітниць моєї компанії Sight Commerce Inc. станом приблизно на 2011 рік. Її національність складно визначити, так як у нас працюють дівчата з європейськими, латиноамериканськими, східноазіатських і індійським корінням!

Історія усереднення осіб просто захоплююча.

Все почалося з досліджень Френсіса Гальтона (кузена Чарльза Дарвіна), який ще в 1878 році винайшов новий фотографічний прийом: навчився комбінувати особи і складати перші фотороботи. Він вважав, що, комбінуючи особи злочинців, можна змоделювати «прототипическое» особа злочинця та згодом розпізнавати потенційних злочинців за рисами осіб. Виявилося, що ця гіпотеза помилкова: розглянувши чиюсь фотографію, неможливо визначити його схильність до злочинів.

Однак, Гальтон зауважив, що усереднене обличчя завжди виглядає привабливіше всіх «складових» його осіб. В одному вражаючий експеримент дослідники «склали» особи усіх 22 фіналісток конкурсу «Міс Німеччина — 2002». Опитані оцінили отриманий портрет вище, ніж будь-яку з конкурсанток, навіть вище «міс Берлін», яка тоді виявилася переможницею. Уф! Виявляється, Джессіка Альба така гарненька саме тому, що її обличчя близько до середнього.

Можна прирівняти «середнє» до «посереднього»? Чому усереднене особа здається нам привабливим? Згідно з еволюційною гіпотезою під назвою «койнофилия», особини в активному репродуктивному віці шукають партнерів з усередненими рисами, оскільки відхилення від середнього можуть свідчити про шкідливі мутації. Крім того, середня обличчя симетрично, оскільки варіації в лівій і правій частині особи взаємно згладжуються.
Як згенерувати усереднене особа OpenCV?


Рис. 2: Усереднене особа президентів США від Картера до Обами

Код та зображення до статті можна завантажити тут.

Далі дано покроковий опис, як згенерувати усереднене особа, маючи вищенаведений набір зображень. При цьому ми не враховуємо розмір самих зображень або розмір обличчя на кожному портреті.

Етап 1: Виявлення рис обличчя

Рис. 3: Приклад виявлення рис обличчя

Для кожного портрета ми розраховуємо 68 «контрольних точок» за допомогою бібліотеки dlib. Про те, як встановити і використовувати dlib, я докладно розповідаю в іншому пості Facial Feature Detection. На портреті Обами розставлено 68 контрольних точок.

Етап 2: Координація перетворення
На вході розмір зображень осіб може сильно відрізнятися. Тому нам доведеться їх нормалізувати і привести до однієї системи відліку. Для цього ми деформируем всі зображення осіб до розміру 600×600, щоб лівий кут лівого ока знаходився в точці з координатами (180, 200), а правий кут правого ока – в точці (420, 200). Давайте назвемо цю систему відліку «кінцевою системою», а координати вихідних зображень – «початковою системою».

Як я вибрав вищевказані точки? Я хотів гарантувати, що ці точки будуть розташовані на одній горизонтальній лінії, і ця лінія буде пролягати приблизно в третині шляху від верхнього до нижнього краю картинки. Отже, я добивався, щоб кінчики очниць перебували в точках з координатами ( 0.3 x ширина, висота / 3 ) і ( 0.7 x ширина, висота / 3 ).

Нам також відомо, де розташовані куточки очей на вихідних зображеннях – відповідно, в контрольних точках 36 і 45. Потім ми можемо обчислити перетворення подібності (обертання, переміщення, масштабування) і перевести з початкової точки координатної системи в кінцеву.


Рис. 4: Перетворення подібності використовується для перетворення вихідного зображення розміром 3000×2300 в кінцеве розміром 600×600.

Що таке перетворення подібності? Перетворення подібності – це матриця розміром 2×3, що дозволяє змінювати розташування точок (x, y) або цілого зображення. Два перших стовпці цієї матриці кодують обертання і масштабування, а останній — перенесення (т. e. зміщення). Припустимо, ви перетворите (переміщення) чотири кути квадрата таким чином, що квадрат масштабується в напрямку x і y sx sy разів відповідно. У той же час він повертається на кут θ і переноситься (переміщується) на tx ty в напрямках x та y. Перетворення подібності при цьому можна записати так:



Виходячи з точки (x, y), вищеописане перетворення подібності переносить цю точку в (xt, yt) у відповідності з наступним рівнянням:



Перетворення подібності можна виконати за допомогою
estimateRigidTransform


// C++
// inPts і outPts – це вектори, що складаються з точок 
// Останній параметр означає, що нас не цікавить ні перетворення подібності, 
// ні повне афінне перетворення

cv::estimateRigidTransform(inPts, outPts, false);

# Python 

# inPts і outPts - це масиви кортежів з бібліотеки numpy
# Останній параметр означає, що нас не цікавить ні перетворення подібності, 
# ні повне афінне перетворення

cv2.estimateRigidTransform(inPts, outPts, False);

Однак, тут є одна невелика проблема. OpenCV вимагає, щоб ви поставили як мінімум три пари точок. Це нерозумно, оскільки перетворення подібності цілком можна зробити, маючи всього двома точками. Тому можна просто уявити третю точку, таким чином, щоб вона і дві відомі нам точки утворювали рівносторонній трикутник. Потім використовуємо
estimateRigidTransform
так, як ніби у нас три пари точок.

Обчисливши перетворення подібності, можна з його допомогою перетворити початкове зображення та його контрольні точки в кінцеві координати. Зображення перетвориться за допомогою
warpAffine
, а точки – за допомогою
transform
.

Етап 3: Вирівнювання особи

Рис. 5: Результат спрощеного усереднення особи

На попередньому етапі ми змогли перетворити всі зображення і контрольні точки координати кінцевого зображення. Тепер всі зображення у нас одного розміру, куточки очей вирівняні. Можливо, було б спокусливо спробувати отримати усереднене зображення, взявши середні піксельні значення цих вирівняних зображень. Однак у такому разі у вас вийшла така картинка, як на рис. 5. Так, очі вирівняні, а всі інші риси обличчя розташовані як попало.

Якби ми знали, яка точка з одного вихідного зображення відповідала якій точці з іншого вихідного зображення, то могли б ідеально накласти два зображення одне на одного. Але такої інформації у нас немає. Ми знаємо лише положення 68 відповідних точок на кожному з вихідних зображень. Орієнтуючись на ці точки, ми розділимо кожне зображення на трикутні області, і спочатку вирівняємо ці області, а потім будемо усереднювати піксельні значення.

Цей процес докладніше описаний в моєму пості Face Morphing, а в загальних рисах – нижче.

Обчислюємо середні лицьові точки

Щоб обчислити, як буде виглядати середнє обличчя, риси якого вирівняні, для початку потрібно розрахувати середнє від всіх перетворених контрольних точок в кінцевому зображенні. Для цього просто усредняем значення x і y всіх контрольних точок в координатах кінцевого зображення.

Обчислення тріангуляції Делоне


Рис. 6: Обчислення тріангуляції Делоне для усереднених контрольних точок.

На попередньому етапі ми отримали положення контрольних точок для усередненого особи в кінцевих координатах. Можна використовувати ці 68 точок (показані синім кольором на рис. 6) і 8 точок на кордоні кінцевого зображення (показані зеленим) для розрахунку тріангуляції Делоне (показано червоним). Детальніше тріангуляція Делоне описана здесь.

Тріангуляція Делоне дозволяє розбити зображення на трикутники. В результаті такої тріангуляції отримуємо список трикутників, представлених у вигляді масиву з індексів 76 точок (68 точок на обличчі + 8 граничних точок). У прикладі тріангуляції, показаному нижче, помітно, що контрольні точки 62, 68 і 60 утворюють трикутник, 32, 50 і 49 – інший трикутник і т. д.

Деформація трикутників

Приклад тріангуляції

[
62 68 60
32 50 49
15 16 72
9 8 58
53 35 36
... ]

На попередньому етапі ми вирахували середню розташування контрольних точок на обличчі і, спираючись на ці дані, виконали тріангуляцію Делоне, щоб поділити зображення на трикутники. На рис. 7 бачимо трикутники Делоне, накладені на перетворене початкове зображення, а на тому зображенні, що знаходиться в середині, показана тріангуляція усереднених контрольних точок. Зверніть увагу: трикутник 1 на зображенні зліва відповідає трикутнику 1 на середньому зображенні. Знаючи три вершини трикутника 1, розташованого на лівому зображенні і відповідні їм три вершини трикутника з середнього зображення, можна розрахувати афінне перетворення. Повторивши цю процедуру для кожного з трикутників з лівого зображення, отримуємо праве зображення. Отже, праве зображення — результат деформації лівого до стану усередненого особи.


Рис. 7: Деформація зображення на базі тріангуляції Делоне

Етап 4: Усереднення особи
Застосувавши маніпуляції з попереднього етапу до всіх вихідним зображенням, отримуємо кінцеві зображення, деформовані саме так, щоб результат збігався з усередненими кінцевими точками. Щоб обчислити середнє зображення, можна просто скласти значення інтенсивності пікселів всіх деформованих зображень і поділити цю суму на кількість зображень. На рис. 2 показаний результат такого усереднення. Він виглядає набагато краще, ніж «середня», що було на рис. 5.
Як по-вашому виглядає «середній» президент США? По-моєму — батьківськи і мило.

Результати усереднення особи


Рис. 8: Усереднене особа Марка Цукерберга, Ларрі Пейджа, Ілона Маска і Джефа Безоса


Рис. 9: Усереднене особа Брі Ларсон, Джуліанни Мур, Кейт Бланшетт і Дженніфер Лоуренс

Як виглядає усереднений провідний підприємець-технар? На рис. 8 показано усереднене особа Марка Цукерберга, Ларрі Пейджа, Ілона Маска і Джефа Безоса. Не можу сказати про це «середньому підприємця» нічого особливого крім того, що у нього все-таки проглядається шевелюра (незважаючи на негативний внесок Джеффа Безоса).

Як виглядає усереднена оскароносна актриса? На рис. 9 показано усереднене особа Брі Ларсон, Джуліанни Мур, Кейт Бланшетт і Дженніфер Лоуренс. Отже, середня кінозірка дуже симпатична. І зуби в неї трохи краще, ніж у успішного підприємця. Нічого дивного.

Також можна зробити симетричне обличчя, усереднивши його з дзеркальним зображенням. Приклад показаний нижче.


Рис. 10: Симетричний президент Обама (в центрі) отриманий усередненням його фотографії (зліва) з його дзеркальним відображенням (праворуч).

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.