Невозможно представить модель машинного обучения на основе изображений, будь то классификация, обнаружение или сегментация, без обработки изображений. Opencv с его широким набором функций дает нам все силы для предварительной обработки изображений. В этой статье мы рассмотрим основные функции opencv, которые включают в себя:
- чтение и запись изображений
- манипулирование каналом изображения
- изменить размер изображения
- такие фильтры, как: размытие по Гауссу и срединное размытие
Что такое имиджевый канал?
Прежде чем мы перейдем к техническим аспектам обработки изображений, давайте разберемся с каналами изображения. Для представления цветного пикселя нам нужны три цвета: красный, зеленый и синий. Таким образом, любой цвет на экране нашего компьютера может быть представлен с использованием этих трех цветов. Эти значения цвета в конечном итоге сохраняются в форме многомерного массива. Теперь, поскольку мы храним информацию о трех цветах для одного пикселя, он имеет 3 канала, не так ли просто. Пиксели в комбинации создают изображение, поэтому для представления изображения нам нужна вариация RGB, вот наш канал RGB.
Теперь, если изображение черно-белое, пиксель может быть представлен только двумя значениями 0 и 1, 0 для черного и 1 для белого или наоборот. Итак, и черно-белое изображение, или серое изображение является одноканальным изображением.
давайте перейдем к кодированию, чтобы насладиться некоторыми манипуляциями с изображениями.😃.
Полный код можно найти на моей странице github, https://github.com/sunnykumar1516/MachineLearning/blob/main/opencv_imagemanipulation1.0.ipynb
импортировать все библиотеки
давайте импортируем все библиотеки, которые мы собираемся использовать. Установите opencv в среду и импортируйте его. мы будем использовать matplotlib для отображения изображений.
import numpy as np import cv2 as cv %matplotlib inline import matplotlib.pyplot as plt import matplotlib.image as mpimg
Чтение и запись изображений
opencv имеет встроенные функции для чтения и записи изображений, но для отображения встроенных изображений мы будем использовать здесь matplotlib. «cv.imread()» считывает изображение из локального файла и для его отображения используется «cv.imshow()».
sampleImg = cv.imread('./data/batman.png') cv.imshow('sampleImg',sampleImg) cv.waitKey(0) cv.destroyAllWindows()
еще один способ чтения и отображения изображения — использование matlotlib. В приведенном ниже фрагменте я создал функцию, которая будет отображать изображение на основе пути к изображению.
def displayImage(path): img = mpimg.imread(path) imgplot = plt.imshow(img) plt.show()
Для записи изображения в локальный файл подходит вариант «cv.imwrite(‘img’,image)».
Управление каналом изображения
Изображение, которое мы отображали, является 3-канальным изображением, теперь давайте попробуем преобразовать его в серое изображение.
grayImage = cv.cvtColor(sampleImg, cv.COLOR_BGR2GRAY) cv.imwrite('./data/grayscale.jpg',grayImage)
давайте отобразим преобразованное изображение.
img = mpimg.imread('./data/grayscale.jpg') imgplot = plt.imshow(img,cmap='gray') plt.show()
Изменить размер изображения
Если у нас есть большое изображение, обычно нам нужно изменить его размер до стандартного формата для нашей модели. Представьте себе сценарий, в котором у нас есть набор данных изображения размером 1080p, если нам нужно передать его алгоритму ML, из-за лишнего пикселя возникают ненужные вычисления, здесь приходит на помощь операция изменения размера изображения « cv.resize(sampleImg, dim, interpolation = cv.INTER_AREA)» поможет нам в этом. Давайте прочитаем наш образец изображения и отобразим его форму.
sampleImg = cv.imread('./data/batman.png') print(sampleImg.shape)
ясно, что размер изображения равен ширине: 944, высоте: 1068 и каналу равен 3. Давайте изменим его размер до размера 150 * 150 . В cv.resize для операции передается изображение и его размер.
dim = (150,150) resized = cv.resize(sampleImg, dim, interpolation = cv.INTER_AREA) cv.imwrite('./data/resized.jpg',resized)
Фильтры изображений: размытие по Гауссу и срединное размытие
Такие фильтры, как размытие по Гауссу и срединное размытие, пригодятся, когда нам нужно сгладить изображение. Кроме того, если на изображении много шума, сглаживание может помочь улучшить обработку.
Прежде чем перейти к кодированию, нам нужно понять ядра. Чтобы фильтры работали лучше, мы применяем ядра разного размера, для каждого изображения значение ядра будет варьироваться в зависимости от того, что мы хотим. Обычный подход к правильному значению ядра — пробный.
Применим размытие по Гауссу с разными ядрами.
kernel_blur = (5,5) blur = cv.GaussianBlur(sampleImg,kernel_blur,0) cv.imwrite('./data/blur.jpg',blur) displayImage('./data/blur.jpg')
Вы видите разницу до и после размытия по Гауссу.
Попробуем с более тяжелым ядром 0f (25*25)
похоже, разница очень очевидна от этого.
Медианное размытие можно применить таким же образом.
median = cv.medianBlur(sampleImg,15) cv.imwrite('./data/medianblur.jpg',median) displayImage('./data/medianblur.jpg')
заключение
В этой статье рассматриваются основы работы с изображениями с использованием opencv и python. если вас интересуют более сложные темы, такие как обнаружение границ и интеграция opencv с ios, вы можете обратиться к нижеследующим блогам.
Приятного чтения 😃.