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

  1. чтение и запись изображений
  2. манипулирование каналом изображения
  3. изменить размер изображения
  4. такие фильтры, как: размытие по Гауссу и срединное размытие

Что такое имиджевый канал?

Прежде чем мы перейдем к техническим аспектам обработки изображений, давайте разберемся с каналами изображения. Для представления цветного пикселя нам нужны три цвета: красный, зеленый и синий. Таким образом, любой цвет на экране нашего компьютера может быть представлен с использованием этих трех цветов. Эти значения цвета в конечном итоге сохраняются в форме многомерного массива. Теперь, поскольку мы храним информацию о трех цветах для одного пикселя, он имеет 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, вы можете обратиться к нижеследующим блогам.





Приятного чтения 😃.