高级机动与地区道具
博客阅读器Mutlu最近问了我一个问题:
“我有两个图像-一个包含类标签(1或2中的一个),另一个包含图像段(区域)唯一ID。我正在尝试使用regionprops(或类似regionprops的东西)要从每个区域的标签图像中找出最常出现的标签,并生成一个新图像,其中每个唯一区域都包含此最常出现的标签。是否有方法执行此操作?”
答案是肯定的。我认为这些技巧可能适用于不同类型的问题,所以我在这里为大家发布了描述。
我没有Mutlu自己的应用程序中的具体示例,所以我制作了一个示例图像来说明。
网址='https://blogs.mathworks.com/images/steve/2011/regions-classes-example.png'; bw=imread(url);imshow(bw)
假设此图像被划分为三个水平区域,如此标签矩阵所定义:
地区地址='https://blogs.mathworks.com/images/steve/2011/regions.png';regions=imread(regions_url);imshow(label2rgb)(regions,“喷气机”, [.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:确定每个连接组件的类别。我将使用每个连接组件的像素索引列表来索引到类标签矩阵。我将把类号附加到区域道具;这是一种非常有用的记忆技巧。
为k = 1: cc。NumObjects s (k)。ClassNumber= classes(s(k).PixelIdxList(1));结束
让我们在原始图像的上方绘制类编号,以确保我们做对了。我们应该用1表示星星,2s表示三角形,3s表示圆形。
imshow (bw)在…上为k = 1:numel(s) x = s(k).质心(1);y = s (k) .Centroid (2);文本(x, y, sprintf (“%d”,s(k)。类别编号),“颜色”,“r”,...“FontWeight”,“大胆”);结束持有关头衔('每个对象的类编号')
步骤3:确定与每个连接组件关联的区域编号。我们必须更仔细地考虑这一点,因为有一种可能性,一个连接的组件可能位于多个区域。我建议我们找到每个连接组件的每个像素的区域数,然后使用模式对于位于多个区域的组件,可以充当决胜局者。
为k = 1: cc。NumObjects s (k)。RegionNumber =模式(单(地区(s (k) .PixelIdxList)));结束
再一次,让我们绘制区域编号作为一个健全性检查。
imshow (bw)在…上为k = 1:numel(s) x = s(k).质心(1);y = s (k) .Centroid (2);文本(x, y, sprintf (“%d”,s(k)。地区编号),“颜色”,“r”,...“FontWeight”,“大胆”);结束持有关头衔('每个对象的区域编号')
步骤4:对于每个区域,确定该区域中最频繁出现的对象类。同样,我们将利用模式函数。
num_regions=max(regions(:);most_frequency_class=0(1,num_regions);region_向量=[s.RegionNumber];class_向量=[s.ClassNumber];为k=1:num_regions most_frequency_class(k)=mode(single(class_vector(region_vector==k));结束most_frequent_class
2 .詹妮弗?劳伦斯
步骤5:构建输出图像,其中仅包含每个区域中最频繁出现的对象类。
bw2 = false(大小(bw));为k=1:numel(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= classes(s(k).PixelIdxList(1));结束为k = 1: cc。NumObjects s (k)。RegionNumber =模式(单(地区(s (k) .PixelIdxList)));结束num_regions=max(regions(:);most_frequency_class=0(1,num_regions);region_向量=[s.RegionNumber];class_向量=[s.ClassNumber];为k=1:num_regions most_frequency_class(k)=mode(single(class_vector(region_vector==k));结束bw2 = false(大小(bw));为k=1:numel(s)如果most_frequent_class (s (k) .RegionNumber) = = s (k)。ClassNumber%该对象的类数匹配最频繁的类该区域中对象的数量。bw2 (s (k) .PixelIdxList) = 1;结束结束
在我的笔记本电脑上,整个计算过程大约需要11毫秒。
这里展示了很多有用的技术,特别是:
评论
要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。