Посібник для початківців з обробки зображень за допомогою OpenCV та Python

Вихідний вузол: 1074439

Ця стаття була опублікована як частина Блогатон науки про дані

Вступ

Усередині зображення може бути приховано багато інформації, і ми могли б інтерпретувати її по -різному та з різних точок зору. Отже, що таке імідж і як з ним поводитися? Простими словами, можна сказати, що зображення - це візуальне зображення чогось, і з ним можна легко впоратися за допомогою комп’ютерного зору (з точки зору машинного навчання). А як щодо відео? Відео можна описати як запис рухомого набору зображень або безперервних кадрів. Але ми можемо мати справу з відео за допомогою комп’ютерного зору в іншому блозі! 🙂

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

Обробка зображень за допомогою OpenCV | комп’ютерний зір

Зображення 1

Як людина, яка зараз читає цей пост, ви зможете розрізняти речі чи елементи, наявні на зображенні. Але як щодо машин? Чи могли вони побачити і подумати, щоб відрізнити його самостійно? НЕМАЄ? то давайте змусимо вашу машину це зробити.

У цьому блозі ви б ознайомилися з основами комп’ютерного зору за допомогою python.

Я вважаю, що ви вже встановили Python Shell/Jupyter Notebook/PyCharm або Visual Studio Code (щоб назвати декілька) для програмування на python. Давайте встановимо широко розповсюджений пакет (OpenCV) для початку, і ми збираємось запускати коди в кожній клітинці в блокноті Jupyter.

Встановлення пакета OpenCV для попередньої обробки зображень

OpenCV-це заздалегідь створена бібліотека (пакет) із процесором із відкритим вихідним кодом, яка широко використовується для програм комп’ютерного зору, машинного навчання та обробки зображень. Він підтримує велику кількість мов програмування, включаючи Python.

Встановіть пакет OpenCV за допомогою:

pip встановити opencv-python

OR

pip встановити opencv-contrib-python

Виконайте будь -яку з цих команд на своєму терміналі, або якщо ви використовуєте Anaconda Navigator - Jupyter Notebook, ви можете змінити “pip” за допомогою команди “conda” та встановити її.

Імпорт пакета

Що таке пакет у Python? Пакет у Python-це сукупність модулів, які містять заздалегідь написані сценарії. Ці пакети допомагають нам імпортувати модулі повністю або навіть окремо. Ми можемо імпортувати пакет, викликавши модуль “cv2” таким чином:

імпорт cv2

Читання зображення

Цифрові зображення можна класифікувати на; кольорові зображення, зображення сірого кольору, двійкові зображення та багатоспектральні зображення. Кольорове зображення містить інформацію про колір для кожного пікселя. Зображення, що мають єдиний колір відтінків сірого, є зображеннями у відтінках сірого, тоді як двійкове зображення має точно два кольори, переважно чорно -білі пікселі. Мультиспектральні зображення - це зображення, які фіксують дані зображення, що розкидаються по електромагнітному спектру в межах певної довжини хвилі.

Повернемося до частини кодування та прочитаємо зображення, наприклад, зображення показано нижче:

читання зображення | Обробка зображень за допомогою OpenCV

Це зображення мандрили. Я зараз читаю зображення із свого локального каталогу.

# cv2.imread (path_to_image_with_file_extension, прапор)

Код використання виглядає так:

img = cv2.imread ("mandrill.jpg", 1)

Тут ми використовуємо метод “imread” пакета cv2 для читання зображення, і перший параметр відповідає шляху до зображення з його ім’ям файлу та розширенням, а другий - це прапор, який ви можете встановити, який вказує шлях, як читати на зображенні. Якщо хочете, ви можете замінити абсолютний шлях до зображення тут і спробувати прочитати його зі свого локального комп’ютера чи навіть з Інтернету! Якщо зображення присутнє у вашому поточному робочому каталозі, вам потрібно лише вказати ім’я зображення з його типом розширення.

Що стосується другого параметра, якщо вам подобається читати його як зображення у відтінках сірого, ви можете вказати параметр 0, -1 для читання зображення як незмінного (читає зображення як альфа -канал або канал прозорості, якщо він є) і за замовчуванням це 1, як кольорове зображення. Ви також можете спробувати інші параметри за цим посиланням:

https://docs.opencv.org/4.5.2/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80

під ImreadModes.

Властивості зображення

Форма:

Кожне зображення має форму. Довжина кордонів, зображених на малюнку, може називатися формою, тобто висотою та шириною. Тепер, коли ви знаєте, як читати зображення, як щодо того, щоб ми перевірили його форму?

друк (img.shape)

є основним способом друку форми зображення, але ми можемо витягти форму, використовуючи:

h, w, c = img.shape print ("Розміри зображення: nnHeight:", h, "pixelsnWidth:", w, "pixelsnКількість каналів:", c)

щоб краще зрозуміти.

