我要测量的图像中有一个感兴趣区域的蒙版。但是这些蒙版并非总是高质量的,有时我感兴趣的对象(无人机影像中的鲸鱼)来自多个图像段,这些图像段由几个像素隔开。因此,我尝试进行一些扩张和腐蚀操作以制成单个遮罩,但是扩张过多会影响我的最终测量结果。有没有一种方法可以进行膨胀以连接形状,腐蚀可以从膨胀中去除所有增加的周长/长度,但是可以防止腐蚀产生两个不同的部分?
这是我目前拥有的:
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()
最后,您仍然可以看到仍然是两个单独的部分,如果我进行较少的腐蚀迭代,则遮罩太宽且遮罩的测量值太失真了。
更新
我试图将系统更改为使用opencv的minAreaRect()函数来测量长度,这导致了外观简洁的解决方案,但它添加了相当大的缓冲区,导致长度测量很差。