Нужна небольшая поддержка в создании Trimap для альфа-маскирования - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь извлечь волосы из портретного изображения.Для этого я до сих пор делал следующее:

  1. Преобразование изображения в оттенки серого, а затем в двоичный файл
  2. Морфологическая операция по выделению волос.
  3. Поиск контуров, сортировкаэто, сверху донизу, нарисуйте самый верхний контур только как маску (волосы явно).
  4. Снова выполните некоторые морфологические операции, чтобы определить верный передний план и неизвестную область.

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

Вот мой код:

import numpy as np
import cv2


img = cv2.imread("Test5.jpg")
image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow("GrayScaled", image)
# cv2.waitKey(0)

ret, thresh = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY_INV)
# cv2.imshow("Black&White", thresh)
# cv2.waitKey(0)


kernel1 = np.ones((2,2),np.uint8)
erosion = cv2.erode(thresh,kernel1,iterations=4)
# cv2.imshow("AfterErosion", erosion)
# cv2.waitKey(0)

kernel2 = np.ones((1,1),np.uint8)
dilation = cv2.dilate(erosion,kernel2,iterations = 5)
# cv2.imshow("AfterDilation", dilation)
# cv2.waitKey(0)

contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

#sort contours
sorted_ctrs = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[1])

mask = np.zeros_like(img) # Create mask where white is what we want, black otherwise
cv2.drawContours(mask, sorted_ctrs, 0, (255, 255, 255), -1) # Draw filled contour in mask
out = np.zeros_like(img) # Extract out the object and place into output image
out[mask == 255] = [255]

# Show the output image
cv2.imshow('Output', out)
cv2.waitKey(0)

image1 = cv2.cvtColor(out, cv2.COLOR_BGR2GRAY)

# noise removal
kernel = np.ones((10, 10), np.uint8)
opening = cv2.morphologyEx(image1, cv2.MORPH_OPEN, kernel, iterations = 2)

# sure background area
sure_bg = cv2.dilate(opening, kernel, iterations=4)

# Finding sure foreground area
sure_fg = cv2.erode(opening, kernel, iterations=3)
cv2.imshow("foreground", sure_fg)
cv2.waitKey(0)

# Finding unknown region
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)
ret, thresh = cv2.threshold(unknown, 240, 255, cv2.THRESH_BINARY)

unknown[thresh == 255] = 128

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
unknown = cv2.erode(unknown, kernel, iterations=1)

cv2.imshow("unknown", unknown)
cv2.waitKey(0)

final_mask = sure_fg + unknown
cv2.imwrite("Trimap.jpg", final_mask)
cv2.imshow("final_mask", final_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

Вот мое входное и выходное изображение:

Original Image

Trimap

1 Ответ

0 голосов
/ 31 января 2019

Черная линия между unknown и sure_fg заключается в том, что unknown размыт в конце строкой

unknown = cv2.erode(unknown, kernel, iterations=1)

После удаления этой строки, вотмаска создана:

enter image description here

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