我对 matlab 还很陌生,但情况是这样的。我有一张海洋的卫星图像,其中有一些陆地和一些船只。使用阈值制作二进制掩码和 bwlabel,我成功创建了一组与水面上的船只相匹配的标签。这是船(和陆地)上标签的叠加图像,这样您就可以明白我的意思:
正如您从图像中看到的,标签包含船只以及船只两侧的一些较暗的旁瓣。我需要找到一种方法来创建一组新的标签,仅覆盖船而不覆盖旁瓣。我不能只使用更亮的阈值,因为我有很多具有不同亮度的船只的图像,其中一些会比其他船只的旁瓣更暗。
所以我想我要问的是,有没有办法从该图像中提取彩色部分,进一步分析它们(通过对各个部分进行阈值处理,或使用直方图或其他方式)来创建一组新的标签,其中包含只有船,而且还保持这些新标签相对于原始图像的位置完整,以便我可以将它们再次叠加到原始图像上?如果是这样,怎么办?
谢谢!
最佳答案
这里有几个问题。
<强>1。有没有办法从该图像中提取彩色部分?
是的。
让你从bwlabel
获得的标签图片是L
原始图像为 I
。然后,S = regionprops(L,'BoundingBox');
将为您提供与 L
中每个区域关联的边界框。使用I2 = imcrop(I,S(2).BoundingBox);
提取 S(2)
中的区域。您必须检查是否 S(2)
对应标签2
在L
(如果没有,解决这个问题很简单)。
<强>2。进一步分析它们(通过对各个分段进行阈值设置,或使用直方图或其他方式)以创建一组仅包含船只的新标签。
没那么简单。这很大程度上取决于您的图像。您可以使用 MATLAB 的默认阈值函数来使其发挥作用。假设您获得每个裁剪图像的二进制掩码(例如 IB1
)。
<强>3。还要保持这些新标签相对于原始图像的位置不变,以便我可以将它们再次叠加到原始图像上?
是的。由于您有一组边界框 S
只需更换 L
中的新 mask 即可。
L(round(S(1).BoundingBox(2):S(1).BoundingBox(2)+S(1).BoundingBox(4)),...
round(S(1).BoundingBox(1):S(1).BoundingBox(1)+S(1).BoundingBox(3))) = IB1;
哪里I1
是改良后的面膜。分配给 L
时,不要忘记将掩码中的所有非零值设置为标签索引。 .
有关原因的更多信息 round
使用,look here .
关于image - MATLAB 分析图像的某些部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17745367/