A. 18 图像分割和分水岭算法——opencv的各种操作(第三部分 图像处理的各种方法)
图像分割和分水岭算法是opencv中的图像处理方法,旨在将灰度图像中的不同区域进行分离。这一理论将图像视为地形表面,利用颜色填充和障碍构建过程模拟水流,最终得到分割结果。
然而,实际图像中可能存在噪点或不规则性,导致过度分割。为解决这一问题,OpenCV引入了基于标记的分水岭算法,允许用户指定合并和不合并的区域,实现交互式图像分割。用户通过为前景或物体区域标记不同颜色(或强度),背景区域标记另一种颜色,不确定区域标记为0。应用分水岭算法后,标记将根据给定标签更新,对象边界将标记为-1。
下面示例展示了如何使用距离变换和分水岭算法分割相互接触的对象。首先,处理硬币图像,去除噪声和填充小孔,识别前景和背景。确定硬币区域,使用侵蚀操作或距离变换方法。接着,创建标记数组,标记已确定的前景、背景和不确定区域。通过cv.connectedComponents()函数实现,背景标记为0,其他对象用正整数标记。最后,应用分水岭算法,修改标记图像,边界区域标记为-1。
实际应用中,距离变换和分水岭算法配合使用,能有效分割相互接触的对象。调整参数和方法,可以针对不同场景和需求优化图像分割效果。查看官方文档获取更多关于opencv图像处理技术的详细信息和实现指南。
B. 图像轮廓和分水岭算法
图像轮廓和分水岭算法在图像处理中扮演着关键角色。findContours()函数是寻找二值图像中轮廓的核心工具,它能检测轮廓后,通过drawContours()函数将这些轮廓清晰地呈现出来,便于分析和理解图像结构。
drawContours()函数则用于在原始图像中精确地绘制轮廓,无论是外部轮廓还是内部结构,都能清晰可见。例如,通过运用图像平滑技术(blur()函数)和边缘检测技术(canny()函数),可以动态地根据滑动条调整,实时显示出图形的轮廓变化。
对于分水岭算法,它在图像分割中有独特应用。尽管具体的例子代码没有在文中给出,但通过该算法,图像可以被分割成不同的区域,像是水在地形中的自然流动。分水岭算法的结果通常以视觉效果的形式展示,直观地揭示图像的结构差异。
如果你对图像处理算法感兴趣,特别是OpenCV的相关技术,不妨关注我的微信公众号“OpenCV图像处理算法”。在这里,我将分享我在学习过程中的经验,包括特征提取、目标跟踪、定位、机器学习和深度学习等多个领域的实例,每篇文章都包含详细的源码和相关资料,期待与你一同探索和学习。
C. 分水岭图像分割中,常常用梯度图像代替原始图像作为分水岭算法的输入的原因
分水岭算法是数学形态学分割方法中的经典算法,它将图像看作是地形学上被水覆盖的自然地貌,图像中的每一像素的灰度值表示该点的海拔高度,其每一个局部极小值及其影响区域称为集水盆,集水盆的边界则是分水岭,在各极小区域的表面打一个小孔,同时让水从小孔中涌出,并慢慢淹没极小区域周围的区域,那么各极小区域波及的范围,即是相应的集水盆,对应图像中的区域;不同区域的水流相遇时的界限,就是期望得到的分水岭,对应区域的边缘。分水岭变换可以保证分割区域的连续性和封闭性。
分水岭变换是从局部极小点开始,即只能是在梯度图中用, 原始图是转换后才能用于分水岭变换的
一般图像中存在多个极小值点,通常会存在过分割现象,可以采用梯度阈值分割改进或者采用标记分水岭算法将多个极小值区域连在一起
opencv提供分水岭的代码 可以找来看一下
D. 如何从入门开始学习OpenCV
方法如下:
先去下载最新版OpenCV,网址如下:http://nchc.dl.sourceforge.net/project/opencvlibrary/opencv-win/2.4.3/OpenCV-2.4.3.exe。下载完成后解压到相应目录。本人解压到D:Program FilesOpenCV2.4.3。
有的文章提到使用CMake把OpenCV下面的范例生成为Visual Studio的工程,此处我没有这样做。直接使用范例。这里先把OpenCV目录下面的几个重要目录做个说明:
doc目录:主要包含OpenCV的帮助文档。其中opencv2refman.pdf主要是OpenCV的各种类和函数的使用说明。
opencv_tutorials.pdf,主要是下面教学代码目录里面各个教学范例的简单讲解。
opencv_cheatsheet.pdf主要是最常用OpenCV类和函数的集合。此3个PDF文档对自学者帮助最大。
samplescpp utorial_code目录:里面包含基本教学代码。和上面的opencv_tutorials.pdf文档遥相呼应,构成一个完整的自学体系。
build目录:包含编译,调试,发布所需要的各类动态库,静态库,头文件等。因为OpenCV2.4.3好像只支持Visual Studio 2008以上版本,我在这里以Visual Studio 2008为例讲解如何让范例跑起来。
添加环境变量:此处我在path环境变量中添加如下目录:D:Program FilesOpenCV2.4.3uildx86vc9in。记住在前面一个目录后面加分号。
在Visual Studio中包含头文件目录:见附件中的图片,已经用红色矩形框标识如何操作。
在Visual Studio中包含库文件目录:见附件中的图片,已经用红色矩形框标识如何操作。4
建立一个新建Visual Studio VC win32控制台应用工程,这里我选择带预编译头的工程,省去添加cpp文件的工作。
代码创建:这里我选择samplescpp utorial_codeImgProcMorphology_2.cpp文件。先添加包含目录,如下(以后所有范例均可以如下添加):#include <opencv2/opencv.hpp>#include <stdio.h>然后复制代码。
编译文件:自然少不了要包含静态库,要添加的库(debug版和release差别就是文件名后多了一个d标识是debug版)如下:
debug版:
opencv_calib3d243d.lib
opencv_contrib243d.lib
opencv_core243d.lib
opencv_features2d243d.lib
opencv_flann243d.lib
opencv_gpu243d.lib
opencv_haartraining_engined.lib
ibrelease版:
opencv_calib3d243.lib
opencv_contrib243.lib
opencv_core243.lib
opencv_features2d243.lib
opencv_flann243.lib
opencv_gpu243.lib
字符集设置:如果编译过程中出现如下错误:不能将参数 1 从“_TCHAR *”转换为“const std::string &”原因如下: 无法从“_TCHAR *”转换为“const std::string”。请字符集设置为“使用多字节字符集”。
最后指定命令后参数:方法见附件。这样就可以不用在windows命令行下输入参数了,方便调试,但是要注意,图片必须放在你所建立的工程目录下(和.cpp以及.h文件同一目录)。否则就要加上相应的路径。如果参数多于1个,请以空格分开。
支持所有参数设置完成,开始编译运行吧。如果Visual Studio无问题的话,按照以上按部就班操作,每个范例均可以正常运行。
E. 如何从入门开始学习OpenCV
如何从入门开始学习OpenCV
OpenCV只是个lib,它既不是软件、也不是编程语言,所以我觉得从头到尾按照教程来看一遍可能会存在学习枯燥、无的放矢的局面。
最好的方法是带着问题去学,先从最简单的地方入手,比如调用OpenCV的GUI界面来调节一幅图像的灰度,再复杂些可以利用鼠标交互来实现PS的魔棒效果(分水岭算法)等等,这些网上都有很多现成的代码来学习,OpenCV 中文论坛上也有不少大牛来回答问题。
单纯的学习OpenCV的人不多,学习OpenCV只是为了更方便的编程,所以某种角度来看
OpenCV只是把锋利的快刀,用刀本身不是目的,用刀切出有型的菜才是目的。
如果没有编程语言的要求,建议从Python 2.7 +OpenCV 2.4X 入手,为解决问题而思考,有种用Matlab的畅快感。
《Learning OpenCV》是本好书,可以在入门后作为工具书查阅。