Для кольорового та незмінного режиму він повертав би 3 значення, включаючи висоту, ширину та кількість каналів, наявних на зображенні. Якщо ви використовували режим відтінків сірого, форма буде 2, яка поверне висоту та ширину зображення, але тоді вам просто доведеться використовувати лише змінні h та w (виключити за допомогою “c”), інакше ви можете отримати помилка значення, яка говорить «недостатньо значень для розпакування (очікується 3, отримано 2)».

Тип:

Ми можемо дізнатися тип зображення за допомогою методу “type”. Використання цього методу допомагає нам дізнатися, як представлені дані зображення. Запустіть код наступним чином:

друк (тип (img))

Результат може бути таким:

як тип зображення. Це багатовимірний контейнер предметів одного типу та розміру. Ви можете звернутися до N-вимірного масиву за цим посиланням:

https://numpy.org/doc/stable/reference/arrays.ndarray.html

Тип даних зображення, яке ви щойно прочитали:

Оскільки зображення є N-мірним масивом, ми можемо перевірити тип даних зображення:

друк (img.dtype)

Значення пікселів зображення:

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

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

Значення пікселів зображення | Обробка зображень за допомогою OpenCV

Зображення 2

Ця картина швидше є прикладом того, як виглядає матричне зображення зображення. Зліва - зображення Лінкольна, посередині значення пікселів позначені цифрами від 0 до 255, що позначають їх інтенсивність або яскравість, а праворуч - числа у матриці. Кожне значення в матриці відповідає пікселю, який є найменшим елементом інформації, присутнім на зображенні. Перевірте значення пікселів зображення, просто надрукувавши змінну, в яку ви завантажили зображення!

друк (img)

Роздільна здатність зображення:

Роздільну здатність зображення можна визначити як кількість пікселів, наявних у зображенні. Якість зображення підвищується при збільшенні кількості пікселів. Раніше ми бачили форму зображення, яка дає кількість рядків і стовпців. Це можна сказати як роздільну здатність цього зображення. Деякі стандартні роздільні здатності полягають у тому, що майже всі знають, що це 320 x 240 пікселів (переважно підходять для пристроїв з невеликим екраном), 1024 x 768 пікселів (підходить для перегляду на стандартних комп’ютерних моніторах), 720 x 576 пікселів (добре для перегляду на телевізорі стандартної чіткості) набори із співвідношенням сторін 4: 3), 1280 x 720 пікселів (для перегляду на широкоформатних моніторах), 1280 x 1024 пікселів (добре для перегляду на повноекранному розмірі на РК-моніторах із співвідношенням сторін 5: 4), 1920 x 1080 пікселів (для перегляду на телевізорах HD), і тепер у нас навіть є роздільна здатність 4K, 5K та 8K, які складають 3840 x 2160 пікселів, 5120 × 2880 пікселів та 7,680 x 4,320 пікселів відповідно, які підтримуються моніторами та телевізорами надвисокої чіткості.

Коли ми помножимо кількість стовпців і кількість рядків, ми можемо отримати загальну кількість пікселів, наявних на зображенні. Наприклад, на зображенні 320 x 240 загальна кількість присутніх у ньому пікселів становить 76,800 XNUMX пікселів.

Перегляд зображення

Давайте подивимося, як відобразити зображення у вікні. Для цього нам потрібно створити вікно графічного інтерфейсу для відображення зображення на екрані. Першим параметром має бути заголовок вікна вікна графічного інтерфейсу, зазначений у форматі рядка. Ми можемо показати зображення у спливаючому вікні за допомогою методу cv2.imshow (). Але, коли ви намагаєтесь закрити його, ви можете відчути, що його вікно застрягло. Тому для боротьби з цим ми можемо використовувати простий метод «waitKey». Спробуйте цю частину коду в новій клітинці:

cv2.imshow ('Mandrill', img) k = cv2.waitKey (0) якщо k == 27 або k == ord ('q'): cv2.destroyAllWindows ()

Тут ми вказали параметр "0" у "waitKey", щоб тримати вікно відкритим, поки ми його не закриємо. (Ви також можете вказати час у мілісекундах, а не 0, вказавши, скільки часу він повинен бути відкритий.) Після цього ми можемо призначити змінній дію для закриття вікна, коли ми натискаємо клавішу 'ESC' або клавішу ' q '. Метод cv2.destroAllWindows () використовується для закриття або видалення вікон графічного інтерфейсу з екрана/пам'яті.

Збереження зображення

Перш ніж зберегти зображення, як щодо перетворення зображення у відтінки сірого, а потім його збереження? Перетворіть зображення у відтінки сірого за допомогою:

сірий = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)

Тепер ми можемо зберегти зображення:

cv2.imwrite ('Mandrill_grey.jpg', сірий)

та перевірте зображення, яке зберігається у поточному робочому каталозі. Перший параметр відповідає назві файлу, в якому буде збережено зображення, а другий параметр - це змінна, що містить зображення (інформація про пікселі).

Видобування бітових площин зображення та їх реконструкція

