Эта статья была впервые опубликована на:Уокер ИИ
OpenCV — это кроссплатформенная библиотека программного обеспечения для компьютерного зрения и машинного обучения, выпущенная под лицензией BSD (с открытым исходным кодом), которая может работать в операционных системах Linux, Windows, Android и Mac OS. Он легкий и эффективный — он состоит из ряда функций C и небольшого количества классов C++, предоставляет интерфейсы для таких языков, как Python, Ruby и MATLAB, и реализует множество общих алгоритмов обработки изображений и компьютерного зрения.
OpenCV имеет широкий спектр приложений в сегментации изображений, распознавании лиц, распознавании объектов, отслеживании движения, анализе движения, машинном зрении и других областях.
Ниже приведены основные операции OpenCV и случаи его применения.
1. Базовая работа OpenCV
1.1 Операции чтения, отображения и сохранения
import cv2
image = cv2.imread("test.jpg") # 读取操作
cv2.imshow("test", image) # 显示操作
cv2.waitKey() # 等待按键
cv2.imwrite("save.jpg") # 保存操作
1.2 Изменение цветового пространства
image = cv2.imread("test.jpg")
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 转换到HSV空间
hls = cv2.cvtColor(image, cv2.COLOR_BGR2HLS) # 转换到HLS空间
lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab) # 转换到Lab空间
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换到GRAY空间(灰度图)
Параметры цвета в модели HSV: оттенок (H), насыщенность (S) и яркость (V) Эта модель часто используется для сегментации зеленого экрана.
При обнаружении изображений выборки могут быть преобразованы в цветовое пространство для повышения качества данных, например, прямого преобразования обучающих данных в пространство HSV или настройки размера канала V (яркости), изменения света и оттенка изображения и затем перевод в формат BGR.
1.3 Геометрические преобразования -- масштабирование, перемещение, вращение
А. Увеличить
image = cv2.imread("test.jpg")
resize = cv2.resize(image, (), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA) # 长宽缩小到0.5倍
б. Пан
При переводе изображения необходимо создать матрицу преобразования со строками 2 и столбцами 3. Матрица M указывает, что перемещение в горизонтальном направлении равно x, а расстояние перемещения в вертикальном направлении равно y.
import cv2
import numpy as np
image = cv2.imread("test.jpg")
rows, cols, channels = image.shape
M = np.float32([[1,0,100],[0,1,50]])
res = cv.warpAffine(image, M, (cols, rows))
в. Повернуть
Матрица преобразования, необходимая для поворота, может быть получена функцией cv2.getRotationMatrix2D.
image = cv2.imread('test.jpg')
rows, cols, channels = image.shape
rotate = cv2.getRotationMatrix2D((rows*0.5, cols*0.5), 45, 1) # 第一个参数:旋转中心点 第二个参数:旋转角度 第三个参数:缩放比例
res = cv2.warpAffine(image, rotate, (cols, rows))
1.4 Сглаживание — размытие, фильтрация
Операция фильтрации размытия удаляет из изображения шумы соли и перца, улучшает контрастность изображения, реализует обработку резкости и улучшает стереоскопический эффект.
image = cv2.imread('test.jpg')
blur = cv2.blur(image, (5, 5)) # 均值滤波 第二个参数是卷积核大小
median_blur = cv2.medianBlur(image, 5) # 中值滤波
gaussian_blur = cv2.GussianBlur(image, (5, 5)) # 高斯模糊
1.5 Дилатация, эрозия
А. Операции морфологии изображения
Морфологическая операция изображения представляет собой набор ряда операций обработки изображения, основанных на форме, в основном основанных на морфологической математике, основанной на теории множеств.
- Морфология имеет четыре основные операции: эрозия, расширение, открытие и закрытие.
- Расширение и эрозия являются наиболее часто используемыми морфологическими манипуляциями при обработке изображений.
- Расширение - это расширение выделенной части изображения, «расширение поля», и визуализация имеет большую выделенную область, чем исходное изображение. Эрозия означает, что выделенная часть исходного изображения размыта, «поле размыто», а визуализация имеет меньшую выделенную область, чем исходное изображение.
б) расширение и эрозия
Они могут выполнять различные функции, в основном следующие:
- удалить шум
- Разделите независимые элементы изображения и соедините соседние элементы изображения.
- Найдите очевидные максимумы или минимумы на изображении
- найти градиент изображения
image = cv2.imread("test.jpg")
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3)) # 获取卷积核
eroded = cv2.erode(image, kernel) # 腐蚀图像
dilated = cv2.dilate(image, kernel) # 膨胀图像
c. Операции открытия и закрытия
- Открытая операция: эрозия, а затем расширение, используется для удаления пятен, образованных шумом изображения.
- Операция закрытия: расширение, а затем разрушение, используется для соединения объектов, которые были ошибочно разделены на множество мелких частей.
1.6 Найдите и нарисуйте контуры
А. Найдите контуры
Поиск контура имеет широкий спектр применений в области обнаружения изображений, таких как поиск на изображении очевидных цветовых блоков, полос, краев объектов и т. д. Перед поиском контура изображение должно быть бинаризовано.
# opencv版本大于3
contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # 第一个参数:查找的二值图像 第二个参数:轮廓检索模式 第三个参数:轮廓近似方法
# 返回值contours为查找到的轮廓列表,hierarhy为轮廓之间的层级关系
Б. Нарисуйте контур
После нахождения контура можно нарисовать контур через функцию drawContours.
cv2.drawContours(temp,contours,-1,(0,255,0),3) # 第一个参数:画布,可以是原图 第二个参数:查找到的轮廓 第三个参数:-1表示全画 第四个参数:颜色 第五个参数:轮廓宽度
2. Инженерное применение OpenCV — обнаружение цветовых блоков
2.1 Предыстория проблемы
Экран игры будет выдавать различные цветные блоки из-за нехватки художественных ресурсов и багов программы.Обычные белые и фиолетовые.Как отсеять через программу такие ненормальные экраны и ускорить процесс тестирования?
2.2 Анализ проблемы
Путем наблюдения мы обнаружили, что аномалии цветовых блоков представляют собой относительно правильные прямоугольные изображения, а разница в цвете очевидна.Основываясь на этих характеристиках, мы можем легко отфильтровать цветовые блоки.
2.3 Программирование
а. Бинаризация изображения
Исключите другие цвета по значению канала RGB, чтобы получить черно-белое бинарное изображение.
import cv2
import numpy as np
image = cv2.imread("test.jpg")
b, g, r = cv2.split(self.image) # 分离B、G、R通道
b = np.where(b >= 250, 1, 0) # 找到G通道符合要求的像素点置1,不符合置0
g = np.where(g >= 250, 1, 0) # 找到G通道符合要求的像素点置1,不符合置0
r = np.where(r >= 250, 1, 0) # 找到G通道符合要求的像素点置1,不符合置0
gray = b + g + r # 将三个通道叠加成一个通道
gray = np.where(gray==3, 255, 0).astype(np.uint8) # 像素点为3的即为满足要求的点设置为白色,不符合设置为黑色
Б. Найдите контуры
Полученное черно-белое бинарное изображение сохраняется, поскольку другие позиции изображения, кроме цветового блока, также имеют позиции, близкие к цвету цветового блока, и их необходимо удалить.
Ища контур бинарного изображения, мы можем отфильтровать отдельные небольшие цветовые блоки.
contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # 获取轮廓及层级关系
в. Проверка профиля
Удалите небольшие цветовые блоки по периметру контура и площади, эти цветовые блоки, вероятно, будут точками с похожими цветами в извлеченной области нормалей.
def screen_contour(contour):
contour_area = cv2.contourArea(contour)
if contour_area > self.area_limit:
return True
return False
pass_contours = []
for contour in contours:
if screent_contour(contour):
pass_contours.append(contour)
Поскольку цветовой блок ближе к прямоугольнику, мы можем рассчитать ширину и высоту цветового блока через контур, а также оценить площадь цветового блока.Чем ближе площадь цветового блока к расчетной площади, обнаруженный цветовой блок ближе к прямоугольнику. С помощью этого метода вы можете отфильтровать самые неправильные цветовые блоки.
def screent_contour(contour):
width = np.max(contour[:,:,0]) - np.min(contour[:,:,0])
height = np.max(contour[:,:,1]) - np.min(contour[:,:,1])
block_area = width * heigh
contour_area = cv2.contourArea(contour)
slimier = cv2.contourArea(contour) / block_area
if slimier > self.simliar_rate:
return True
return False
pass_contours = []
for contour in contours:
if screent_contour(contour):
pass_contours.append(contour)
3. OpenCV и матрицы
Как OpenCV выполняет вышеуказанные операции?
3.1 Чтение изображения
Когда OpenCV считывает изображение, он преобразует информацию об изображении в матрицу.Матрица по умолчанию (высота, ширина, канал), а канал соответствует каналам B, G и R. Цвет каждого пикселя определяется по трем каналам вместе. , и соотношение между тремя основными цветами такое же, размер B, G, R представляет цветовое соотношение.
3.2 Преобразование цветового пространства
Преобразование цветового пространства заключается в преобразовании данных изображения из одного отношения представления в другое отношение представления.Например, преобразование цветового пространства BGR в HSV заключается в преобразовании исходного представления трех основных цветов в оттенок (H), насыщенность (S) , легкость (V), значение, представленное каждым каналом, изменилось.
С точки зрения информации камера преобразует информацию об освещении в цифровую форму (матрицу изображения) после сбора информации об освещении Преобразование цветового пространства заключается в преобразовании данных изображения из одного метода представления в другой метод представления, и преобразование информации также приведет к потере информации или введению шума.Например, когда камера собирает информацию об освещении, легко собрать шум соли и перца, отбрасывая некоторые полосы частот в информации об освещении, уменьшая четкость и т. д. Потеря информации также может произойти во время преобразования цветового пространства, например, при преобразовании цветного изображения в изображение в градациях серого. Обнаружение изображений и распознавание лиц в глубоком обучении предназначены для извлечения информации, которую мы хотим, из этой информации об изображении.
3.3 Математический смысл поворота изображения
При выполнении геометрического преобразования изображения нам необходимо предоставить матрицу преобразования.Как матрица выполняет эти операции?
Мы знаем, что матрица представляет собой своего рода пространственное отображение.Матрица nxm(вектор-столбец линейно независим) представляет отображение из n-мерного пространства в m-мерное пространство.Как показано на рисунке выше, пространство, где первый куб находится проходит через матрицу 3x3 Сопоставляется с пространством, где находится второй куб, и форма куба изменяется Например, пространство, где находится первый куб, отображается с пространством, где находится его тень через матрица 3x2, а куб сжат в плоскость.
Можно ли отобразить куб в сферу с помощью матрицы (диапазон действительных чисел)? Поскольку это представляет собой линейное преобразование, это невозможно.
Когда мы имеем дело с проблемами изображений, нам нужно отображать информацию из одного пространства в другое пространство.Из-за сложности проблемы линейное отображение не может удовлетворить требованиям, поэтому в глубоком обучении необходимо добавить функцию активации.
4. OpenCV и машинное обучение
Из анализа в предыдущем разделе мы обнаружили, что процесс обработки изображений заключается в поиске шаблонов из данных и преобразовании информации об изображении из одного представления в другое.Эта работа оказывается сильной стороной машинного обучения.Это данные изображения, текстовые данные , и аудиоданные.Для поиска закономерностей по данным используется машинное обучение.С точки зрения информации эти проблемы практически неразличимы.
openCV интегрировал множество алгоритмов машинного обучения, таких как K ближайших соседей (KNN), машины опорных векторов (SVM), деревья решений, случайные леса, Boost, логистическая регрессия, ANN и т. д.
Следующая картинка — это картинка, взятая из scikit-learn, которая наглядно показывает, как различные алгоритмы машинного обучения обрабатывают данные, С точки зрения макроэкономики, как преобразовывать информацию в разные пространства.
5. Рекомендация видеокниги
Из-за ограниченности места осталось еще много интересного, что нельзя перечислить по одному, рекомендую некоторые видео и книги для дегустации.
5.1 Линейная алгебра
3blue1brownСерия видеороликов «Суть линейной алгебры» интуитивно объясняет магию линейной алгебры с помощью анимации фигуративных изображений, и другие серии также великолепны.
«Математика для программистов 3: линейная алгебра» — тоже очень хороший учебник по линейной алгебре, после внимательного прочтения которого я многому научился.
5.2 Теория вероятностей
«Математика программиста 2 Вероятность и статистика» систематически объясняет знание вероятности и статистики.Если вы не очень хорошо понимаете линейную алгебру, рекомендуется сначала прочитать линейную алгебру.
5.3 OpenCV
«Изучение OpenCV» — очень хороший справочник.
PS: Для получения дополнительной технической галантереи, пожалуйста, обратите внимание на [Публичный аккаунт | xingzhe_ai] и обсудите с ходоками!