Как наложить маску на изображение и как сохранить 2D точки, соответствующие значению маски? - PullRequest
0 голосов
/ 07 февраля 2019

Я новичок в работе с изображениями в python и был бы признателен за несколько советов по 2 задачам.

У меня есть изображение: image и его маска: enter image description here

и откройте его следующим образом:

import cv2
import matplotlib.pyplot as plt

mask = cv2.imread('img_mask.jpg')
img = cv2.imread('img.jpg')

1) У меня есть следующие (x, y) точки расположения пикселей:

pt1 = 43.35, 22.49
pt2 = 49.035, 46.985
pt3 = 18.326, 21.822

На маскезначение пикселя при pt1 и pt2 равно 0, а при pt3 это 16.Учитывая три (x, y) местоположения пикселей в виде списка, а также маску, как предусмотрено.Как эффективно отфильтровать местоположения, значение которых 0 на маске?

2) Как эффективно создать новый thresholded masked image, а затем наложить его на исходное изображение, чтобы thresholded mask imageявляется изображением, в котором маска имеет значение только 16, полученное из местоположений пикселей в исходной маске, где значения равны 16.

1 Ответ

0 голосов
/ 08 февраля 2019

Для первой части я не знаю, почему ваши очки не являются целыми числами.Я скачал маску в вопросе, и этот код можно использовать для печати пар, имеющих значение пикселя = 0.Я прочитал маску в формате оттенков серого.

img = cv2.imread('mask.jpg',0)
for i in range(0,img.shape[0]):
    for j in range(0,img.shape[1]):
        if img[i,j] == 0:
            print(i,j)

Для второй части можно использовать нормальное определение порога.Обратитесь к документации opencv для получения дополнительной информации о thresholding .Я увеличил изображение в 4 раза, чтобы лучше видеть.Затем были созданы два порога, имеющие пороговые значения 16 и 17 и выполняющие поразрядную xor из них для получения результата.

zoom = cv2.resize(img, None, fx = 4, fy = 4, interpolation = cv2.INTER_CUBIC)
ret,thresh1 = cv2.threshold(zoom, 16, 255, cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(zoom, 17, 255, cv2.THRESH_BINARY)
output = cv2.bitwise_xor(thresh1, thresh2)
cv2.imshow('threshold with 16', thresh1)
cv2.imshow('threshold with more than 16', thresh2)
cv2.imshow('result', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

mask with threshold as 16

Порог 1

mask with threshold as 17

Порог 2

mask with only pixels=16

Выход

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