«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Введение в компьютерное зрение с помощью Python (часть 1)

Введение в компьютерное зрение с помощью Python (часть 1)

Опубликовано 5 ноября 2024 г.
Просматривать:872

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

Что такое изображение?

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

  • Двоичный: изображение в этом формате представлено одной двумерной матрицей со значениями 0 (черный) и 1 (белый). Это простейшая форма представления изображения.

Introduction To Computer Vision with Python (Part 1)

  • Шкала серого: в этом формате изображение представлено одной двумерной матрицей со значениями в диапазоне от 0 до 255; где 0 представляет черный цвет, а 255 — белый. Промежуточные значения представляют различные оттенки серого.

Introduction To Computer Vision with Python (Part 1)

  • Шкала RGB: здесь изображение представлено тремя двумерными матрицами (по одной для каждого цветового канала: красного, зеленого и синего) со значениями в диапазоне от 0 до 255. Каждая матрица содержит значения пикселей для один цветовой компонент, а объединение этих трех каналов дает нам полноцветное изображение.

Introduction To Computer Vision with Python (Part 1)

Фильтры

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

Средние фильтры

Средний фильтр используется для уменьшения шума путем усреднения значений пикселей в окне. Он заменяет центральный пиксель в окне средним значением всех пикселей в этом окне. Функция cv2.blur() применяет фильтр среднего значения с размером ядра 3x3, что означает, что она рассматривает окно пикселей 3x3 вокруг каждого пикселя для вычисления среднего значения. Это помогает сгладить изображение.

import cv2
import matplotlib.pyplot as plt

image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE)

# Applies a Mean Filter of size 3 x 3
blurred_image = cv2.blur(image, (3, 3))

plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis("off")

plt.subplot(1, 2, 2)
plt.imshow(blurred_image, cmap='gray')
plt.title('Mean Filtered Image')
plt.axis("off")
plt.show()

Introduction To Computer Vision with Python (Part 1)

Медианные фильтры

Медианный фильтр используется для уменьшения шума путем замены значения каждого пикселя медианным значением всех пикселей в окне. Он особенно эффективен при удалении шума «соль и перец». Функция cv2.medianBlur() применяет медианный фильтр с размером ядра 3. Этот метод заменяет каждый пиксель медианным значением значений пикселей в его окрестностях, что помогает сохранить края при удалении шума. Здесь, чем больше размер ядра, тем более размытым становится изображение.

import cv2
import matplotlib.pyplot as plt

image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE)

# Applies a Median Filter with a kernel size of 3
blurred_image = cv2.medianBlur(image, 3)

plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis("off")

plt.subplot(1, 2, 2)
plt.imshow(blurred_image, cmap='gray')
plt.title('Median Filtered Image')
plt.axis("off")
plt.show()

Introduction To Computer Vision with Python (Part 1)

Пользовательские фильтры

Вы можете создавать собственные фильтры для применения определенных операций к вашим изображениям. Функция cv2.filter2D() позволяет применить к изображению любое пользовательское ядро. Функция cv2.filter2D() применяет к изображению собственное ядро ​​(фильтр). Ядро — это матрица, определяющая операцию, выполняемую над значениями пикселей. В этом примере ядро ​​улучшает определенные функции изображения на основе указанных значений.

import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE)

# Define a custom filter kernel
kernel = np.array([[2, -1, 5],
                   [-5, 5, -1],
                   [0, -1, 0]])

filtered_image = cv2.filter2D(image, -1, kernel)

plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(filtered_image, cmap='gray')
plt.title('Filtered Image')
plt.axis('off')

plt.show()

Introduction To Computer Vision with Python (Part 1)

Пороговое значение

Примечание: во фрагментах кода вы увидите _ , image при назначении порогового изображения. Это связано с тем, что функция cv2.threshold возвращает два значения: используемое пороговое значение и пороговое изображение. Поскольку нам нужно только изображение с пороговым значением, мы используем _, чтобы игнорировать пороговое значение.

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

Глобальное пороговое значение

Простое пороговое определение

Этот метод устанавливает фиксированное пороговое значение для всего изображения. Пикселям со значениями выше порогового значения присваивается максимальное значение (255), а для пикселей ниже — 0. Функция cv2.threshold() используется для простого определения порога. Пиксели с интенсивностью больше 127 становятся белыми (255), а пиксели с интенсивностью меньше или равными 127 — черными (0), создавая двоичное изображение.

import cv2
import matplotlib.pyplot as plt

image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE)

_, thresholded_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis("off")

plt.subplot(1, 2, 2)
plt.imshow(thresholded_image, cmap='gray')
plt.title('Thresholded Image')
plt.axis("off")
plt.show()

Introduction To Computer Vision with Python (Part 1)

Порог Оцу

Метод Оцу автоматически определяет оптимальное пороговое значение на основе гистограммы изображения. Этот метод минимизирует внутриклассовую дисперсию и максимизирует межклассовую дисперсию. Установив пороговое значение равным 0 и используя cv2.THRESH_OTSU, функция автоматически вычисляет лучшее пороговое значение для отделения переднего плана от фона.

import cv2
import matplotlib.pyplot as plt

image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE)

_, otsu_thresholded_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY   cv2.THRESH_OTSU)

plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis("off")

plt.subplot(1, 2, 2)
plt.imshow(otsu_thresholded_image, cmap='gray')
plt.title("Otsu's Thresholded Image")
plt.axis("off")
plt.show()

Introduction To Computer Vision with Python (Part 1)

Адаптивное пороговое значение

Среднее адаптивное пороговое значение

При использовании среднего адаптивного порога пороговое значение для каждого пикселя рассчитывается на основе среднего значения пикселей в локальной окрестности вокруг этого пикселя. Этот метод динамически регулирует порог в разных областях изображения. Функция cv2.adaptiveThreshold() вычисляет порог для каждого пикселя на основе среднего значения значений пикселей в локальном окружении 11x11. Постоянное значение 2 вычитается из этого среднего значения для точной настройки порога. Этот метод эффективен для изображений с переменным освещением.

import cv2
import matplotlib.pyplot as plt

image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE)

mean_adaptive_thresholded_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis("off")

plt.subplot(1, 2, 2)
plt.imshow(mean_adaptive_thresholded_image, cmap='gray')
plt.title('Mean Adaptive Thresholded Image')
plt.axis("off")
plt.show()

Introduction To Computer Vision with Python (Part 1)

Гауссово адаптивное пороговое значение

Адаптивное пороговое значение по Гауссу вычисляет пороговое значение для каждого пикселя на основе взвешенной по Гауссу суммы значений пикселей в локальной окрестности. Этот метод часто дает лучшие результаты в случаях с неравномерной освещенностью. В адаптивном пороге Гаусса порог определяется взвешенной по Гауссу суммой значений пикселей в окрестности 11x11. Постоянное значение 2 вычитается из этого взвешенного среднего значения для настройки порога. Этот метод полезен для обработки изображений с различным освещением и тенями.

import cv2
import matplotlib.pyplot as plt

image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE)

gaussian_adaptive_thresholded_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis("off")

plt.subplot(1, 2, 2)
plt.imshow(gaussian_adaptive_thresholded_image, cmap='gray')
plt.title('Gaussian Adaptive Thresholded Image')
plt.axis("off")
plt.show()

Introduction To Computer Vision with Python (Part 1)

Ссылки

  • Encord.com
  • Pyimagesearch.com
  • Пороговое значение OpenCV
  • Фильтрация OpenCV
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/thecspandz/introduction-to-computer-vision-with-python-part-1-2kd?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить это
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3