MATLAB在图像处理中的应用

图像处理概念、算法和MATLAB

使用区域道具进行高级机动

博客阅读器穆特鲁最近问我这个问题:

“我有两个图像-一个包含类标签(一个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.]))

进一步,假设原始图像中的形状被划分为三类——星形、三角形和圆形——由这个标签矩阵定义:

类别(网址)='https://blogs.mathworks.com/images/steve/2011/classes.png';classes=imread(classes_url);imshow(label2rgb)(classes,“喷气式飞机”,(。5..5..5.]))

我可以想象解决问题的不同方法。以下是我将遵循的大致程序:

1.确定图像中连接的组件(对象),包括每个组件的像素位置列表。

2.确定每个连接部件的等级。

3.确定每个连接部件的区域。

4.对于每个区域,确定该区域中包含的连接组件类的模式。

5.构造仅包含每个区域中最频繁出现的对象类的输出图像。

步骤1:确定图像中连接的组件(对象),包括每个组件的像素位置列表。(我还将计算每个对象的质心,但这只是因为我将使用这些质心进行可视化步骤。)

cc=BWConComp(bw);s=regionprops(cc,“像素idxlist”,“质心”);

步骤2:确定每个连接组件的类。我将通过使用每个连接组件的像素索引表来索引到班级标签的矩阵。将类号附加到返回的现有结构数组regionprops;这是一个非常有用的技巧。

对于k=1:cc.numbjects s(k).ClassNumber=classes(s(k).PixelIdxList(1));终止

让我们在原始图像的顶部绘制类号,以确保我们做得正确。我们应该有1表示恒星,2表示三角形,3表示圆。

imshow(bw)暂停对于k=1:numel(s)x=s(k)。质心(1);y=s(k)。质心(2);文本(x,y,f(' % d 's (k) .ClassNumber),“颜色”,“r”,...“FontWeight”,“大胆的”);终止持有标题(“每个对象的类号”)

步骤3:确定与每个连接组件相关联的区域号。我们需要更仔细地思考这个问题,因为一个连通的分量可能位于不止一个区域。我建议我们先求出每个连通分量的每个像素的区域数,然后使用模式作为位于多个区域的组件的分接器。

对于k=1:cc.numbjects s(k).RegionNumber=mode(single(regions(s(k).PixelIdxList));终止

同样,让我们将区域编号绘制出来作为检查。

imshow(bw)暂停对于k=1:numel(s)x=s(k)。质心(1);y=s(k)。质心(2);文本(x,y,f(' % d 's (k) .RegionNumber),“颜色”,“r”,...“FontWeight”,“大胆的”);终止持有标题(“每个对象的区域编号”)

步骤4:对于每个区域,确定该区域中最频繁出现的对象类模式作用

(:) num_regions = max(地区);Most_frequent_class = 0 (1, num_regions);region_vector = [s.RegionNumber];class_vector = [s.ClassNumber];对于region_region = 1:num_regions most_frequent_class(K) = mode(single(class_vector(region_vector == K))));终止最常上课
最高频率等级=1 3 2

步骤5:构造只包含每个区域中最频繁出现的对象类的输出图像。

bw2=假(大小(bw));对于k = 1:元素个数(s)如果最频繁的类(s(k).RegionNumber)==s(k).ClassNumber%此对象的类编号与最常见的类匹配%此区域中的对象数。bw2(s(k).PixelIdxList)=1;终止终止imshow (bw2)标题(“最终结果”)

你可以看到区域1中只有星星,区域2中只有圆圈,区域3中只有三角形。

以下是一段代码中的完整计算:

cc=BWConComp(bw);s=regionprops(cc,“像素idxlist”,“质心”);对于k=1:cc.numbjects s(k).ClassNumber=classes(s(k).PixelIdxList(1));终止对于k=1:cc.numbjects s(k).RegionNumber=mode(single(regions(s(k).PixelIdxList));终止(:) num_regions = max(地区);Most_frequent_class = 0 (1, num_regions);region_vector = [s.RegionNumber];class_vector = [s.ClassNumber];对于region_region = 1:num_regions most_frequent_class(K) = mode(single(class_vector(region_vector == K))));终止bw2=假(大小(bw));对于k = 1:元素个数(s)如果最频繁的类(s(k).RegionNumber)==s(k).ClassNumber%此对象的类编号与最常见的类匹配%此区域中的对象数。bw2(s(k).PixelIdxList)=1;终止终止

在我的笔记本电脑上,整个计算过程大约需要11毫秒。

这里演示了许多有用的技术,特别是:

  • 连通区域标记
  • 必然的线性索引
  • 使用连接组件的像素索引列表索引到其他向量和矩阵
  • 结构数组的逗号分隔列表语法(在处理regionprops).




与MATLAB®7.12一起发布

|
  • 打印
  • 发送电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。