史蒂夫与MATLAB图像处理

图像处理的概念、算法和MATLAB

先进的军事演习与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女士在我的笔记本电脑。

这里有很多有用的技巧了,特别是:

  • 连通区域标记
  • 逻辑线性索引
  • 使用像素指数列表连接组件向其它向量和矩阵指数
  • 以逗号分隔的语法结构数组(这在处理的输出时尤其有用regionprops)。




使用MATLAB®7.12发表

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。