先进的军事演习与regionprops
博客阅读器Mutlu最近问我这个问题:
“我有两张图片,一个包含类标签(1或2)和一个包含图像段(地区)独特的id。我试图使用regionprops(或类似regionprops)找出最频繁发生的每个地区和标签的标签图像生成一个新的形象,每一个独特的区域包含这个最频繁发生的标签。有办法吗?”
答案是肯定的。我认为技术可能适用于不同的问题,所以我在这里发帖描述每个人。
我没有一个具体的例子从Mutlu自己的应用程序中,我由一个示例图像来说明。
url =“https://blogs.mathworks.com/images/steve/2011/regions-classes-example.png”;bw = imread (url);imshow (bw)
假设这幅图像分为三个水平地区,这个标签定义的矩阵:
regions_url =“https://blogs.mathworks.com/images/steve/2011/regions.png”;区域= imread (regions_url);imshow (label2rgb(地区,“喷气机”,(。5。5。5]))
进一步,假设原始图像的形状分为三类——星星,三角形,和这个标签定义的圈子——矩阵:
classes_url =“https://blogs.mathworks.com/images/steve/2011/classes.png”;类= imread (classes_url);imshow (label2rgb(类,“喷气机”,(。5。5。5]))
我可以想象不同的方式向解决方案。这是粗糙的过程我要遵循:
1。确定连接组件(对象)的形象,包括为每一个像素位置的列表。
2。确定每个连接组件的类。
3所示。确定每个连通分支的地区。
4所示。对于每个区域,确定的模式连接组件类包含在该地区。
5。构建输出图像只包含最常发生在每个地区的对象类。
步骤1:确定连接组件(对象)的形象,包括为每一个像素位置的列表。(我也要计算每个对象的质心,但这只是因为我要使用的可视化步骤。)
cc = bwconncomp (bw);s = regionprops (cc、“PixelIdxList”,“重心”);
步骤2:确定每个连接组件的类。为此,我将使用像素指数指数到为每个连接组件列表类标签的矩阵。我将策略类数到现有结构数组返回regionprops;要记住这是一个很有用的技术。
为k = 1: cc。NumObjects s (k)。ClassNumber =类(s (k) .PixelIdxList (1));结束
让我们画出类数字的原始图像,以确保我们所做的是对的。星星我们应该1 s, 2 s的三角形,和3 s圆圈。
imshow (bw)在为k = 1:元素个数(s) x = s (k) .Centroid (1);y = s (k) .Centroid (2);文本(x, y, sprintf (' % d 's (k) .ClassNumber),“颜色”,“r”,…“FontWeight”,“大胆”);结束持有从标题(每个对象的类数)
步骤3:确定该地区数量与每个连接组件相关联。我们必须稍微难一点思考这一个,因为有可能连接到一个组件可以躺在多个地区。我建议我们发现该地区每个连接组件的每个像素数量,然后使用模式函数作为组件的决胜局躺在多个区域。
为k = 1: cc。NumObjects s (k)。RegionNumber =模式(单(地区(s (k) .PixelIdxList)));结束
再一次,让我们画出区域数字作为一个检查。
imshow (bw)在为k = 1:元素个数(s) x = s (k) .Centroid (1);y = s (k) .Centroid (2);文本(x, y, sprintf (' % d 's (k) .RegionNumber),“颜色”,“r”,…“FontWeight”,“大胆”);结束持有从标题(每个对象的区域号码)
步骤4:对于每一个区域,确定最常出现的对象类。再一次,我们将使用模式函数。
(:)num_regions = max(地区);num_regions most_frequent_class = 0 (1);region_vector = [s.RegionNumber];class_vector = [s.ClassNumber];为k = 1: num_regions most_frequent_class (k) =模式(单(class_vector (region_vector = = k)));结束most_frequent_class
most_frequent_class = 1 3 2
第五步:构建输出图像只包含最常发生在每个地区的对象类。
bw2 = false(大小(bw));为k = 1:元素个数(s)如果most_frequent_class (s (k) .RegionNumber) = = s (k) .ClassNumber%这个对象的类数匹配最常见的类%在这个区域的对象数。bw2 (s (k) .PixelIdxList) = 1;结束结束imshow (bw2)标题(“最终结果”)
您可以看到,只有星星在区域1中,仅在区域2圈,只有三角形区域3。
这是完整的计算在一个代码块:
cc = bwconncomp (bw);s = regionprops (cc、“PixelIdxList”,“重心”);为k = 1: cc。NumObjects s (k)。ClassNumber =类(s (k) .PixelIdxList (1));结束为k = 1: cc。NumObjects s (k)。RegionNumber =模式(单(地区(s (k) .PixelIdxList)));结束(:)num_regions = max(地区);num_regions most_frequent_class = 0 (1);region_vector = [s.RegionNumber];class_vector = [s.ClassNumber];为k = 1: num_regions most_frequent_class (k) =模式(单(class_vector (region_vector = = k)));结束bw2 = false(大小(bw));为k = 1:元素个数(s)如果most_frequent_class (s (k) .RegionNumber) = = s (k) .ClassNumber%这个对象的类数匹配最常见的类%在这个区域的对象数。bw2 (s (k) .PixelIdxList) = 1;结束结束
整个计算大约需要11女士在我的笔记本电脑。
这里有很多有用的技巧了,特别是:
评论
留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。