从图像中提取重复结构

信息处理 图像处理
2022-02-01 06:52:30

我想从图像中找到重复的结构。但我不知道该怎么做。请帮帮我。实际上我想找出有多少线条和椭圆形状看起来相似,并用不同的颜色标记它们。

在此处输入图像描述

1个回答

您想检测两件事:线条/曲线和圆圈。两者都有众所周知的算法,所以让我们分别找到它们。我将在 Mathematica 中提出一个解决方案。您可以翻译成您的语言。

  1. 第一步是消除背景。我们通过查找背景来做到这一点: img = Import["http://i.stack.imgur.com/Olczj.jpg"] bimg = ColorConvert[img, "Grayscale"] Blur[Closing[bimg, 20], 15]

背景

然后除以它:

evenImg = Image[ImageData@bimg/ImageData@Blur[Closing[bimg, 20], 10]]

偶象

  1. 检测边缘:

binImg = EdgeDetect[evenImg, 1, .1]

边缘

现在我们只需要填写笔画:

smImg = ImageResize[膨胀[binImg, 2], {500}]

扩张的

  1. 我们终于准备好进行一些检测了。让我们从线条/曲线开始:

Show[smImg, Graphics[{Yellow, Thick, Line /@ ImageLines[smImg, 0.25]}]]

线路检测

  1. 圈子呢?让我们从查看所有连接的组件开始:

变形 = 形态成分@smImg; 着色@变形

组件

圆圈在那里,好吧。我们只需要过滤掉非圆形的对象。我们可以通过查看圆度、伸长率、偏心率欧拉特性来做到这一点。通过这些属性,圆形很容易与其他形状区分开来。

noncircles = #[[1]] & /@ ComponentMeasurements[morph, "Elongation", # > 0.3 &]
circles = morph /. x_ :> 0 /; MemberQ[noncircles, x] // 
  Colorize // RemoveBackground

界