У меня есть маска интересующей области на изображении, которое я пытаюсь измерить.Но эти маски не всегда имеют высокое качество, и иногда мои объекты интереса (киты из беспилотных изображений) состоят из нескольких сегментов изображения, разделенных парой пикселей.Поэтому я пытаюсь выполнить некоторые операции по расширению и эрозии, чтобы создать одну маску, но слишком большое расширение затем отбрасывает мои последние измерения.Есть ли способ сделать расширение, чтобы соединить фигуры, эрозию, чтобы убрать всю добавленную обхват / длину от расширения, но предотвратить эрозию от создания двух отдельных сегментов?
Вот то, что у меня сейчас есть:
import cv2
# my_mask = output from Mask RCNN
plt.imshow(my_mask, cmap="gray")
plt.show()
mask_uint = np.array(my_mask, dtype=np.uint8)
kernel = np.ones((5,5), np.uint8)
dilation = cv2.dilate(mask_uint, kernel, iterations=5)
plt.imshow(dilation, cmap="gray")
plt.show()
erosion = cv2.erode(dilation, kernel, iterations=4)
plt.imshow(erosion, cmap="gray")
plt.show()
И в конце вы можете видеть, что это все еще два отдельных сегмента, если я делаю меньше итераций эрозии, то маска слишком широка и мои измерения маски слишком искажены.
ОБНОВЛЕНИЕ
Я пытался изменить свою систему, чтобы использовать функцию minAreaRect () opencv для измерения длины, и это привело к чистому решению, но оно добавляет довольно значительный буфер, приводящий к очень плохим измерениям длины.