Как добавить несколько бинарных масок? - PullRequest
0 голосов
/ 04 ноября 2019

Conceptual Representation У меня есть набор изображений (с разными фокусными расстояниями), на которых я нашел двоичные маски. Некоторые из этих масок перекрываются, и теперь я хочу добавить все эти маски вместе, чтобы создать одну большую маску изображений. Есть ли способ сложить эти маски вместе и рассмотреть перекрывающиеся области только один раз. При рассмотрении перекрывающихся областей следует учитывать только те, которые имеют максимальные края (из определения края).

Так что теперь маска имеет все маски для всех изображений. Теперь я хочу добавить эти маски вместе. Любая помощь приветствуется.

Это оригинальные изображения и их маски. Ссылка на изображения

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

for file in glob.glob("images/*.jpg")
      img = cv2.imread(file)  
      ret, mask = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)  

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Вот один из способов сложить несколько масок вместе с помощью Python / OpenCV.

  • Считать маски и преобразовать их в число с плавающей точкой в ​​диапазоне от 0 до 1
  • Добавить маски с помощью Pythonсложение и умножение на 255
  • Обрезать полученную маску в диапазоне от 0 до 255 и преобразовать обратно в int.


import cv2

# read masks
mask1 = cv2.imread('mask1.png').astype("float32")
mask2 = cv2.imread('mask2.png').astype("float32")
mask3 = cv2.imread('mask3.png').astype("float32")
mask4 = cv2.imread('mask4.png').astype("float32")

# add masks
result = 255*(mask1 + mask2 + mask3 + mask4)
result = result.clip(0, 255).astype("uint8")

# show results
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('mask1-4.png', result)

Маски:

enter image description here

enter image description here

enter image description here

enter image description here

Результирующая комбинированная маска:

enter image description here

ДОПОЛНЕНИЕ:

Вы также можете сделать это следующим образом:

import cv2
import numpy as np

# read masks
mask1 = cv2.imread('mask1.png')
mask2 = cv2.imread('mask2.png')
mask3 = cv2.imread('mask3.png')
mask4 = cv2.imread('mask4.png')

# make list
masks = [mask1, mask2, mask3, mask4]

# add masks
h, w, c = mask1.shape
result = np.full((h,w,c), (0,0,0), dtype=np.uint8)
for mask in masks:
    result = cv2.add(result, mask)

# show results
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('mask1-4.png', result)


0 голосов
/ 04 ноября 2019

двоичные метки - это просто матрицы размера изображения, имеющие либо 0, либо 1 значение. Когда применяется маска, все, что происходит, это то, что каждое значение умножается на значение маски, если пиксель должен быть удален, значение маски0, следовательно, при умножении вы получите черный пиксель, если его не нужно удалять, исходное значение сохраняется, так как оно умножено на 1.

Чтобы объединить маски, просто добавьте маски вместе, любую область, которая являетсяне должно быть маскировано, останется 0.

После этого просто сделайте что-то вроде этого

combined_masks[combined_masks > 1] = 1

Это снова преобразует вашу маску в двоичную маску

Так что в основномДумайте об этом как о диаграмме Венна, если в качестве маски вы бы выбрали 2 перекрывающихся круга, объединение этих кругов было бы объединенной маской

Как видно ниже, A и B - ваши маски, а серыйобласть, их «союз» - это ваша комбинированная маска

enter image description here

ОБНОВЛЕНИЕ ::: Если вы хотите, чтобы общий регион был только среди этихмаски, вы все равно можете добавить маски вместе и сделать следующее

combined_masks /= total_num_masks
combined_masks[combined_masks < 1] = 0

ОБНОВЛЕНИЕ ::: Если у вас есть n масок формы img_w, img_h, это то, как вы бы их объединили.

unified_masks = np.zeros((img_w, img_h))

for mask in list_of_masks:
    unified_masks += mask

unified_masks[unified_masks > 1] = 1
...