Руководство для начинающих по обработке изображений с помощью OpenCV и Python

Исходный узел: 1074439

Эта статья была опубликована в рамках Блогатон по Data Science

Введение

Внутри изображения может быть много информации, и мы можем интерпретировать ее по-разному и с разных точек зрения. Итак, что такое изображение и как с ним работать? Проще говоря, мы можем сказать, что изображение - это визуальное представление чего-либо, и с ним можно легко справиться с помощью компьютерного зрения (с точки зрения машинного обучения). А как насчет видео? Видео можно описать как запись движущегося набора изображений или непрерывных кадров. Но мы можем разобраться с видео с использованием компьютерного зрения в другом блоге! 🙂

Некоторые из вас, возможно, уже знают о компьютерном зрении и могут пропустить этот абзац, но для тех, кто не имеет представления об этом, компьютерное зрение, в основном известное в сокращенной форме `` резюме '', можно было бы назвать полем в Искусственный интеллект, который извлекает полезную информацию практически из всех областей современной эпохи, включая медицину, автомобилестроение, производство, сельское хозяйство и т. Д.

Обработка изображений с помощью OpenCV | компьютерное зрение

изображение 1

Как человек, который в настоящее время читает этот пост, вы сможете различать вещи или элементы, присутствующие на изображении. Но как насчет машин? Могли ли они увидеть и подумать, чтобы различить его самостоятельно? НЕТ? тогда давайте заставим вашу машину делать это.

В этом блоге вы познакомитесь с основами компьютерного зрения с использованием Python.

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

Установка пакета 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, «pixelnWidth:», w, «пикселейnNumber of Channels:», 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 x 2880 пикселей и 7,680 x 4,320 пикселей, соответственно, поддерживаемые мониторами и телевизорами сверхвысокой четкости.

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

Просмотр изображения

Давайте посмотрим, как отобразить изображение в окне. Для этого мы должны создать окно графического интерфейса пользователя, чтобы отображать изображение на экране. Первым параметром должен быть заголовок экрана окна графического интерфейса пользователя, указанный в строковом формате. Мы можем показать изображение во всплывающем окне с помощью метода 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 extract_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] fig, axes = plt.subplots (nrows = 2, ncols = 5, figsize = (10, 8), subplot_kw = {'xticks': [], ' yticks ': []}) fig.subplots_adjust (hspace = 0.05, wspace = 0.05) для ax, i в zip (axes.flat, to_plot): ax.imshow (i, cmap =' gray ') plt.tight_layout () plt.show () return cc

Теперь мы готовы вызвать функцию.

reconstructed_image = extract_bit_plane (серый)

Мы реконструировали изображение (почти подобное), используя последние три битовых плоскости, то есть шестую, седьмую и восьмую плоскости. И результат выглядит так:

восстановить изображение | Обработка изображений с помощью 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 Notebook, упомянутый в этой статье, доступен в моем репозитории 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/

Отметка времени:

Больше от Аналитика Видхья