Ми можемо розділити зображення на різні рівні бітових площин. Наприклад, розділіть зображення на 8-бітові (0-7) площини, де останні кілька площин містять більшість інформації для зображення.

бітові плани

Зображення 3

Для цього ми можемо імпортувати ще два пакети:

імпортувати matplotlib.pyplot як plt імпортувати numpy як np

Якщо ви отримаєте помилку під час імпорту будь -якого з пакетів, ви можете встановити їх за допомогою:

conda install -c conda -forge matplotlib conda install -c anaconda numpy

Тепер ми визначаємо функцію для вилучення кожної з 8 бітових площин зображення.

def Extra_bit_plane (cd): # вилучення всіх бітів по одному # з 1 -го по 8 -й у змінній # від c1 до c8 відповідно c1 = np.mod (cd, 2) c2 = np.mod (np.floor (cd/2) , 2) c3 = np.mod (np.floor (cd/4), 2) c4 = np.mod (np.floor (cd/8), 2) c5 = np.mod (np.floor (cd/16 ), 2) c6 = np.mod (np.floor (cd/32), 2) c7 = np.mod (np.floor (cd/64), 2) c8 = np.mod (np.floor (cd/ 128), 2) # об'єднання зображення знову для формування еквівалента вихідного зображення у відтінках сірого cc = 2 * (2 * (2 * c8 + c7) + c6) # реконструювання зображення з 3 найбільш значущими бітовими площинами to_plot = [cd, c1, c2 , c3, c4, c5, c6, c7, c8, cc] рис, осі = plt.subplots (nrows = 2, ncols = 5, figsize = (10, 8), subplot_kw = {'xticks': [], ' yticks ': []}) fig.subplots_adjust (hspace = 0.05, wspace = 0.05) для ax, i in zip (axes.flat, to_plot): ax.imshow (i, cmap =' grey ') plt.tight_layout () plt.show () повернути cc

Тепер ми готові викликати функцію.

відновлене зображення = витяжний біт_план (сірий)

Ми реконструювали зображення (майже подібне), використовуючи останні три бітові площини, тобто шосту, сьому та восьму площини. І результат виглядає так:

реконструювати зображення | Обробка зображень за допомогою OpenCV

Як щодо того, щоб ми самі створили невеликий образ? Спробуємо зараз!

Побудова невеликого синтетичного образу

Ми можемо спробувати створити синтетичне зображення, що містить чотири концентричні квадрати з чотирма різними значеннями інтенсивності пікселів,

40, 80, 160 та 220.

con_img = np.zeros ([256, 256]) con_img [0:32,:] = 40 # верхній рядок con_img [:,: 32] = 40 # лівий стовпець con_img [:, 224: 256] = 40 # правий стовпець con_img [224 :,:] = 40 # нижній рядок con_img [32:64, 32: 224] = 80 # верхній рядок con_img [64: 224, 32:64] = 80 # лівий стовпець con_img [64: 224, 192: 224] = 80 # правий стовпець con_img [192: 224, 32: 224] = 80 # нижній рядок con_img [64:96, 64: 192] = 160 # верхній рядок con_img [96: 192, 64:96] = 160 # лівий стовпець con_img [96: 192, 160: 192] = 160 # правий стовпець con_img [160: 192, 64: 192] = 160 # нижній рядок con_img [96: 160, 96: 160] = 220 plt.imshow (con_img)

Отримане зображення буде виглядати так:

вихід

Ми можемо подивитися на використання різних фільтрів та перетворень на зображеннях в іншій статті.

Дякуємо, що прочитали статтю.

мем

Зображення 4

Не соромтеся додавати свої пропозиції під коментарями і поділіться, якщо вам сподобається ця стаття. Повний код програмування Python у блокноті Jupyter, згаданий у цій статті, доступний у моєму сховищі Github:

https://github.com/jissdeodates/Beginner-s-Guide-to-Computer-Vision

Список використаної літератури:

  1. Зображення 1-https://seevisionc.blogspot.com/2013/09/computer-vision-is-everywhere.html
  2. Зображення 2- https://towardsdatascience.com/everything-you-ever-wanted-to-know-about-computer-vision-heres-a-look-why-it-s-so-awesome-e8a58dfb641e
  3. Image 3- https://nptel.ac.in/content/storage2/courses/117104069/chapter_8/8_13.html
  4. Зображення 4- https://memegenerator.net/instance/21508026/willy-wonka-oh-so-you-created-a-computer-vision-algorithm-you-must-never-lose-the-remote

https://docs.opencv.org/4.5.2/d1/dfb/intro.html

https://docs.opencv.org/4.5.2/db/deb/tutorial_display_image.html

Носії, показані в цій статті, не належать Analytics Vidhya і використовуються на розсуд автора.

Джерело: https://www.analyticsvidhya.com/blog/2021/09/a-beginners-guide-to-image-processing-with-opencv-and-python/

Часова мітка:

Більше від Аналітика Vidhya