- Що таке зображення?
- Як комп’ютер зберігає зображення
- Чому машині важко ідентифікувати зображення
- Застосування та використання OpenCV
- Встановлення OpenCV за допомогою Python та Anaconda
- Відкриття та збереження зображень у OpenCV
- Масштабування сірого зображення в OpenCV
- Кольорові простори
- Вивчення окремих компонентів зображення RGB
- Перетворення зображення в окремий RGB-компонент
- Зображення гістограми зображення
- Малювання зображень і фігур за допомогою OpenCV
Мистецтво - це спосіб бачити, і вони кажуть, що бачити - це вірити, але вірно і навпаки, вірити - бачити, і насправді важко уявити, що живеш у цьому світі без дару зору - наших очей, як чудово бути немовлям коли наші очі просто відкриваються, ми бачимо світ і починаємо впізнавати і бачити світ навколо нас, але з плином часу той самий чудовий досвід стає буденним. Але, коли ми прогресуємо з технологією, ми знаходимось на порозі, де машини також можуть це побачити та зрозуміти. В даний час це не здається науковою фантастикою, якщо ви просто розблокуєте телефон своїм обличчям, але історія розвитку машинного бачення датується давно більш ніж 20 роками.
Початковий формальний крок у цій галузі був зроблений ще в 1999 році в рамках ініціативи Intel, коли всі досліджувані дослідження співпрацювали в рамках OPEN CV (комп'ютерного бачення з відкритим кодом), спочатку написаного на C ++, з його першим серйозним випуском 1.0 в 2006 році другим у 2009 році - третій у 2015 році та четвертий лише зараз у 2018. Тепер OpenCV має інтерфейси C ++, Python та Java та підтримує Windows, Linux, Mac OS, iOS та Android. Тож його можна легко встановити в Raspberry Pi за допомогою середовища Python та Linux. А Raspberry Pi з OpenCV та підключеною камерою можна використовувати для створення багатьох програм обробки зображень у режимі реального часу, таких як виявлення обличчя, блокування обличчя, відстеження об’єктів, виявлення номерного знака автомобіля, система домашньої безпеки тощо.
Перш ніж навчатися обробці зображень за допомогою openCV, важливо знати, що таке зображення, і як люди та машини сприймають ці зображення.
Що таке зображення?
Зображення - це двовимірне зображення спектра видимого світла. А спектр видимого світла - це лише частина електромагнітного спектру, що лежить між інфрачервоним та ультрафіолетовим спектрами.
Як формуються зображення: - коли світло відбивається від предмета на плівці, датчику або сітківці.
Ось як працюють наші очі, використовуючи бар’єр, щоб перекрити більшу частину вогнів, залишаючи невеликий отвір, через яке світло може проходити, і називається діафрагмою, і воно утворює сильно сфокусоване зображення і є робочою моделлю для камери з отворами, але в камері з отвором є проблема, що така сама кількість світла буде потрапляти в діафрагму, яка не може бути придатною для сформованого фільму або зображення, також ми не можемо отримати сфокусоване зображення, щоб сфокусувати зображення, яке ми потрібно рухати плівку вперед-назад, але це проблематично у багатьох ситуаціях.
Або ми можемо вирішити цю проблему, використовуючи лінзи, це дозволяє нам контролювати розмір діафрагми, а на фотографії, відоме як f Stop, зазвичай нижче значення f Stop краще у фотографії.
Розмір діафрагми також дозволяє нам потрапити в приємну глибину різкості, яку у фотографії називають Боке, це дозволяє нам мати розмитий фон, коли ми фокусуємось на зображенні.
Як комп’ютер зберігає зображення
Можливо, ви чули про різні формати зображень, такі як.png,.jpgG та ін. Все це цифрове представлення нашого аналогового світу, комп’ютери роблять це, перекладаючи зображення в цифровий код для зберігання, а потім інтерпретують файл назад у зображення для дисплей. Але в основному вони використовують загальну платформу для зберігання зображень, і це стосується і openCV.
OpenCV за замовчуванням використовує кольоровий простір RGB (червоний, зелений та синій) для своїх зображень, де кожна піксельна координата (x, y) містить 3 значення, що варіюються від інтенсивності у 8-бітовій формі, тобто (0-255, 2 8).
Поєднання різних інтенсивностей кожного кольору дає нам повний спектр, ось чому в живописі або мистецтві ці три кольори розглядаються як основні кольори, а всі інші як вторинні, оскільки більшість вторинних кольорів можуть утворюватися основними кольорами. Як і для жовтого, ми маємо такі значення: Червоний - 255; Зелений - 255; Синій - 0.
Тепер зображення зберігаються у багатовимірних масивах. У програмуванні масив - це серія колекцій об’єктів. І тут ми маємо справу з трьома типами масивів 1D, 2D та 3D, де „D“ означає розмірність.
Кольорові зображення зберігаються у тривимірних масивах, де третій розмір представляє кольори RGB (що ми побачимо пізніше), і в сукупності вони утворюють різну інтенсивність пікселів для зображення, тоді як чорно-білі зображення зберігаються у двовимірних масивах а також є два типи чорно-білих зображень у відтінках сірого та бінарні зображення.
Зображення у відтінках сірого формуються із відтінків сірого двовимірного масиву, тоді як двійкові зображення мають пікселі чорного або білого кольорів.
Чому машині важко ідентифікувати зображення
Комп’ютерний зір сам по собі є складним завданням, ви можете собі уявити, як важко надати машині відчуття зору, впізнання та ідентифікації. Наведені нижче фактори роблять комп’ютерний зір настільки важким.
- Обмеження датчика камери та об'єктива
- Варіації точки зору
- Зміна освітлення
- Масштабування
- Оклюзії
- Варіації класу об’єктів
- Неоднозначні зображення / оптичні ілюзії
Застосування та використання OpenCV
Незважаючи на труднощі, Computer Vision має багато історій успіху
- Робототехнічна навігація - Самостійні машини
- Виявлення та розпізнавання обличчя
- Пошук зображень у пошуковій системі
- Читання номерних знаків
- Розпізнавання почерку
- Snapchat і фільтри для обличчя
- Розпізнавання об’єктів
- Відстеження м’яча та гравців у спорті
- Та багато іншого!
Встановлення OpenCV за допомогою Python та Anaconda
OpenCV написаний на C ++, але дуже важко реалізувати його на C ++, і тому ми вирішили реалізувати його мовою високого рівня як python, а також є додаткові переваги реалізації OpenCV з python, оскільки Python є однією з найпростіших мов для початківців Це також надзвичайно потужний приклад для обробки даних та машинного навчання, а також він зберігає зображення в масивах numpy, що дозволяє нам досить легко виконувати деякі дуже потужні операції.
Базове програмування корисно з використанням математики середнього шкільного рівня, веб-камерою, Python 2.7 або 3.6 (переважно пакет Anaconda).
Крок 1. Завантажте та встановіть пакет Anaconda Python
Перейдіть за посиланням: https://www.anaconda.com/download і виберіть, залежно від погоди вашої машини, її windows, Linux або mac, і ви можете вибрати версію python 2.7 або python 3.7 для 64-бітової системи або 32-бітної системи, але зараз на добу більша частина системи становить 64 біти.
Поширення python від Anaconda постачається разом зі студією Spyder, ноутбуками jupyter та підказкою anaconda, що робить python надзвичайно зручним у використанні. Для використання прикладів ми б використовували spyder studio.
Вибір між python 2.7 або 3.7 є абсолютно нейтральним, однак для прикладів ми б використовували python 3.7, оскільки це майбутнє python і перейде на python 2.7 з 2020 року, також більшість бібліотек розробляються в python 3.7 майбутній аспект python на увазі. Крім того, він також дає очікувані результати щодо основних математичних операцій, таких як (2/5 = 2.5), тоді як python 2.7 оцінить його як 2. Також друк розглядається як функція в python 3.7 (print ("привіт")), тому це дає практичні програми програмістам.
Крок 2. Створення віртуальної платформи за допомогою OpenCV
Ми збираємось встановити OpenCV, створивши віртуальну платформу для шпигуна, використовуючи підказку Anaconda та завантажений тут файл YML.
За допомогою файлів YML ми встановимо всі необхідні пакунки та бібліотеки, однак, якщо ви хочете встановити будь-які додаткові пакети, ви можете легко встановити їх за допомогою підказки anaconda, запустивши команду цього пакета.
Перейдіть до піктограми пошуку Windows і знайдіть термінал підказки anaconda, ви можете знайти його у вашій щойно встановленій папці anaconda.
Потім вам потрібно знайти завантажений файл YML, і звідси у вас є два варіанти: або змінити каталог вашого терміналу на місце, де завантажується ваш файл YML, або скопіювати ваш файл YML в каталог, де найбільше встановлена ваша анаконда у випадках, коли це буде всередині диска C: \, після копіювання вашого файлу YML у вказане розташування ЗАПУСКАЙТЕ наступну команду у своєму запиті
conda env create –f virtual_platform_windows.yml
Оскільки моя система працює на вікнах, файл YML і команда відповідає вікнам, однак ви можете змінити відповідно до вашої системи, замінивши windows на linux або mac відповідно.
Примітка: - Якщо вилучення пакету видає помилку, спочатку встановіть pytorch і numpy, а потім запустіть наведену вище команду.
Тепер знайдіть навігатор anaconda, і там буде випадаюче меню «Програми на ___», і звідти виберіть віртуальне середовище, а потім звідти ви повинні запустити Spyder studio.
І все, ви готові розпочати!
Відкриття та збереження зображень у OpenCV
Тут ми пояснюємо деякі основні команди та термінологію для використання Python у OpenCV. Ми дізнаємося про три основні функції в OpenCV imread, imshow та imwrite.
# коментарі в python подаються символом #
Імпортуйте opencv у python за командою
імпорт cv2
Завантажте зображення, використовуючи 'imread', вказавши шлях до зображення
image = cv2.imread ('input.jpg')
Тепер це зображення завантажується і зберігається в python як змінна, яку ми назвали зображенням
Тепер для відображення нашої змінної зображення ми використовуємо 'imshow', і першим параметром функції imshow є заголовок, що відображається у вікні зображення, і його потрібно ввести в (''), щоб представити ім'я у вигляді рядка
cv2.imshow ('привіт світ', зображення)
waitkey дозволяє нам вводити інформацію, коли вікно зображення відкрите; залишаючи його порожнім, він просто чекає натискання будь-якої клавіші перед продовженням, розмістивши цифри (крім 0), ми можемо вказати затримку, на скільки часу ви тримаєте вікно відкритим (час в мілісекундах тут).
cv2.waitKey ()
'знищення всіхWindows' закриває всі відкриті вікна, якщо не розмістити це, ваша програма зависне.
cv2.destroyAllWindows ()
, для цього ми будемо використовувати numpy, numpy - це бібліотека для програмування на python для додавання підтримки до великих багатовимірних масивів та матриць.
import cv2 #importing numpy import numpy як np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) #shape Функція дуже корисна, коли ми розглядаємо розміри масиву, це повертає кортеж, який дає розмір друку зображення (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
вихід консолі - (183, 275, 3), два розміри зображення складають 183 пікселі у висоту та 275 пікселів у ширину, а 3 означає, що є три інші компоненти (R, G, B), що створюють це зображення (воно показує що кольорові зображення зберігаються у тривимірних масивах).
print ('Висота зображення:', (image.shape, 'пікселі')) print ('Ширина зображення:', (image.shape, 'пікселі'))
вихід консолі - Висота зображення: (183, "пікселі")
Ширина зображення: (275, "пікселі")
Збереження відредагованого зображення в OpenCV
Ми використовуємо 'imwrite', щоб вказати ім'я файлу та зображення, яке потрібно зберегти.
cv2.imwrite ('output.jpg', image) cv2.imwrite ('output.png', image)
Перший аргумент - це ім'я файлу, який ми хочемо зберегти, {прочитати або зберегти файл, який ми використовуємо ('') для позначення його як рядок}, а другий аргумент - це ім'я файлу.
OpenCV дозволяє зберігати зображення в різних форматах.
Масштабування сірого зображення в OpenCV
Масштабування сірого - це процес, при якому зображення перетворюється із повнокольорового в сірі (чорно-білі)
У opencv багато функцій відображають зображення у відтінках сірого, перед обробкою. Це робиться тому, що це спрощує зображення, виконуючи майже функцію зменшення шуму та збільшуючи час обробки, оскільки на зображенні менше інформації (оскільки зображення у градаціях сірого зберігаються у двовимірних масивах).
імпортувати cv2 # завантажити наше вхідне зображення image = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () # ми використовуємо cvtcolor, щоб перетворити на градації сірого grey_image = cv2.cvtColor (image, cv2.COLOR_BGR2GREY) cv2.imshow ('відтінки сірого', сіре_зображення) cv2.waitKey () cv2.destroyALLWindows ()
Більш простий спосіб перетворити зображення у відтінки сірого - це просто додати аргумент 0 у функції imread в сторону до імені зображення
імпорт cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('відтінки сірого', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
import cv2 import numpy as np image = cv2.imread ('input.jpg') print (image.shape) cv2.imshow ('original', image) cv2.waitKey () grey_image = cv2.cvtColor (image, cv2.COLOR_BGR2GREY) cv2.imshow ('відтінки сірого', сіра_ізображення) print (grey_image.shape) cv2.waitKey () cv2.destroyALLWindows ()
Вихід консолі: - (183, 275, 3) - для кольорового зображення
(183, 275) - для зображення у відтінках сірого
Отже, це наочно показує, що кольорові зображення представлені тривимірними масивами, тоді як зображення в сірих масштабах - двовимірними масивами.
Кольорові простори
Кольорові простори - це спосіб збереження зображень. RGB, HSV, CMYK - це різні кольорові простори, це лише прості способи представити колір.
RGB - червоний, зелений та синій.
ВПГ - відтінок, насиченість та значення.
І CMYK зазвичай використовується в струменевих принтерах.
Колірний простір RGB або BGR
Колірним простором OpenCV за замовчуванням є RGB. RGB - це адитивна кольорова модель, яка генерує кольори, поєднуючи синій, зелений та червоний кольори різної інтенсивності / яскравості. У OpenCV ми використовуємо 8-бітову глибину кольору.
- Червоний (0-255)
- Синій (0-255)
- Зелений (0-255)
Однак насправді OpenCV зберігає колір у форматі BGR.
Цікавий факт: - Ми використовуємо порядок BGR у комп’ютерах через те, як 32-бітові цілі числа, що не мають підпису, зберігаються в пам’яті, і все-таки він зберігається як RGB. Ціле число, що представляє колір, наприклад: - 0X00BBGGRR буде збережено як 0XRRGGBB.
Кольоровий простір HSVHSV (відтінок, насиченість та значення / яскравість) - це кольоровий простір, який намагається зобразити кольори, які сприймає людина. Він зберігає інформацію про колір у циліндричному поданні кольорових точок RGB.
Відтінок - значення кольору (0-179)
Насиченість - яскравість кольору (0-255)
Значення - Яскравість або інтенсивність (0-255)
Формат кольорового простору HSV корисний для сегментації кольорів. У RGB фільтрування певного кольору непросте, однак HSV значно полегшує встановлення кольорових діапазонів для фільтрації конкретного кольору, як ми їх сприймаємо.
Відтінок представляє колір у HSV, значення відтінку коливається від 0 до 180, а не до 360, тому він не завершує повне коло, і тому він відображається інакше, ніж стандарт.
Фільтри кольорового діапазону
- Червоний - (165-15)
- Зелений - (45-75)
- Синій - (90-120)
Оскільки ми знаємо, що зображення зберігаються у кольоровому просторі RGB (червоний, зелений та синій), і тому OpenCV показує нам те саме, але перше, що слід пам’ятати про формат RGB у opencv, це те, що це насправді BGR, і ми можемо це дізнатись, подивившись на форма зображення.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # B, G, R значення для першого 0,0 пікселя B, G, R = друк зображення (B, G, R) друк (зображення.shape) # тепер, якщо ми застосуємо це до зображення у градаціях сірого Gray_img = cv2.cvtColor (image, cv2.COLOR_BGR2GREY) print (grey_img.shape) # grey_image Значення пікселя для друку 10,50 пікселів (grey_img)
Вихід консолі: друк (B, G, R) - 6 11 10
друк (image.shape) - (183, 275, 3)
друк (grey_img.shape) - (183, 275)
друк (grey_img) - 69
Зараз у зображенні сірого масштабу є лише два виміри, оскільки ми пам’ятаємо, що кольорове зображення зберігається у трьох вимірах, третім виміром є (R, G, B), тоді як у відтінках сірого лише два виміри, оскільки (R, G, B) відсутня, і для певного положення пікселя ми отримуємо лише одне значення, тоді як на кольоровому зображенні ми отримали три значення.
Ще одним корисним кольоровим простором є HSV
імпорт cv2 image = cv2.imread ('input.jpg') hsv_image = cv2.cvtColor (image, cv2.COLOR_BGR2HSV) cv2.imshow ('HSV image', hsv_image) cv2.imshow ('Hue channel', hsv_image) cv2. imshow ('канал насичення', hsv_image) cv2.imshow ('канал значення', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
Після запуску коду ви можете побачити чотири зображення, три з яких є окремими каналами, а одне - комбіноване зображення HSV.
Зображення каналу відтінку досить темне, оскільки його значення варіюється лише від 0 до 180.
Також зауважте, що функція imshow намагається показати вам зображення RGB або BGR, але перетворення HSV перекриває його.
Крім того, канал значення буде схожий на градації сірого зображення через свою яскравість.
Вивчення окремих компонентів зображення RGB
імпорт cv2 image = cv2.imread ('input.jpg') # функція розбиття opencv розбиває зображення на кожен індекс кольору B, G, R = cv2.split (зображення) cv2.imshow ("Червоний", R) cv2.imshow ("Зелений", G) cv2.imshow ("Синій", B) # створення оригінального зображення шляхом об'єднання окремих колірних компонентів merged = cv2.merge () cv2.imshow ("об'єднаний", об'єднаний) # підсилення об'єднаного синього кольору = cv2.merge () cv2.imshow ("об'єднано з посиленням синього", об'єднано) # представляє форму окремих кольорових компонентів. # вихідний результат має бути лише двовимірним, який повинен бути висотою і шириною, оскільки третім елементом компонента RGB є індивідуально представлений друк друку (B.shape) (R.форма) друк (G.shape) cv2.waitKey (0) cv2.destroyAllWindows ()
Висновок консолі: # розміри зображення із функції фігури
(183, 275)
(183, 275)
(183, 275)
Перетворення зображення в окремий RGB-компонент
У наведеному нижче коді ми створили матрицю нулів з розмірами зображення HxW, нуль повертає масив, заповнений нулями, але з однаковими розмірами.
Функція фігури дуже корисна, коли ми розглядаємо розмірність зображення, і тут ми зробили нарізання цієї функції фігури. Таким чином, фігура захоплює все до визначених точок, тобто до других позначених точок, які будуть висотою та шириною зображення, оскільки третя частина представляє RGB-компонент зображення, і нам вона тут не потрібна.
import cv2 import numpy as np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) нулі = np.zeros (image.shape, dtype = "uint8") cv2.imshow ("ЧЕРВОНИЙ", cv2.merge ()) cv2.imshow ("Зелений", cv2.merge ()) cv2.imshow ("Синій", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
Зображення гістограми зображення
Гістограмне зображення - це метод візуалізації компонентів зображень.
Наступний код дозволяє аналізувати зображення за допомогою кольорової гістограми його комбінованих та окремих кольорових компонентів.
import cv2 import numpy як np # нам потрібно імпортувати matplotlib, щоб створити графіки гістограм import matplotlib.pyplot як plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, None,,) # ми складаємо графік гістограма, ravel () розширює наш масив зображень plt.hist (image.ravel (), 256,) plt.show () # перегляд окремих кольорових каналів color = ('b', 'g', 'r') # ми знаємо відокремити колір і побудувати графік кожного в гістограмі для i, col в enumerate (color): гістограма2 = cv2.calcHist (,, None,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
Давайте розберемося в функції calcHist з кожним із її окремих параметрів
cv2.calcHist (зображення, канали, маска, гістограма , діапазони)
Зображення: це вихідне зображення типу uint 8 або float 32. Його слід подавати у квадратних дужках, тобто “”, що також вказує на його масив другого рівня, оскільки зображення для opencv - це дані у формі масиву.
Канали: він також подається у квадратних дужках. Це індекс каналу, для якого ми обчислюємо гістограму, наприклад, якщо введене зображення в градаціях сірого, це значення, для кольорових зображень, які ви можете передати, або для обчислення гістограми синього, зеленого та червоного каналів відповідно.
Маска: зображення маски. щоб знайти гістограму повного зображення, вона подається як “немає”. але якщо ви хочете знайти гістограму певної області зображення, вам потрібно створити для цього зображення маски і надати його як маску.
Histsize: Це представляє наш рахунок BIN. Потрібно подати в квадратних дужках для повного масштабу, який ми проходимо.
Діапазони: Це наш діапазон, як правило
Малювання зображень і фігур за допомогою OpenCV
Нижче наведено кілька прикладів для малювання ліній, прямокутника, багатокутника, кола тощо в OpenCV.
import cv2 import numpy як np # створення чорного квадратного зображення = np.zeros ((512,512,3), np.uint8) # ми також можемо створити це чорно-біле, однак ніяких змін image_bw = np.zeros не буде ((512,512), np.uint8) cv2.imshow ("чорний прямокутник (колір)", зображення) cv2.imshow ("чорний прямокутник (чорно-білий)", image_bw)
Лінія
# створити лінію над чорним квадратом # cv2.line (зображення, початкові координати, кінцеві координати, колір, товщина) # малювання діагональної лінії товщиною 5 пікселів image = np.zeros ((512,512,3), np.uint8) cv2.line (зображення, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("синя лінія", зображення)
Прямокутник
# створити прямокутник над чорним квадратом # cv2.rectangle (зображення, початкові координати, кінцеві координати, колір, товщина) # малювання прямокутника товщиною 5 пікселів image = np.zeros ((512,512,3), np.uint8) cv2.rectangle (image, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("прямокутник", зображення)
# створення кола над чорним квадратом # cv2.circle (зображення, центр, радіус, колір, заливка) image = np.zeros ((512,512,3), np.uint8) cv2.circle (image, (100,100), (50), (255127,0), - 1) cv2.imshow ("коло", зображення)
#creating the polygon image = np.zeros ((512,512,3), np.uint8) #lets визначимо чотири точки pts = np.array (,,,], np.int32) #lets тепер змінює наші точки у формі, необхідній полілінії pts = pts.reshape ((- 1,1,2)) cv2.polylines (зображення,, True, (0,255,255), 3) cv2.imshow ("багатокутник", зображення)
# введення тексту за допомогою opencv # cv2.putText (зображення, "текст для відображення", початкова точка завантаження зліва, шрифт, розмір шрифту, колір, товщина) image = np.zeros ((512,512,3), np.uint8) cv2. putText (image, "hello world", (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("hello world", image) cv2.waitKey (0) cv2.destroyAllWindows ()
Computer Vision та OpenCV - дуже великі теми для висвітлення, але цей посібник буде гарною відправною точкою для вивчення OpenCV та обробки зображень.