Начало работы с Opencv: введение и базовое использование | Команда JD Logistics Technology

1 Введение в Opencv

Opencv — классическая специализированная библиотека компьютерного зрения. Она поддерживает несколько языков, является кроссплатформенной и обладает мощными функциями. Opencv-Python предоставляет интерфейс Python для Opencv, позволяя пользователям вызывать C/C++ в Python для выполнения необходимых функций, обеспечивая при этом читаемость и эффективность работы.

Opencv был основан Греем Брэдски из Intel в 1999 году, а первая версия вышла в 2000 году. Вадим Писаревский присоединяется к Гэри Брэдски, чтобы управлять российской командой Intel по разработке программного обеспечения Opencv.

В 2005 году Opencv использовался в проекте Stanley, который выиграл конкурс DARPA Challenge 2005 года. Позже его активное развитие продолжилось при поддержке Willow Garage под руководством Гэри Брэдского и Вадима Писаревского. Opencv теперь поддерживает множество алгоритмов, связанных с компьютерным зрением и машинным обучением, и расширяется с каждым днем.

Opencv поддерживает несколько языков программирования, таких как C++, Python, Java и т. д., и может использоваться на различных платформах, таких как Windows, Linux, OS X, Android и IOS. Интерфейсы для высокоскоростных операций с графическими процессорами на базе CUDA и OpenCL также находятся в стадии активной разработки.

Opencv-Python — это API Python для Opencv, который сочетает в себе лучшие функции API Opencv C++ и языка Python.

1.1 Opencv-Python

Opencv-Python — специализированная библиотека, предназначенная для решения задач компьютерного зрения.
Python — язык программирования общего назначения, созданный Гвидованом Россумом. Он быстро стал очень популярным, главным образом из-за своей простоты и читаемости кода. Это позволяет программистам выражать идеи в меньшем количестве строк кода без снижения читаемости.

По сравнению с такими языками, как C/C++, Python медленнее. Тем не менее, Python можно легко расширить с помощью C/C++, что позволяет нам писать ресурсоемкий код на C/C++ и создавать оболочки Python, которые можно использовать в качестве модулей Python. Это дает нам два преимущества: во-первых, код работает так же быстро, как исходный код C/C++ (поскольку это реальный код C++, работающий в фоновом режиме), и, во-вторых, на Python легче писать код, чем на C/C++. Opencv-Python — это оболочка Python для исходной реализации Opencv C++.

Opencv-Python использует Numpy, высокооптимизированную библиотеку для числовых операций с использованием языка в стиле MATLAB. Все структуры массивов Opencv преобразуются в массивы Numpy и обратно. Это также упрощает интеграцию с другими библиотеками, использующими Numpy, такими как Scipy и Matplotlib.

1.2 Области применения

  • Взаимодействие человека с компьютером
  • распознавание объектов
  • Сегментация изображений
  • распознавание лица
  • Распознавание действий
  • Спортивное отслеживание
  • робот
  • Спортивный анализ
  • машинное зрение
  • структурный анализ
  • безопасное вождение автомобиля

Как упоминалось выше, opencv очень мощный инструмент и отлично подходит для различных областей. От более мелких к более глубоким, на этот раз мы сначала представим соответствующие части редактирования изображений и простое буквенно-цифровое распознавание. В будущем мы продолжим распознавание лиц, сегментация изображений и распознавание изображений, позиционирование и другие функции;

2 установка и использование opencv-python

Сначала нам нужно установить среду

  1. python3: Установите python3: руководство по Python содержит подробные инструкции, веб-сайт устанавливает Python
  2. numpy: Установить numpy: pip install numpy
  3. opencv-python: установка opencv-python: pip install opencv-python

После установки opencv-python откройте интерактивную среду Python в командной строке: импорт cv2 успешен, что означает, что opencv-python успешно установлен.

2.1 imread()

Функция imread считывает цифровые изображения, для начала взгляните на определение этой функции на официальном сайте.

cv2.imread(path_of_image, intflag)

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

  • cv2.IMREAD_COLOR: Загрузка цветных изображений. Любая прозрачность изображения будет игнорироваться. это флаг по умолчанию
  • cv2.IMREAD_GRAYSCALE: загрузить изображение в режиме оттенков серого.
  • cv2.IMREAD_UNCHANGED: сохранить исходный цветовой канал считанного изображения.
  • 1: эквивалент cv2.IMREAD_COLOR
  • 0: эквивалент cv2.IMREAD_GRAYSCALE.
  • -1: эквивалент cv2.IMREAD_UNCHANGED
color_img = cv2.imread("image_file/1.jpeg")
print(color_img.shape)

gray_img=cv2.imread("image_file/1.jpeg", cv2.IMREAD_GRAYSCALE)
print(gray_img.shape)

#把单通道图像保存后,再读取,仍然是3通道,相当于将单通道复制到3个通道保存
cv2.imwrite("image_file/gray_1.jpeg",gray_img)

2,2 порог()

Функция этой функции заключается в бинаризации изображения.Бинаризация изображения заключается в установке значения серого пикселей на изображении равным 0 или 255, что означает, что все изображение представляет собой очевидный визуальный эффект только черного и белого. Бинаризация — один из простейших методов сегментации изображений. Бинаризация позволяет преобразовать изображения в оттенках серого в двоичные изображения. Бинаризация достигается путем установки шкалы серого для пикселей, превышающей определенное критическое значение шкалы серого, в качестве максимального значения шкалы серого и установки шкалы серого для пикселей, меньшей этого значения, в качестве минимального значения шкалы серого.

Нарисуйте пример

