pengkunstone 2019-04-01
关于使用python和OpenCV进行轮廓绘制的教程
入门
如果您已经安装了jupyter笔记本或IDE,您可以运行python和OpenCV,只需跳到执行即可。
工具
我们今天的主角是Anaconda。一个免费的开源发行版,有助于安装不同的软件包,并将它们的混乱分类到孤立的环境中。
我们看一下百科告诉我们关于Anaconda的内容:
Anaconda是用于科学计算(数据科学、机器学习应用程序、大规模数据处理、预测分析等)的Python和R编程语言的免费开源发行版,旨在简化包管理和部署。包版本由包管理系统conda管理。 Anaconda发行版已被超过1200万用户使用,包括1400多种适用于Windows、Linux和MacOS的流行数据科学包。
以下是有关如何下载Anaconda的详细教程。
适用于Windows的anaconda和适用于Linux版的anaconda。
创造环境
打开bash(cmd)并输入
提示下载软件包时键入y(表示是)。
我们将在浏览器中为您打开jupyter笔记本。
一些重要的术语
等高线
等高线可以简单地解释为连接所有连续点(连同边界)的曲线,具有相同的颜色或强度。等高线是形状分析和物体检测和识别的有用工具。
阈值
在灰度图像上应用阈值处理使其成为二值图像。您可以设置一个阈值,其中低于此阈值的所有值都将变为黑色,并且上述所有值都将变为白色。
执行
现在你已经拥有了所有你需要的东西。
我们将从一个简单的例子开始,向您展示基于颜色的分割是如何工作的。
耐心等待,直到我们得到好东西。
一个Ombre圈 - 使用photoshop制作的图像
如果你想和我一起试试这个,你可以从这里免费获得这个图像。(https://drive.google.com/file/d/13Xq6IP8e7Kr8FeHWIgfatLHDMLkkiSaU/view?usp=drive_open)
在下面的代码中,我将把这个图像分成17个灰度级。然后使用轮廓测量每个级别的区域。
相同的图像分为17个灰度级
在这个函数中,我只是通过将位于此范围内的所有数据统一到一个强度,在此迭代中简单地转换我想要等高线(高亮)的灰色范围(强度)。我将所有其他强度转换为黑色(包括更大和更小的强度)。
第二步我对图像进行阈值处理,以便只有我想要轮廓的颜色现在显示为白色,而其他所有颜色都转换为黑色。此步骤在这里没有太大变化,但必须完成,因为等高线最适合黑白(阈值)图像。
在应用此步骤(阈值处理)之前,下面的图像将是相同的,除了白色环将是灰色的(第10个灰度级的灰度强度(255-15 * 10))
第10个部分单独出现以便能够计算其面积
等高线的17个灰度级的原始图像
包含区域值的数组
这样我们就可以得到每个灰度级的面积。
这真的很重要吗?
在我们继续之前,我想强调这个主题的重要性。
我是一名计算机工程专业的学生,我正在开展一个名为机器学习的项目,用于智能肿瘤检测和识别。
在该项目中使用基于颜色的图像分割来帮助计算机学习如何检测肿瘤。当处理MRI扫描时,程序必须检测所述MRI扫描的癌症水平。它通过将扫描分割成不同的灰度级别来实现这一点,其中最暗的是充满癌细胞,而最接近白色的是更健康的部分。然后它计算肿瘤对每个灰度级的隶属程度。有了这些信息,该程序能够识别肿瘤及其阶段。
该项目基于软计算、模糊逻辑和机器学习,您可以在模糊逻辑及其如何治愈癌症方面了解更多信息。
物体检测
在此图像中,我们只想绘制叶子的轮廓。由于该图像的纹理非常不规则且不均匀,这意味着虽然没有很多颜色。该图像中的绿色强度也改变其亮度。因此,这里最好的做法是将所有这些不同的绿色阴影统一为一个阴影。这样当我们应用轮廓时,它将处理叶子作为一个整体对象。
注意:如果您在图像上应用等高线而不进行任何预处理,则会出现这种情况。我只是想让你看看叶子的不均匀性是如何让OpenCV不明白这只是一个对象。
在没有预处理的情况下进行轮廓加工,检测到531个轮廓
首先,您必须知道颜色的HSV表示,您可以通过将其RGB转换为HSV来了解它,如下所示。
获得绿色HSV颜色表示
将图像转换为HSV:使用HSV可以更轻松地获得一种颜色的完整范围。 HSV,H代表Hue,S代表饱和度,V代表值。我们已经知道绿色是[60,255,255]。世界上所有的都在[45,100,50]到[75,255,255]之内,即[60-15,100,50]到[60 + 15,255,255]。图15仅是近似值。
我们取这个范围并将其转换为[75,255,200]或任何其他浅色(第三个值必须相对较大),因为这是颜色的亮度,当我们设置图像阈值时,这个值将使该部分变为白色。
转换为HSV后的图像(1)
应用蒙版后的图像(颜色统一)(2)
从HSV转换为灰色后的图像(3)
阈值图像,最后一步(4)
最终轮廓(5)
由于背景中似乎也存在不规则性,我们可以使用这种方法获得最大的轮廓,最大的当然是叶子。
我们可以得到轮廓数组中叶子轮廓的索引,从中得到叶子的面积和中心。
轮廓具有许多其他可以使用的功能,例如轮廓周长、凸包、边界矩形等等。
编译出品