Создать маску или границу друг от друга в Python3 - PullRequest
0 голосов
/ 23 апреля 2020

Я хотел бы получить маску из изображений с границами или границ из изображений масок.

Вот два изображения:

Mask Image Boundary Image

Я прошел через следующее, я не понял логи c там: link1 , link2 , link3 , ссылка4

спасибо, ильяс

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Я до сих пор не понимаю логи c, однако можно создать границу из маски и маску из границы.

import os
import numpy as np
import cv2
from matplotlib import pyplot as plt

out = "mask_boundary.png"
inp = "mask.png"
im = cv2.imread(inp)
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
tmp = np.zeros_like(im)
boundary = cv2.drawContours(tmp, contours, -1, (255,255,255), 1)
plt.imsave(out, boundary, cmap = "gray")


out = "boundary_mask.png"
inp = "mask_boundary.png"
im = cv2.imread(inp)
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,0,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
tmp = np.zeros_like(im)
boundary = cv2.drawContours(tmp, contours, 0,(255,255,255), -1)
for i in range(1,len(contours)):
    boundary = cv2.drawContours(boundary, contours, i,(255,255,255), -1)

plt.imsave(out, boundary, cmap = "gray")



out = "boun_mask.png"
inp = "boundary.png"
im = cv2.imread(inp)
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,0,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
tmp = np.zeros_like(im)
boundary = cv2.drawContours(tmp, contours, 0,(255,255,255), -1)
for i in range(1,len(contours)):
    boundary = cv2.drawContours(boundary, contours, i,(255,255,255), -1)

plt.imsave(out, boundary, cmap = "gray")

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

преобразовать вышеуказанную маску в границу:

mask2boundary

теперь преобразовать Новая граница для маскирования:

newboundary2mask

Теперь преобразуйте вышеуказанную границу в маску:

enter image description here

0 голосов
/ 24 апреля 2020

из этой ссылки можно использовать следующее:

для получения границы из маски:

im = cv2.imread('mask.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
tmp = np.zeros_like(im)
boundary = cv2.drawContours(tmp, contours, -1, (255,255,255), 1)
boundary[boundary > 0] = 255
plt.imsave("mask_boundary.png", boundary, cmap = "gray")

enter image description here

...