cv.threshold() используется для реализации пороговой сегментации.Функция имеет 4 параметра:

  • Параметр 1: Исходное изображение, подлежащее обработке, обычно представляет собой изображение в оттенках серого, которое также обрабатывается на предыдущем шаге.
  • Параметр 2: Установить порог
  • Параметр 3: Максимальный порог, обычно 255.
  • Параметр 4: Пороговый метод, существует 5 основных типов, а именно: THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC, THRESH_TOZERO и THRESH_TOZERO_INV.

Пример:
ret, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
ret, th2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)
ret, th3 = cv.threshold(img, 127) , 255, cv.THRESH_TRUNC)
ret, th4 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO)
ret, th5 = cv.threshold(img, 127, 255, cv.THRESH_TOZERO_INV)

titles = ['Original', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, th1, th2, th3, th4, th5]

Используйте Matplotlib для отображения
i в диапазоне (6):
plt.subplot(2, 3, i + 1)
plt.imshow(images[i], 'gray')
plt.title(titles[i], fontsize=8)
plt .xticks([]), plt.yticks([]) # Скрываем ось координат
plt.show()

Фактический результат:

Соответствующие официальные инструкции

2.3 морфологияEx()

Морфологические операции — это простые операции, основанные на форме изображения. Общие операции, выполняемые с двоичными изображениями. Необходимо ввести два параметра: один — исходное изображение, а второй называется элементом структурирования или ядром, которое используется для определения характера операции.

Двумя основными морфологическими операциями являются эрозия и дилатация. Их вариации представляют собой операции открытия и операции закрытия. Конкретные концепции заключаются в следующем:

1) Коррозия:

Подобно эрозии почвы, эта операция размывает границы объекта переднего плана (но передний план остается белым). Как это делается? Ядро свертки скользит по изображению.Если все значения пикселей исходного изображения, соответствующие ядру свертки, равны 1, то центральный элемент сохраняет исходное значение пикселя, в противном случае он становится нулевым.
Какое влияние это окажет? В соответствии с размером ядра свертки все пиксели, близкие к переднему плану, будут размыты (станут равными 0), поэтому объекты переднего плана станут меньше, а белая область всего изображения уменьшится. Это полезно для удаления белого шума, а также может использоваться для отключения двух связанных объектов и т. д.

2) Расширение:

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

3) Открытая операция:

Сначала он ржавеет, а затем расширяется. Удалить небольшие яркие пятна на изображении (CV_MOP_OPEN);

4) Закрытый режим

Сначала он расширяется, а затем разрушается. Удалить небольшие темные пятна на изображении (CV_MOP_CLOSE);

kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 8))
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv.imshow("MORPH_OPEN_1", opening)
cv2.waitKey(0)

kernel = cv.getStructuringElement(cv.MORPH_RECT, (1, 8))
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv.imshow("MORPH_OPEN_1", closing)
cv2.waitKey(0)

3 случая применения

Выше приведено простое использование opencv. Теперь давайте рассмотрим практический случай применения: идентификация проверочного кода. Фактически, в соответствии с тремя вышеуказанными шагами, изображение может быть обработано шаг за шагом, выделено серым цветом, преобразовано в бинарный код, открыто и, наконец, признан. Итак, сначала исходная картинка выглядит следующим образом:

1) Первый эффект обработки заключается в переводе изображения в оттенки серого и бинаризации для подготовки к извлечению контура.После бинаризации изображение становится либо черным, либо белым, что более удобно для операций открытия и закрытия.

src = cv2.imread('image_file/before.png')
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)
cv.imshow("Binarization", binary)
cv2.waitKey(0)

2) На основе приведенного выше двоичного изображения выполните операцию открытия результирующего изображения, чтобы удалить часть шума.

kernel = cv.getStructuringElement(cv.MORPH_RECT, (8, 1))
open_out = cv.morphologyEx(binl, cv.MORPH_OPEN, kernel)
cv.imshow("MORPH_OPEN_2", open_out)
cv2.waitKey(0)

3) Для последней обработки установите белый фон и определите идентификационный код изображения.

cv.bitwise_not(open_out, open_out)  
cv.imshow("Transform", open_out)
textImage = Image.fromarray(open_out)
text = pytesseract.image_to_string(textImage)  
cv2.waitKey(0)

4) Наконец, распечатайте проверочный код.

4 Резюме

Я считаю, что после внимательного прочтения приведенных выше пунктов знаний opencv-python стал владеть основными операциями с изображениями. Далее мы познакомим вас с некоторыми другими концепциями цифровых изображений, так что следите за обновлениями ~

Автор: JD Logistics Чжан Вэйнань

Источник: Сообщество разработчиков JD Cloud Ziyuanqishuo Tech. При перепечатке указывайте источник.

Лэй Цзюнь: Официальная версия новой операционной системы Xiaomi ThePaper OS уже упакована. Всплывающее окно на странице лотереи приложения Gome App оскорбляет ее основателя. Ubuntu 23.10 официально выпущена. Вы также можете воспользоваться пятницей, чтобы обновиться! Эпизод с выпуском Ubuntu 23.10: ISO-образ был срочно «отозван» из-за содержания разжигающих ненависть высказываний. 23-летний аспирант исправил «призрачную ошибку» 22-летней давности в Firefox. Вышла версия удаленного рабочего стола RustDesk 1.2.3, улучшенный Wayland для поддержки версии TiDB 7.4: официальная совместимость с MySQL 8.0. После отключения USB-приемника Logitech произошел сбой ядра Linux. Мастер использовал Scratch для очистки симулятора RISC-V и успешно запустил ядро ​​Linux. JetBrains запустила Writerside, инструмент для создания технической документации.
{{o.name}}
{{м.имя}}

рекомендация

отmy.oschina.net/u/4090830/blog/10119720
рекомендация