Глубокое обучение
Повысьте навыки обработки изображений с помощью 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