Можно ли вставить изображение поверх другого в OpenCV? - PullRequest
1 голос
/ 30 марта 2020

Я довольно новичок в OpenCv и создаю программу, которая будет сегментировать ботинок по его фону, используя алгоритм GrabCut, затем я хочу вставить ботинок на белый фон, но я борюсь за эту часть.

Я попытался cv2.add () , чтобы добавить два изображения вместе, но оба изображения должны быть одинакового размера, и я не могу гарантировать, что, поскольку программа предложит пользователю загрузить изображение.

Я также попытался whiteBgImg = 255 - grabCutImg , чтобы сделать фон белым, где нет обуви, но, кажется, это влияет на конечное изображение, что является проблемой, так как мне нужно выполнить обнаружение функций и совпадение на картинке.

Заранее спасибо за совет! :)

Исходное изображение: Оригинальная обувь

Окончательное изображение (после захвата и whiteBgImg = 255 - grabCutImg применяется): Grabcut Shoe

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Вот один из способов сделать это в Python / OpenCV.

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

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

Ввод:

enter image description here

import cv2
import numpy as np

# load image
img = cv2.imread("shoe_inverted.jpg")

# invert the polarity
img = 255 - img

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold image and make 3 channels as mask
mask = cv2.threshold(gray, 32, 255, cv2.THRESH_BINARY)[1]
mask = cv2.merge([mask,mask,mask])

# create white image for background of result
white = np.full_like(img, (255,255,255))

# apply mask to img and white
result = np.where(mask!=0, img, white)

# write result to disk
cv2.imwrite("shoe_inverted_inverted.jpg", img)
cv2.imwrite("shoe_mask.jpg", mask)
cv2.imwrite("shoe_result.jpg", result)

cv2.imshow("IMAGE", img)
cv2.imshow("MASK", mask)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
cv2.destroyAllWindows()


Инвертированный ввод для возврата к оригиналу:

enter image description here

Маска (после порога для очистки границы):

enter image description here

Результат:

enter image description here

0 голосов
/ 30 марта 2020

Если вы хотите поместить одно изображение перед другим, вы можете сделать это следующим образом:

back_img[y_start:y_end,x_start:x_end] = front_img[y_start:y_end,x_start:x_end]

Если вы хотите объединить изображение по оси y, изображения должны быть тот же размер. Для этого вы можете посмотреть cv2.resize или создать пустое изображение с помощью np.zeros , чтобы добавить отступы к изображению и «Если вы хотите поместить одно изображение вперед другого изображения ", которое я сказал в первом методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...