Глубокое обучение

Повысьте навыки обработки изображений с помощью Python Project

Обнаружение и сегментация объектов при обработке изображений

В настоящее время локализация объектов является основной и важной задачей в приложениях для обработки изображений. Существуют различные методы от OpenCV до глубокого обучения, в этой статье мы делаем локализацию апельсиновых фруктов с помощью OpenCV. Здесь мы будем выполнять различные задачи предварительной обработки изображений, чтобы добиться хорошего обнаружения объектов.

Методы, которые будут использоваться в этой статье, показаны ниже:

1. Denoising Filters
2. Color Space in image processing
3. Threshold operations
4. Pixel connections and noise removal
5. Finding contours
6. Drawing boundary on object

Первый шаг - загрузить все библиотеки, которые будут использоваться в программе, как показано ниже:

import numpy as np
import imutils
import cv2

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

Теперь мы прочитаем изображение с помощью метода чтения в OpenCV. Храните входное изображение в той же папке, что и файл python.

image = cv2.imread('o2.jpg')

Фильтры шумоподавления

Этот фильтр подавляет шум входного изображения. Функция фильтра используется под кодом.

dst = cv2.fastNlMeansDenoisingColored(image, None, 11, 11, 6, 12)
#Argument pass to the denoising filter
p1 = 11: Kernel size to compute weights
p2 = 11: computing average weight
p3 = 6: luminescence strength filter
p4 = 12: color component filter 

Формат чтения OpenCv - BGR, и нам нужно перейти на RGB для дальнейшей предварительной обработки.

rgb_image = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)

Цветовое пространство при обработке изображений

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

ycbcr_image = cv2.cvtColor(new_image, cv2.COLOR_RGB2YCrCb)
#splitting all three channel of YCrCb
Y, Cr, Cb = cv2.split(ycbcr_image)
#saving the Cr channel image
cv2.imwrite('Cr.jpg',Cr)

Три различных канала YCrCb показаны ниже:



Пороговые операции

На этом этапе мы будем использовать изображение Cr, чтобы получить двоичное изображение для обнаружения объекта. Из изображения канала Cr ясно, что двоичное изображение можно разделить на две черно-белые категории.

ret,th1=cv2.threshold(Cr,180,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#saving the binary image
cv2.imwrite('Binary_image.jpg',th1)



Соединение пикселей и удаление шума

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

#getting the connected components area
nb_components, output, stats, centroids = 
           cv2.connectedComponentsWithStats(th1, connectivity=8)

Черный фон также является компонентом, но нам этот объект не нужен, удалите этот фон с помощью приведенного ниже кода.

sizes = stats[1:, -1]; nb_components = nb_components - 1

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

min_size = 2000
#your answer image
img2 = np.zeros((output.shape))
#keeping the area above the threshold value
for i in range(0, nb_components):
    if sizes[i] >= min_size:
        img2[output == i + 1] = 255
        cv2.imwrite('img2.jpg',img2)
        
img3 = img2.astype(np.uint8) 
cv2.imwrite('binary_connected_components.jpg',img3)

Здесь изображение с удаленным шумом показано ниже:

Поиск контуров

Этот шаг - найти контуры на изображении, то есть область белых пикселей в приведенном ниже коде:

# find contours in the thresholded image
cnts = cv2.findContours(img3.copy(), cv2.RETR_EXTERNAL,
                                     cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
print("[INFO] {} unique contours found".format(len(cnts)))
#output:
[INFO] 5 unique contours found

Контуры сохраняются в переменной cnts.

Рисование границы на объекте

Теперь нарисуем границу вокруг объекта с помощью области контура.

# loop over the contours
for (i, c) in enumerate(cnts):
 # draw the contour
 ((x, y), _) = cv2.minEnclosingCircle(c)
 cv2.putText(image, "#{}".format(i + 1), (int(x) - 10, int(y)),
  cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
 cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
#save the result image
cv2.imwrite('Result_Image.jpg',image)

Заключение

В этой статье мы обсудим основные операции предварительной обработки изображений в OpenCV.

Надеюсь, статья вам понравилась. Свяжитесь со мной в моих LinkedIn и twitter.

Рекомендуемые статьи

1. 8 идей для активного изучения модуля Python Collection
2. NumPy: линейная алгебра на изображениях
3. Концепции обработки исключений в Python
4. Pandas: Работа с Категориальные данные
5. Гиперпараметры: RandomSeachCV и GridSearchCV в машинном обучении
6. Полностью объясненная линейная регрессия с Python
7. Полностью объясненная логистическая регрессия с Python < br /> 8. Распределение данных с использованием Numpy с Python
9. Деревья решений против случайных лесов в машинном обучении
10. Стандартизация предварительной обработки данных с помощью Python