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

Любой, я полагаю, мог бы попытаться удалить фон с изображения. Конечно, существует множество доступного программного обеспечения или инструментов, способных сделать это, но некоторые из них могут быть дорогостоящими. Однако мне известно, что кто-то использовал магический выбор 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. Наша последняя маска готова. Чтобы получить сегментированное изображение, просто умножьте его на входное изображение.

Выход

Я. Наконец-то мы смогли удалить фон.

Рекомендации

  1. http://dl.acm.org/citation.cfm?id=1015720
  2. https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html

Запланируйте сеанс DDIChat в разделе Кодирование, программное обеспечение и разработка мобильных устройств:



Подайте заявку на участие в программе DDIChat Expert здесь.
Работайте с DDI: https://datadriveninvestor.com/collaborate
Подпишитесь на DDIntel здесь.