用MATLAB进行图像处理

图像处理概念、算法和MATLAB

高级机动与地区道具

博客阅读器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毫秒。

这里展示了很多有用的技术,特别是:

  • 连接元件标签
  • 逻辑线性的索引
  • 使用像素索引列表的连接组件索引到其他向量和矩阵
  • 结构数组的逗号分隔列表语法(在处理的输出时特别有用区域道具).




MATLAB®7.12发布

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。