Я хотел бы публиковать больше ценных статей на этом канале, ваша поддержка имеет решающее значение для этой экосистемы. Пожалуйста, следуйте за мной и хлопайте, если вам нравится то, что я пишу. Спасибо.
Любой, я полагаю, мог бы попытаться удалить фон с изображения. Конечно, существует множество доступного программного обеспечения или инструментов, способных сделать это, но некоторые из них могут быть дорогостоящими. Однако мне известно, что кто-то использовал магический выбор Window Paint 3D или удаление фона PowerPoint, чтобы удалить фон.
Это может подойти вам, если вы новичок в области компьютерного зрения. Давайте начнем прямо сейчас! О, и не используя слишком много кода…
Введение
GrabCut — это алгоритм компьютерного зрения, который используется для извлечения объекта из изображения. Поскольку это не всегда работает с первого раза, Interactive GrabCut позволяет пользователям указать, как улучшить результат. В Интернете есть несколько реализаций GrabCut; некоторые работают только на Python (без веб-интерфейса), а другие не интерактивны.
Каков процесс использования GrabCut?
1. Пользователь входит в прямоугольник. Все, что находится за пределами этого прямоугольника, будет считаться фоном. Все, что находится внутри прямоугольника, является загадкой.
2. Алгоритм помечает пиксели на переднем и заднем плане (или жестко помечает)
3. Затем передний план и фон моделируются с использованием гауссовой модели смеси (GMM).
4. GMM изучает и создает новые распределения пикселей на основе предоставленных нами данных. Другими словами, неизвестные пиксели помечаются либо как вероятный передний план, либо как вероятный фон на основе их соотношения цветовой статистики с другими жестко помеченными пикселями (это похоже на кластеризацию).
5. Это распределение пикселей используется для построения графика. Пиксели — это узлы на графиках. Добавлены два новых узла: узел Источник и узел Приемник. Каждый пиксель переднего плана связан с узлом Source.
Часть 1: Импорт необходимого пакета
Прежде всего, мы должны импортировать необходимый пакет и переопределить нашу функцию matplotlib.
Фрагменты кода:
import cv2 import dlib import sys import numpy as np from tkinter import filedialog from matplotlib import pyplot as plt def imshow(title = "Image", image = None, size = 10): w, h = image.shape[0], image.shape[1] aspect_ratio = w/h plt.figure(figsize=(size * aspect_ratio,size)) plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) plt.title(title) plt.show()
Часть 2: Функция SelectROI
Мы можем тщательно и вручную выбрать интересующую нас область изображения, используя этот метод OpenCV.
Исходное фото
img = r"C:\Users\jinzh\Desktop\Project\Python\python-opencv\lovely-girl-background-1.jpg" image = cv2.imread(img) copy = image.copy() # Create a mask (of zeros uint8 datatype) that is the same size (width, height) as our original image mask = np.zeros(image.shape[:2], np.uint8) bgdModel = np.zeros((1,65), np.float64) fgdModel = np.zeros((1,65), np.float64) x, y , w, h = cv2.selectROI("select the area", image) start = (x, y) end = (x + w, y + h) rect = (x, y , w, h) cv2.rectangle(copy, start, end, (0,0,255), 3) imshow("Input Image", copy)
Выход
Часть 3 Алгоритм GrabCut Алгоритм:
Аргументы Grabcut
1. img — входное изображение
2. маска — это изображение маски, которое указывает, какие части являются фоном, передним планом или вероятным фоном/передним планом и т. д. Для этого используются флаги cv.GC_BGD, cv.GC_FGD, cv.GC_PR_BGD, cv.GC_PR_FGD или просто передача 0,1,2,3 для изображения.
3. rect — в формате это координаты прямоугольника, включающего объект переднего плана (x,y,w,h).
4. bdgModel и fgdModel — используются внутри алгоритма. Вам нужно всего лишь сделать два нулевых массива типа np.float64, каждый размером np.float64 (1,65).
5. iterCount — количество итераций, которые должен выполнить алгоритм.
6. режим — это должен быть cv.GC_INIT_WITH_RECT или cv.GC_INIT_WITH_MASK или смешанный, в зависимости от того, рисуем ли мы прямоугольник или завершаем штрихи.
cv2.grabCut(image, mask, rect, bgdModel, fgdModel, 100, cv2.GC_INIT_WITH_RECT) mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8') image = image * mask2[:,:,np.newaxis] imshow("Mask", mask * 80) imshow("Mask2", mask2 * 255) imshow("Image", image)
Объяснение
1. Запустите алгоритм на 5 итераций. Поскольку мы используем прямоугольник, режим должен быть cv.GC_INIT_WITH_RECT.
2. Изображение маски изменено Grabcut.
3. Как указано выше, пиксели в новом изображении маски будут помечены четырьмя флажками, обозначающими фон/передний план.
4. Итак, мы меняем маску так, чтобы все 0- и 2-пиксели были установлены на 0 (фон), а все 1- и 3-пиксели были установлены на 1 (т.е. пиксели переднего плана).
5. Наша последняя маска готова. Чтобы получить сегментированное изображение, просто умножьте его на входное изображение.
Выход
Я. Наконец-то мы смогли удалить фон.
Рекомендации
- http://dl.acm.org/citation.cfm?id=1015720
- https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html
Запланируйте сеанс DDIChat в разделе Кодирование, программное обеспечение и разработка мобильных устройств:
Подайте заявку на участие в программе DDIChat Expert здесь.
Работайте с DDI: https://datadriveninvestor.com/collaborate
Подпишитесь на DDIntel здесь.