В статье вы узнаете, как выполнять простую обработку изображений с помощью OpenCv. Вы изучите основы обработки изображений и увидите, насколько мощной может быть обработка изображений даже без помощи машинного обучения. Как обычно, я ожидаю нулевого знания OpenCv, и если вы не программировали на языке python, прежде чем просмотрите мой учебник Python, чтобы запачкать руки с python.

Установки:

Вы можете установить opencv с их официального веб-сайта, но получение правильных зависимостей в соответствии с вашей ОС может потратить часть вашего драгоценного времени. Итак, вот умная альтернатива для вас, зарегистрируйтесь на kaggle, что займет не более 2 минут. Откройте свое ядро ​​в kaggle, в котором предустановлены все важные библиотеки науки о данных и машинного обучения, что избавит вас от головной боли при установке, чтобы вы могли сосредоточиться на самом деле.

Пример использования:

Вы являетесь исследователем компьютерного зрения в медицинском центре. Ваша задача - извлечь из изображения белую полосу с образцом крови пациента.

Исходный набор данных содержит около 50 изображений, на которых белая полоса может быть вертикальной, горизонтальной или под любым углом. Код отлично работает для всех изображений.

Импорт всех важных библиотек

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

Прочтите изображение

Изображение сохраняется в компьютере в виде матриц RGB (красный, зеленый, синий). Каждый пиксель состоит из некоторой комбинации значений этих трех матриц.

## read the image using OpenCv
image = cv2.imread('../input/IMG_3072.JPG')  ## your location
## show the image 
plt.imshow(image)

Это не то, что мы ожидали, вот поворот в том, что opencv хранит изображения в формате BGR, поэтому мы должны преобразовать его в правильный формат, который является RGB. В opencv есть прямые функции для преобразования цветовых схем.

rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(rgb)

Теперь мы конвертируем формат RGB в формат HSV (значение насыщенности оттенка). Потому что формат HSV отделяет яркость или интенсивность изображения от информации цветности или цвета. RGB не отделяет интенсивность цвета от цвета. Так что мы сможем разделить разные цвета. Так выглядит изображение HSV.

## use the covtColor function again 
hsv = cv2.cvtColor(rgb, cv2.COLOR_RGB2HSV)
plt.imshow(hsv)

Создайте МАСКУ:

Думайте о маске как о цветной прозрачной бумаге, представьте, что произойдет, если вы положите цветную прозрачную бумагу на изображение. Это увеличит часть изображения и уменьшит другую часть изображения, в зависимости от цвета прозрачной бумаги или маски. Итак, давайте посмотрим, как создать маску программно.

## first set the values of the minimum and maximum range and use cv2 ## inRange function 
mini = np.array([255,255,0])
maxi = np.array([255,255, 102])
## use the inRange function to build the mask 
mask1 = cv2.inRange(hsv, mini, maxi)
## Show the mask 
plt.imshow(mask1)

Как мы будем устанавливать эти числа, это скорее метод проб и ошибок, чем точная наука. Так что попробуйте несколько чисел, пока не получите их правильно. Вы можете просто погуглить «Различные цветовые диапазоны в opencv» для справки.

Маскирование изображения:

Теперь мы применим маску к нашему изображению и посмотрим, как будет выглядеть наше изображение после наложения маски. Перед применением маски преобразуйте цветовой формат маски из серого в RGB.

## use cvtColor to change the color format
rgb_mask = cv2.cvtColor(mask1, cv2.COLOR_GRAY2RGB)
## applying mask onto the RGB image
img = cv2.addWeighted(rgb_mask, 0.5, rgb, 0.5, 0)
plt.imshow(img)

Как видите, фон стал меньше, а интенсивность белого цвета изменилась.

Пороговое значение изображения:

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

## apply the threshold function onto the hsv image
ret,thresh2= cv2.threshold(hsv,127,255,cv2.THRESH_BINARY)
## thresh2 is our thresholded image
## show the thresholded image
plt.imshow(thresh2)

Рисование контуров:

Контуры - это просто замкнутая кривая того же цвета или интенсивности. Например, у вас есть изображение, состоящее из двух изображений квадратной формы. Как вы думаете, сколько контуров должно быть там? если вы думаете, что это два, вы ошибаетесь на 100%. Для этого конкретного изображения существует 275 контуров, так как на этом изображении присутствует шум, поэтому функция принимает эти маленькие пиксели также как замкнутую кривую и, в конечном итоге, имеет так много контуров, но мы найдем самый большой контур и используем его для разделения белая полоса от замаскированного изображения. Но прежде чем перейти к этому, давайте визуализируем, как мы рисуем контуры на изображении.

Для этой задачи мы возьмем изображение с пороговым значением, преобразуем его в изображение с оттенками серого, а затем применим функцию findContours, чтобы найти общее количество контуров. Функция findContours вернет три разные переменные, из которых нам будет полезна только переменная contours. Так как он содержит список всех контуров. Чтобы применить функцию findContours, мы должны сначала преобразовать изображение в формат оттенков серого.

## convert the image into grayscale format
rgbimg = cv2.cvtColor(thresh2, cv2.COLOR_HSV2RGB)
theimg = cv2.cvtColor(rgbimg, cv2.COLOR_RGB2GRAY)
## Now use findContours function to find all contours present in the ## image
## we will ignore first and last variables since only contours 
## variable will only be useful to our task.
_ , contours, _ = cv2.findContours(theimg, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
print(len(contours)       ##  275
## Find the biggest contour among the list of contours
## use max function to find the maximum value with respect to
## contour area
biggest_contour = max(contours, key = cv2.contourArea)
## plot the image with the rectangle
plt.imshow(image_with_rectangle)

Наконец, обрежьте изображение с заданными размерами прямоугольника.

crop_img = image_with_rectangle[y:y+h,x:x+w]
plt.imshow(crop_img)

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

Если вы нашли эту статью полезной и вам она понравилась, пожалуйста, аплодируйте. Также не стесняйтесь делиться им с друзьями и коллегами.

Вот высокоуровневый код этого блога в моем профиле Github. Вы также можете связаться со мной в Linkedin.