基于OpenCV的分水岭分割算法的及应用
- 格式:pdf
- 大小:441.04 KB
- 文档页数:3
图像处理中的标记分水岭分割算法如果图像中的目标物体是连接在一起的,则分割起来会更困难,分水岭分割算法经常用于处理这类问题,通常会取得比较好的效果。
分水岭分割算法把图像看成一幅“地形图”,其中亮度比较强的区域像素值较大,而比较暗的区域像素值较小,通过寻找“汇水盆地”和“分水岭界限”,对图像进行分割。
直接应用分水岭分割算法的效果往往并不好,如果在图像中对前景对象和背景对象进行标注区别,再应用分水岭算法会取得较好的分割效果。
有很多图像处理工具箱函数可以用到,如fspecial、imfilter、watershed、lable2rgb、imopen、imclose、imreconstruct、imcomplement、imregionalmax、bwareaopen、graythresh、和imimposemin函数等。
下面进行一个例子,步骤如下。
1、读取图像并求其边界,代码如下。
rgb = imread('pears.png');%读取原图像I = rgb2gray(rgb);%转化为灰度图像figure; subplot(121)%显示灰度图像imshow(I)text(732,501,'Image courtesy of Corel',...'FontSize',7,'HorizontalAlignment','right')hy = fspecial('sobel');%sobel算子hx = hy';Iy = imfilter(double(I), hy, 'replicate');%滤波求Y方向边缘Ix = imfilter(double(I), hx, 'replicate');%滤波求X方向边缘gradmag = sqrt(Ix.^2 + Iy.^2);%求模subplot(122); imshow(gradmag,[]), %显示梯度title('Gradient magnitude (gradmag)')在这一步骤中,首先读取一套真彩色图像,然后把真色图像转化为灰度图像,结果如图所示:图1原图和梯度图像使用sobel 边缘算子对图像进行水平和垂直方向的滤波,然后求取模值,sobel 算子滤波后的图像在边缘处会显示比较大的值,在没有边界处的值会很小,如上图右图所示。
C++中实现OpenCV图像分割与分⽔岭算法分⽔岭算法是⼀种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从⽽将在空间位置上相近并且灰度值相近的像素点互相连接起来构成⼀个封闭的轮廓,封闭性是分⽔岭算法的⼀个重要特征。
API介绍void watershed( InputArray image, InputOutputArray markers );参数说明:image: 必须是⼀个8bit 3通道彩⾊图像矩阵序列markers: 在执⾏分⽔岭函数watershed之前,必须对第⼆个参数markers进⾏处理,它应该包含不同区域的轮廓,每个轮廓有⼀个⾃⼰唯⼀的编号,轮廓的定位可以通过Opencv中findContours⽅法实现,这个是执⾏分⽔岭之前的要求。
算法会根据markers传⼊的轮廓作为种⼦(也就是所谓的注⽔点),对图像上其他的像素点根据分⽔岭算法规则进⾏判断,并对每个像素点的区域归属进⾏划定,直到处理完图像上所有像素点。
⽽区域与区域之间的分界处的值被置为“-1”,以做区分。
我们将⼀个如何使⽤距离变换和分⽔岭分割相互接触的物体的例⼦。
考虑⼀下下⾯的硬币图像,这些硬币相互接触。
即使你去阈值化它,它也会互相碰触。
我们从找到硬币的⼤概估计值开始。
为此,我们可以利⽤⼤津的⼆值化。
#include<iostream>#include<opencv2\opencv.hpp>using namespace std;using namespace cv;int main() {Mat gray, thresh;Mat img = imread("coins.jpg");cvtColor(img, gray, COLOR_BGR2GRAY);threshold(gray, thresh, 0, 255, THRESH_BINARY_INV+CV_THRESH_OTSU);imshow("Otst阈值图像", thresh);waitKey(0);return 0;}阈值后的图像如下所⽰:现在需要去除图像中任何微⼩的⽩⾊噪声。
opencv分水岭算法cvWatershedopencv 分水岭算法cvWatershed(2012-09-04 16:42:04)转载▼标签:分水岭分类:专业it“分水岭的计算过程是一个迭代标注过程。
分水岭比较经典的计算方法是L. Vincent提出的。
在该算法中,分水岭计算分两个步骤,一个是排序过程,一个是淹没过程。
首先对每个像素的灰度级进行从低到高排序,然后在从低到高实现淹没过程中,对每一个局部极小值在h阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。
分水岭变换得到的是输入图像的集水盆图像,集水盆之间的边界点,即为分水岭。
显然,分水岭表示的是输入图像极大值点。
因此,为得到图像的边缘信息,通常把梯度图像作为输入图像,即g(x,y)=grad(f(x,y))={[f(x,y)-f(x-1,y)]2[f(x,y)-f(x,y-1)]2}0.5 式中,f(x,y)表示原始图像,grad{.}表示梯度运算。
分水岭算法对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化,都会产生过度分割的现象。
但同时应当看出,分水岭算法对微弱边缘具有良好的响应,是得到封闭连续边缘的保证的。
另外,分水岭算法所得到的封闭的集水盆,为分析图像的区域特征提供了可能。
为消除分水岭算法产生的过度分割,通常可以采用两种处理方法,一是利用先验知识去除无关边缘信息。
二是修改梯度函数使得集水盆只响应想要探测的目标。
Opencv中cvWatershed(const Mat &image , Mat& markers);函数并不是上述采用传统的方法。
markers即是输入矩阵也是输出矩阵,大小与image大小相同。
使用该函数的时候,用户在markers矩阵中必须粗略指定两种以上区域,该区域为1个点以上的连通点集,并用不同的正整数(1,2,3…)标记。
这些区域可以用cvFindContour(),和cvDrawContour()标记。
毕业论文声明本人郑重声明:1.此毕业论文是本人在指导教师指导下独立进行研究取得的成果。
除了特别加以标注地方外,本文不包含他人或其它机构已经发表或撰写过的研究成果。
对本文研究做出重要贡献的个人与集体均已在文中作了明确标明。
本人完全意识到本声明的法律结果由本人承担。
2.本人完全了解学校、学院有关保留、使用学位论文的规定,同意学校与学院保留并向国家有关部门或机构送交此论文的复印件和电子版,允许此文被查阅和借阅。
本人授权大学学院可以将此文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本文。
3.若在大学学院毕业论文审查小组复审中,发现本文有抄袭,一切后果均由本人承担,与毕业论文指导老师无关。
4.本人所呈交的毕业论文,是在指导老师的指导下独立进行研究所取得的成果。
论文中凡引用他人已经发布或未发表的成果、数据、观点等,均已明确注明出处。
论文中已经注明引用的内容外,不包含任何其他个人或集体已经发表或撰写过的研究成果。
对本文的研究成果做出重要贡献的个人和集体,均已在论文中已明确的方式标明。
学位论文作者(签名):年月关于毕业论文使用授权的声明本人在指导老师的指导下所完成的论文及相关的资料(包括图纸、实验记录、原始数据、实物照片、图片、录音带、设计手稿等),知识产权归属华北电力大学。
本人完全了解大学有关保存,使用毕业论文的规定。
同意学校保存或向国家有关部门或机构送交论文的纸质版或电子版,允许论文被查阅或借阅。
本人授权大学可以将本毕业论文的全部或部分内容编入有关数据库进行检索,可以采用任何复制手段保存或编汇本毕业论文。
如果发表相关成果,一定征得指导教师同意,且第一署名单位为大学。
本人毕业后使用毕业论文或与该论文直接相关的学术论文或成果时,第一署名单位仍然为大学。
本人完全了解大学关于收集、保存、使用学位论文的规定,同意如下各项内容:按照学校要求提交学位论文的印刷本和电子版本;学校有权保存学位论文的印刷本和电子版,并采用影印、缩印、扫描、数字化或其它手段保存或汇编本学位论文;学校有权提供目录检索以及提供本学位论文全文或者部分的阅览服务;学校有权按有关规定向国家有关部门或者机构送交论文的复印件和电子版,允许论文被查阅和借阅。
分水岭算法详细介绍与应用
分水岭算法(Watershed Algorithm),是一种用于图像分割的算法,主要用于识别图像中不同区域的分界,将不同的图像部件分割开实现分割任务,
可以用于图像分割,对象检测,语义分割,目标检测等应用领域。
它有两个关键步骤:Marker- Controlled Watershed Algorithm 和Region-Growing Watershed Algorithm。
Marker- Controlled Watershed Algorithm 使用标记控制水岭算法来实现图像分割,该算法将图像分割成不同的区域,通过将固定的标记放置在感兴趣的区域的边界上来区分这些区域。
它将这个有限的标记视为特殊的水源,并通过将聚类和标记之间的距离(山谷深度)作为一种特殊的权重来进行分割。
Region-Growing Watershed Algorithm 则是一种基于区域的算法,它将图像划分为不同的区域,然后逐渐地将这些区域划分更进一步,最后形成图像分割的结果。
应用场景:
1. 医学图像分割:分水岭算法可用于分割脑部及胸部CT图像,识别出特定部位,可用于肿瘤信息检测等;
2. 目标检测:分水岭算法可用于目标行为分析中,识别出舞蹈等动作;
3. 车牌识别:分水岭算法可与边缘检测相结合,实现车牌的识别;
4. 美容整形:使用分水岭算法用于晶体管(LightSheet)成像中,可以更精确的识别出需要整形的面部特征,比如眼睛、口红、嘴唇等;
5. 地图编辑:使用分水岭算法可以帮助专业人员编辑某个地点的街道图,例如,可以将街道、公园、河流等分割出来;
6. 后期处理:可以用分水岭算法来帮助专业人员识别难以被分辨的图像,如细胞等。
分水岭算法解析分水岭的概念源于水流的概念。
我们可以将图像看作是一个地形图,灰度值高的点看作是山峰,灰度值低的点看作是低谷。
水流会从山峰流向低谷,当水流汇聚在一起时就形成了水坝。
在图像中,局部极小值点就相当于低谷,而水坝则表示分割的边界。
分水岭算法的基本原理是将图像看作一个潜在的三维表面,其中横轴和纵轴表示图像的位置坐标,而高度表示图像的灰度值。
算法的过程就是从局部极小值点开始,模拟水流的流动,直到水坝形成,得到图像的分割结果。
分水岭算法的主要步骤包括边缘检测、标记局部极小值点、生成梯度图、将局部极小值点作为种子点进行标记,然后进行泛洪填充,最后将边界提取出来得到分割结果。
分水岭算法的优点是对图像中的噪音具有一定的鲁棒性,能够处理复杂的图像结构。
但是,它也存在一些问题,例如分割结果可能会受到局部极小值点位置的影响,容易产生过分割或者欠分割的情况。
在本文中,我们将对分水岭算法的原理和实现进行详细的探讨。
首先,我们将介绍分水岭算法的基本原理和步骤,然后详细讨论如何实现这些步骤。
最后,我们将通过一个实例来展示分水岭算法在图像分割中的应用。
2. 分水岭算法的原理及步骤2.1 基本原理分水岭算法的基本原理是基于图像的灰度值和梯度来进行像素的分割。
它将图像看作是一个三维表面,其中横轴和纵轴表示图像的位置坐标,而高度表示图像的灰度值。
算法的过程就是模拟水流的流动,从局部极小值点开始,直到水坝形成,得到图像的分割结果。
在图像中,局部极小值点就相当于低谷,而水坝则表示分割的边界。
当水流汇聚在一起时,就形成了水坝。
因此,分水岭算法的目标就是找到图像中的局部极小值点,并模拟水流的流动,直到形成水坝,得到图像的分割结果。
2.2 算法步骤分水岭算法的主要步骤包括边缘检测、标记局部极小值点、生成梯度图、将局部极小值点作为种子点进行标记,然后进行泛洪填充,最后将边界提取出来得到分割结果。
(1)边缘检测首先对图像进行边缘检测,得到图像的梯度信息。
基于标记的分水岭算法原理
1、分水岭分割法是一种基于拓扑理论的数学形态学分割方法。
它的基本思想是把一幅图像看成一个测地线拓扑地形。
图像中每个像素的灰度值代表该点的海拔高度,每个局部最小值及其影响区域称为集水盆,集水盆的边界形成分水岭。
分水岭的概念和形成可以通过模拟浸泡过程来解释。
在每个局部最小值的表面扎一个小洞,然后将整个模型慢慢浸入水中。
随着浸没的加深,每个局部极小值的影响区域逐渐向外扩展,在两个集水池的汇合处筑起一道堤坝,形成一个分水岭。
2、分水岭的计算过程是一个迭代标注的过程。
经典的流域计算方法是由L. Vincent提出的。
在该算法中,分水岭计算分为两个步骤,一个是排序过程,另一个是洪泛过程。
首先,将每个像素的灰度从低到高排序。
然后,在由低到高的泛洪过程中,利用先进先出(FIFO)结构,在H阶高度判断并标记每个局部最小值的影响区域。
3、分水岭变换是输入图像的分水岭图像,分水岭之间的边界点是分水岭。
显然,分水岭表示输入图像的最大点。
因此,为了获得图像的边缘信息,通常使用梯度图像作为输入图像。
分水岭算法(理论+opencv实现)
把图像用一维坐标表示,二维和三维不好画,必须用matlab了,我不会用,意思可以表述到位
第一步:找到图像的局部最低点,这个方法很多了,可以用一个内核去找,也可以一个一个比较,实现起来不难。
第二步:从最低点开始注水,水开始网上满(图像的说法就是梯度法),其中那些最低点已经被标记,不会被淹没,那些中间点是被淹没的。
第三步:找到局部最高点,就是图中3位置对应的两个点。
第四步:这样基于局部最小值,和找到的局部最大值,就可以分割图像了。
分类图
模拟结果图
是不是感觉上面的方法很好,也很简单?接着看下面的图:
利用上面的步骤,第一步找到了三个点,然后第二步开始漫水,这三个点都被记录下来了,又找到两个局部最大值。
这是我们想要的吗?
回答是否定的!其中中间那个最小值我们不需要,因为只是一个很少并且很小的噪点而已,我们不需要图像分割的那么细致。
缺陷显露出来了吧?没关系,下面我们的opencv把这个问题解决了。
模拟分类图
模拟结果图
opencv改进的分水岭算法:。
Opencv实现⽤于图像分割分⽔岭算法⽬标• 使⽤分⽔岭算法基于掩模的图像分割• 学习函数: cv2.watershed()原理 任何⼀幅灰度图像都可以被看成拓扑平⾯,灰度值⾼的区域可以被看成是⼭峰,灰度值低的区域可以被看成是⼭⾕。
我们向每⼀个⼭⾕中灌不同颜⾊的⽔,随着⽔的位的升⾼,不同⼭⾕的⽔就会相遇汇合,为了防⽌不同⼭⾕的⽔汇合,我们需要在⽔汇合的地⽅构建起堤坝。
不停的灌⽔,不停的构建堤坝直到所有的⼭峰都被⽔淹没。
我们构建好的堤坝就是对图像的分割。
这就是分⽔岭算法的背后哲理。
但是这种⽅法通常都会得到过度分割的结果,这是由噪声或者图像中其他不规律的因素造成的。
为了减少这种影响,OpenCV 采⽤了基于掩模的分⽔岭算法,在这种算法中我们要设置哪些⼭⾕点会汇合,哪些不会,这是⼀种交互式的图像分割。
我们要做的就是给我们已知的对象打上不同的标签。
如果某个区域肯定是前景或对象,就使⽤某个颜⾊(或灰度值)标签标记它。
如果某个区域肯定不是对象⽽是背景就使⽤另外⼀个颜⾊标签标记。
⽽剩下的不能确定是前景还是背景的区域就⽤ 0 标记。
这就是我们的标签。
然后实施分⽔岭算法。
每⼀次灌⽔,我们的标签就会被更新,当两个不同颜⾊的标签相遇时就构建堤坝,直到将所有⼭峰淹没,最后我们得到的边界对象(堤坝)的值为 -1。
代码 下⾯的例⼦中我们将就和距离变换和分⽔岭算法对紧挨在⼀起的对象进⾏分割。
如下图所⽰,这些硬币紧挨在⼀起。
就算你使⽤阈值操作,它们任然是紧挨着的。
我们从找到这些硬币的近似估计值开始,我们使⽤Otsu's⼆值化。
import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread('image/coins.png')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret,thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)结果图: 现在我们要去除图像中的所有的⽩噪声,这就需要使⽤形态学中的开运算。
opencv 分水岭法
OpenCV分水岭法是一种图像分割的算法,主要用于在一幅图像
中自动把物体与背景分离。
分水岭法的基本思想是把图像看作是一个地形图,然后通过分析这个地形图的波峰和波谷来分离出不同的物体。
具体实现时,需要先对图像进行预处理,如去掉噪声、进行灰度化等操作。
然后通过计算图像的梯度来寻找局部最高点,并将这些最高点与周围的像素分成不同的区域。
最后通过对这些区域进行合并,得到最终的分割结果。
分水岭法在图像分割领域有广泛的应用,如医学图像处理、交通监控等领域。
但是它也存在一些问题,如对噪声敏感、容易产生过分割等问题,因此在实际应用时需要慎重选择。
- 1 -。
pythonopencv之分⽔岭算法⽰例本⽂介绍了python opencv之分⽔岭算法⽰例,分享给⼤家,具体如下:⽬标1. 使⽤分⽔岭算法对基于标记的图像进⾏分割2. 使⽤函数cv2.watershed()原理:灰度图像可以被看成拓扑平⾯,灰度值⾼的区域可以看出⼭峰,灰度值低的区域可以看成是⼭⾕。
向每⼀个⼭⾕当中灌不同颜⾊的⽔。
⽔位升⾼,不同⼭⾕的⽔会汇合,为防⽌不同⼭⾕的⽔汇合,⼩在汇合处建⽴起堤坝。
然后继续灌⽔,然后再建⽴堤坝,直到⼭峰都掩模。
构建好的堤坝就是图像的分割。
此⽅法通常会得到过渡分割的结果,因为图像中的噪声以及其他因素。
为了减少此影响,opencv使⽤基于标记的分⽔岭算法,此算法要设置哪些⼭⾕中的汇合点,哪些不是。
这是⼀种交互式的图像分割算法那。
我们要给已知对象打上不同表情。
如果某个区域肯定是前景或对象,就使⽤某个颜⾊或灰度值标签标记它。
如果是背景那么使⽤其他颜⾊进⾏标记,其余不能确定的部分⽤0标记。
然后使⽤分⽔岭算法,每次灌⽔,标签会被更新,当两个不同颜⾊的标签相遇就会构建堤坝,知道所有⼭峰掩模,最后得到的边界对象值是-1。
代码:对挨在⼀起的对象进⾏分割。
使⽤Otsu's ⼆值化后的结果为要出去图像中的⽩噪声。
可以使⽤形态学运算,使⽤闭运算去除对象中的空洞。
靠近对象中⼼的区域是前景,离对象远的区域是背景,不确定的区域是边界。
⾸先提取硬币区域,使⽤腐蚀操作去掉边缘,剩下的就是硬币。
但硬币没有接触时,此⽅法有效,但是由于硬币相互接触,就要使⽤另外⼀种有效的⽅法:距离变换加上合适的阈值。
之后,要寻找不确定是否是硬币的区域。
这⾥需要膨胀操作。
膨胀操作会将对象边界延伸到背景当中。
由于边界区域被去除,现在就能知道哪些区域是前景,哪些是背景。
余下的区域不知道如何区分,那么使⽤分⽔岭算法。
这些区域通常是前景与背景的交界处。
从能否确认是否是背景的区域中减去确定是前景的区域就得到了边界。
OpenCV学习之图像的分割与修复详解⽬录背景⼀、分⽔岭法⼆、GrabCut法三、MeanShift法四、MOG前景背景分离法五、拓展⽅法六、图像修复总结背景图像分割本质就是将前景⽬标从背景中分离出来。
在当前的实际项⽬中,应⽤传统分割的并不多,⼤多是采⽤深度学习的⽅法以达到更好的效果;当然,了解传统的⽅法对于分割的整体认知具有很⼤帮助,本篇将介绍些传统分割的⼀些算法;⼀、分⽔岭法原理图如下:利⽤⼆值图像的梯度关系,设置⼀定边界,给定不同颜⾊实现分割;实现步骤:标记背景 —— 标记前景 —— 标记未知区域(背景减前景) —— 进⾏分割函数原型:watershed(img,masker):分⽔岭算法,其中masker表⽰背景、前景和未知区域;distanceTransform(img,distanceType,maskSize):矩离变化,求⾮零值到最近的零值的距离;connectedComponents(img,connectivity,…):求连通域;代码实现:img = cv2.imread('water_coins.jpeg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 加⼊cv2.THRESH_OTSU表⽰⾃适应阈值(实现更好的效果)ret, thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 开运算(去噪点)kernel = np.ones((3,3), np.int8)open1 = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations = 2)#膨胀beijing = cv2.dilate(open1, kernel, iterations = 1)# 获取前景tmp = cv2.distanceTransform(open1, cv2.DIST_L2, 5)ret, qianjing = cv2.threshold(tmp, 0.7*tmp.max(), 255, cv2.THRESH_BINARY)# 获取未知区域beijingj = np.uint8(beijing)qianjing = np.uint8(qianjing)unknow = cv2.subtract(beijing, qianjing)# 创建连通域ret, masker = cv2.connectedComponents(qianjing)masker = masker + 1masker[unknow==255] = 0# 进⾏图像分割result = cv2.watershed(img, masker)img[result == -1] = [0, 0, 255]cv2.imshow('result', img)cv2.waitKey(0)⼆、GrabCut法原理:通过交互的⽅式获得前景物体;1、⽤户指定前景的⼤体区域,剩下的为背景区域;2、⽤户可以明确指定某些地⽅为前景或背景;3、采⽤分段迭代的⽅法分析前景物体形成模型树;4、根据权重决定某个像素是前景还是背景;函数原型:grabCut(img,mask,rect,bgdModel,fbgModel,5,mode)mask:表⽰⽣成的掩码,函数输出的值,其中0表⽰背景、1表⽰前景、2表⽰可能背景、3表⽰可能前景;代码如下:class App:flag_rect = Falserect=(0, 0, 0, 0)startX = 0startY = 0def onmouse(self, event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDOWN:self.flag_rect = Trueself.startX = xself.startY = yprint("LBUTTIONDOWN")elif event == cv2.EVENT_LBUTTONUP:self.flag_rect = Falsecv2.rectangle(self.img,(self.startX, self.startY),(x, y),(0, 0, 255),3)self.rect = (min(self.startX, x), min(self.startY, y),abs(self.startX - x),abs(self.startY -y))print("LBUTTIONUP")elif event == cv2.EVENT_MOUSEMOVE:if self.flag_rect == True:self.img = self.img2.copy()cv2.rectangle(self.img,(self.startX, self.startY),(x, y),(255, 0, 0),3)print("MOUSEMOVE")print("onmouse")def run(self):print("run...")dWindow('input')cv2.setMouseCallback('input', self.onmouse)self.img = cv2.imread('./lena.png')self.img2 = self.img.copy()self.mask = np.zeros(self.img.shape[:2], dtype=np.uint8)self.output = np.zeros(self.img.shape, np.uint8)while(1):cv2.imshow('input', self.img)cv2.imshow('output', self.output)k = cv2.waitKey(100)if k == 27:breakif k == ord('g'):bgdmodel = np.zeros((1, 65), np.float64)fgdmodel = np.zeros((1, 65), np.float64)cv2.grabCut(self.img2, self.mask, self.rect,bgdmodel, fgdmodel,1,cv2.GC_INIT_WITH_RECT)# 注意np.where的⽤法可以⽤来筛选前景mask2 = np.where((self.mask==1)|(self.mask==3), 255, 0).astype('uint8')self.output = cv2.bitwise_and(self.img2, self.img2, mask=mask2)由于效果并不是特别明显,并且运⾏时耗时会⽐较长,在这⾥就不展⽰了;注意:np.where的⽤法需要掌握,可以将⼀个矩阵中选定的值与未选定的值做⼆值化的处理;三、MeanShift法实现原理:并不是⽤来进⾏图像分割的,⽽是在⾊彩层⾯的平滑滤波;中和⾊彩分布相近的颜⾊,平滑⾊彩细节,腐蚀掉⾯积较⼩的颜⾊区域;以图像上任意点P为圆⼼,半径为sp,⾊彩幅值为sr进⾏不断的迭代;函数原型:pyrMeanShiftFiltering(img,sp,sr,…)代码实现:img = cv2.imread('flower.png')result = cv2.pyrMeanShiftFiltering(img, 20, 30)cv2.imshow('img', img)cv2.imshow('result', result)cv2.waitKey(0)通过该函数可以实现⾊彩的平滑处理,做特效也是不错的(有种卡通化的效果),虽然该函数并不能直接做图像分割,但处理后的图像可以通过canny算法进⾏边缘检测;Canny代码:img = cv2.imread('key.png')result = cv2.pyrMeanShiftFiltering(img, 20, 30)img_canny = cv2.Canny(result, 150, 300)contours, _ = cv2.findContours(img_canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)cv2.drawContours(img, contours, -1, (0, 0, 255), 2)cv2.imshow('img', img)cv2.imshow('result', result)cv2.imshow('canny', img_canny)cv2.waitKey(0)四、MOG前景背景分离法⾸先需要了解视频的⼀些原理:视频是⼀组连续帧组成的(⼀帧也可以看作⼀副图像)帧与帧之间关系密切(⼜称为GOP)在GOP中,背景⼏乎是不变的主要有以下⼏种⽅法:1、MOG去背景原理:混合⾼斯模型为基础的前景、背景分割法;函数原型:createBackgroundSubtractorMOG(其中的默认值就不做讲解了)代码实战:cap = cv2.VideoCapture('./vtest.avi')mog = cv2.bgsegm.createBackgroundSubtractorMOG()while(True):ret, frame = cap.read()mask = mog.apply(frame)cv2.imshow('img', mask)k = cv2.waitKey(10)if k == 27:breakcap.release()cv2.destroyAllWindows()五、拓展⽅法1、MOG2说明:与MOG算法类似,但对于亮度产⽣的阴影有更好的识别效果,噪点更多;函数原型:createBackgroundSubtractorMOG2(默认参数不作介绍)效果展⽰:2、GMG说明:静态背景图像估计和每个像素的贝叶斯分割抗噪性更强;函数原型:createBackgroundSubtractorGMG()效果展⽰:总结:GMG开始会不显⽰⼀段时间,这是由于初始参考帧的数量和过⼤;对⽐业界的效果来看,这些传统⽅法的效果并不好,特别是对⽐深度学习的算法;但很多原理值得我们取思考借鉴,模型只是给出我们问题的优解,如果能将传统算法结合深度学习算法,那是否能在提速的同时,也达到⼀个可观的效果,这是我思考的⼀个点,欢迎⼤家发表⾃⼰的意见;六、图像修复说明:我们的图像往往会有⼀些马赛克的存在,特别是⼀些⽼照⽚会有不必要的图案,图像修复就是⽤于解决这类问题,并不等同于超清化;函数原型:inpaint(img,mask,inpaintRadius,两种⽅式:INPAINT_NS、INPAINT_TELEA)代码案例:img = cv2.imread('inpaint.png')mask = cv2.imread('inpaint_mask.png', 0)result = cv2.inpaint(img, mask, 5, cv2.INPAINT_TELEA)cv2.imshow('img', img)cv2.imshow('result', result)cv2.waitKey()总结:从结果来看,效果相当不错,但前提我们需要知道需要修复的部分,所以应⽤的场景也会⽐较局限;总结简单介绍了⼀些传统的⼀些图像分割算法,并没有涉及原理,感兴趣的可以⾃⾏了解;当然,现在业界的分割算法都采⽤深度学习的⽅式了,并且也有了很好的效果和落地应⽤。
深度学习图像分割分⽔岭算法代码## opencv python 基于分⽔岭算法的图像分割# 这种⽅法可能会导致由于噪声或图像中任何其他不正常的情况⽽导致的结果过于分散import cv2import numpy as npfrom matplotlib import pyplot as plt#读取图⽚img = cv2.imread('20210212_78947.jpg')# 灰度图⽚gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 返回ret '通过INV+OTSU 找到最合适的阈值 thresh返回处理后的图⽚ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)cv2.imshow('img1',thresh)# noise removal# 开运算(opening) 等于对图像先进⾏腐蚀(erode) 然后进⾏膨胀(dilate).# 通常⽤于去除⼩粒噪声# Python np.ones()函数返回给定形状和数据类型的新数组,其中元素的值设置为1kernel = np.ones((3,3),np.uint8)print('kernel',kernel)# 形态开运算# openvc中morphologyEx()函数是⼀种形态学变化函数。
# 数学形态学可以理解为⼀种滤波⾏为,因此也称为形态学滤波。
# 滤波中⽤到的滤波器(kernal),在形态学中称为结构元素。
# 结构元素往往是由⼀个特殊的形状构成,如线条、矩形、圆等。
# cv2.morphologyEx(img,op,kernel)# img 经过阈值处理后的数据# op:cv2.MORPH_OPEN 开运算(open) ,先腐蚀后膨胀的过程。
基于分水岭分割的图像检索系统研究与实现的开题报告开题报告一、选题背景随着数字图像处理技术的不断发展,图像检索技术的应用越来越广泛。
现在,图像检索技术已经应用于人脸识别、车辆识别、行人识别、医学图像识别、文物保护、智能交通等各个领域。
在这些应用场景中,图像分割是图像处理的一个重要步骤。
分水岭分割是一种基于区域的分割方法,已经被广泛应用于图像分割领域。
然而,在实际应用中,由于分水岭分割方法的参数较多,容易出现分割效果不佳的情况。
因此,开发一种基于分水岭分割的图像检索系统,优化分水岭分割的参数,提高分割效果,具有重要的研究意义和应用价值。
二、研究目的本文的主要目的是研究和实现一种基于分水岭分割的图像检索系统,主要包括以下几个方面的内容:1.对分水岭分割方法进行深入研究,掌握其原理和基本方法。
2.探索基于分水岭分割的图像检索方法,通过实验验证其可行性和效果。
3.优化分水岭分割的参数,提高图像分割的效果,同时探讨参数优化的方法和技巧。
4.搭建具有友好界面的图像检索系统,实现图像检索功能。
三、研究内容本文拟用以下几个方面内容进行研究:1、分水岭分割的原理和机制分水岭分割是一种常用的图像分割方法,但由于其算法的复杂性,很难达到理想的分割效果。
因此,本文首先将对分水岭分割方法的原理和机制进行深入研究。
2、基于分水岭分割的图像检索方法本文将探索一种基于分水岭分割的图像检索方法,通过实验验证其的可行性和效果。
3、分水岭分割的参数优化分水岭分割方法的参数很多,不同的参数组合将产生不同的分割效果,因此,本文将探讨分水岭分割的参数的优化方法和技巧。
4、图像检索系统的实现本文将采用Matlab作为基本操作平台,利用Matlab中的图像处理工具箱和图像检索工具箱,搭建具有友好界面的图像检索系统。
四、研究方法和技术路线1.文献调研和相关算法学习,掌握分水岭分割方法的原理和基本思想2.进行实验测试,通过对不同的参数组合进行实验比较,提高分割效果3.搭建图像检索系统,实现图像检索功能。
OpenCV开发笔记(五⼗九):红胖⼦8分钟带你深⼊了解分⽔岭算法(图⽂并茂+浅显易懂+程序源码)上⼀篇:《》下⼀篇:持续补充中…前⾔ 红胖⼦,来也! 做识别,有时候需求要识别物体,物体在背景上⽐较杂,但是其边缘与背景图相差⼤,这个时候可以使⽤分⽔岭算法突出两边的颜⾊对⽐度,从⽽更好的分割。
Demo分⽔岭算法概述 分⽔岭分割⽅法,是⼀种基于拓扑理论的数学形态学的分割⽅法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每⼀点像素的灰度值表⽰该点的海拔⾼度,每⼀个局部极⼩值及其影响区域称为集⽔盆,⽽集⽔盆的边界则形成分⽔岭。
简单来说就是根据图像相邻的像素差值,分成不同区域,将各区域染成不同颜⾊,其适合使⽤者已经可以标记已知对象或背景中的⼀部分。
&emp;分⽔岭的概念和形成可以通过模拟浸⼊过程来说明。
在每⼀个局部极⼩值表⾯,刺穿⼀个⼩孔,然后把整个模型慢慢浸⼊⽔中,随着浸⼊的加深,每⼀个局部极⼩值的影响域慢慢向外扩展,在两个集⽔盆汇合处构筑⼤坝,即形成分⽔岭。
分⽔岭的计算过程是⼀个迭代标注过程。
原理 分⽔岭⽐较经典的计算⽅法是L. Vincent提出的。
在该算法中,分⽔岭计算分两个步骤,⼀个是排序过程,⼀个是淹没过程。
⾸先对每个像素的灰度级进⾏从低到⾼排序,然后在从低到⾼实现淹没过程中,对每⼀个局部极⼩值在h阶⾼度的影响域采⽤先进先出(FIFO)结构进⾏判断及标注。
分⽔岭变换得到的是输⼊图像的集⽔盆图像,集⽔盆之间的边界点,即为分⽔岭。
显然,分⽔岭表⽰的是输⼊图像极⼤值点。
因此,为得到图像的边缘信息,通常把梯度图像作为输⼊图像,即g(x,y)=grad(f(x,y))={[f(x,y)-f(x-1,y)]2[f(x,y)-f(x,y-1)]2}0.5式中,f(x,y)表⽰原始图像,grad{.}表⽰梯度运算。
分⽔岭算法对微弱边缘具有良好的响应,图像中的噪声、物体表⾯细微的灰度变化,都会产⽣过度分割的现象。
基于OpenCV的分水岭分割算法的研究及应用[摘要]本文对基于形态学分水岭算法进行了深入的研究,并针对其存在的过分割问题对分水岭算法提出改进:使用区域合并方法限制允许出现的区域的数目,这种改进的方法不仅可以很好地抑制过分割问题,还能有效分割出图像中的感兴趣区域,以达到提取图像有效边缘信息的目的。
将此方法在OpenCV下进行实验,结果表明这种方法可以有效清除干扰噪声及局部极小值,从而得到精确的分割结果。
[关键词]分水岭算法;过分割;区域合并;OpenCV[中图分类号]TP391.4[文献标识码]A[文章编号]1008-178X(2012)12-0020-03燕杨1,2,王云吉2(1.长春师范学院计算机科学与技术学院,吉林长春130032;2.吉林大学通信工程学院,吉林长春130022)[收稿日期]2012-07-16[基金项目]吉林省科技发展计划项目青年科研基金(201201112)。
[作者简介]燕杨(1981-),女,吉林长春人,长春师范学院计算机科学与技术学院讲师,博士研究生,从事数字图像处理研究。
第31卷第12期Vol.31No.12长春师范学院学报(自然科学版)JournalofChangchunNormalUniversity(NaturalScience)2012年12月Dec.20121分水岭算法简介分水岭算法是基于形态学的图像分割方法,其分割特点为定位精确和分割图像边缘准确,在图像分割领域得到了广泛的应用。
在许多实际情况下,我们要分割图像,但无法从背景图像中获得有用信息。
分水岭算法在这方面往往是有效的,该算法可以将图像中的边缘转化为“山脉”,将均匀区域转化为“山谷”以便分隔目标。
分水岭算法先计算灰度图像的梯度,让亮度值低的点(山谷)、山脊对应的边缘(山头)同时形成,然后从指定点开始持续“灌注”盆地,直到这些区域链接在一起。
这种方法产生的标记可以把各个区域合并到一起,合并后的区域又通过“聚集”的方式进行分割,好像图像被“填充”起来一样。
与指示点相连的盆地就为指示点“所拥有”,从而得到被分割成相应的标记区域的图像。
分水岭算法允许用户来标记目标某个部分为目标,或背景的某个部分为背景。
用户也可以通过画一条简单的线,告知分水岭算法把这些点组合起来。
分水岭算法就会通过“拥有”边沿定义的山谷来分割图像。
分水岭算法定位精确且分割细致,对微弱的物体边缘响应比较敏感,能确保得到目标区域封闭连续边缘。
但物体表面一些细微的灰度变化以及图像中的噪声干扰等因素皆会导致对图像过度分割的产生,从而产生过多无用的边缘信息。
本文在对分水岭算法进行了深入的研究的基础上针对其过分割的问题提出改进:使用区域合并方法限制允许出现的区域的数目,这样不仅可以有效地抑制过分割问题,还能较好地分割出图像中的目标区域,以达到提取图像有效边缘信息的目的。
2原理2.1分水岭传统方法分水岭分割方法是基于拓扑理论的形态学分割方法,它的基本概念是将图像看成地形学上被水覆盖的自然地貌,图像中的每一点像素的灰度值表示这一点海拔的高度,其中每一个局部极小值和它所影响的区域称为集水盆,集水盆的边界形成了分水岭[1];其思想和形成可以通过模拟“溢流”的过程来说明:首先,20··在各个极小区域的底部打一个小孔,让水从孔中溢出,慢慢浸没极小区域周围的区域,这样各个极小区域所波及的范围就是相应的集水盆,各个不同区域的水相连时的边界,就是想要获取的分水岭[2]。
分水岭的经典算法是L.Vincent提出的模拟沉浸算法,其计算过程是一个迭代标注过程。
在这个算法中两个步骤,分别是排序过程和淹没过程[3];首先对各个像素的灰度级进行低到高排序,然后在从低到高实施浸没的过程中,对各个局部极小值在h阶-高度的影响域采用FIFO(先进先出)结构来进行判断和标注[4]。
设hmin和hmax是灰度图像I的最低灰度和最高灰度,Th(I)表示灰度值小于等于阈值h的所有像素,即Th(I)={p|I(p)≤h}。
M1,M2,…,MR为图像中的局部最小点,即低洼。
C(Mi)表示与低洼Mi相对应的集水盆地。
Ch(Mi)表示C(Mi)的一个子集,它由该集水盆地中灰度值小于等于h的所有像素组成,即Ch(Mi)=C(Mi)∩Th(I)。
minh(I)表示灰度值等于h的所有局部最小值。
令C[h]表示所有集水盆地中灰度值小于等于阈值h的像素集合,即:C[h]=Rt=1胰C h(M i).那么,C[hmax]就是所有集水盆地的并集。
显然,C[h-1]是Th(I)的一个子集。
假设已经得到阈值h-1下的C[h-1],现在需要从C[h-1]获得C[h]。
若Y为包含于Th(I)的一个连通成分,则Y与C[h-1]的交集有以下三种可能:(1)Y∩C[h-1]为空;(2)Y∩C[h-1]不为空且包含C[h-1]中的一个连通分量;(3)Y∩C[h-1]不为空且包含C[h-1]中的多个连通分量。
于是,C[h]就包含对C[h-1]中的各集水盆地在水平h下扩展得到的区域以及水平h下新出现的低洼。
模拟沉浸法将C[hmin]初始化为Thmin(I),从最小灰度hmin开始,逐灰度级由C[h-1]构造出C[h],直到hmax,此时,得到的C[hmax]就是所需标记的集水盆地。
其他不属于任何一个集水盆地的点就是分水线点,通过在图像中求C[hmax]的补集可以得到[5]。
2.2改进方法利用上述传统方法经常会因为噪声的干扰和梯度的局部不规则性影响而造成过度分割。
如对图1使用传统算法得到的实验结果如图2所示,图2中的过度分割产生了很多无关的边缘信息,过多的无关信息让结果没有意义。
图1原图像图2使用传统分水岭分割算法得到的结果利用区域合并的方法来限制出现的区域的数目可以有效解决该问题。
控制过度分割,我们将标记作为基础。
本文以Opencv中的函数cvWatershed(constMat&image,Mat&markers)为例进行说明。
markers即是输入矩阵也是输出矩阵,大小与image大小相同。
使用该函数时,在markers矩阵中粗略指定两种以上区域,该区域为1个点以上的连通点集,并用不同的正整数(1,2,3…)标记。
这些区域可以用cvFindContour(),和cvDrawContour()标记。
用户或算法可以通过画一条简单的线,有效地告知分水岭算法把这些点组合起来。
markers矩阵其他区域为0。
调用cvWatered()函数后,markers矩阵中所有为0的部分被重新标记为正整数,或为-1,-1代表筑起来的坝。
标记是图像的连通分量,分为内部标记和外部标记,内部标记与目标体相关,外部标记与背景相关。
图像中存在的许多隐含的极小值是导致图2过度分割的原因之一,因为这些区域都很小,所以这些值中有很多是没有意义的细节。
此时将图像用平滑滤波器过滤,将这些对图像产生影响的极小的无关细节降到最少,21··然后假定在这种情况下,把内部标记定义成:(1)区域中的点组成的一个连通分量;(2)这个连通分量中点的相同灰度值;(3)被海拔更高的点包围起来的区域,然后对经过平滑处理后的图像进行分水岭分割,并将这些得到的分水线定义成外部标记,将定义局部最小值为内部标记。
这时,沿着分水线的点就是相对理想的背景选择点,因为这些点都经过了相邻的标记间的最顶点。
外部标记有效地将图像分割成包含一个唯一内部标记和部分背景的单独区域,并对这些单独的区域依次使用分水岭分割算法,这个操作在求得平滑后图像的梯度之后进行。
使用这种方法得到的结果如图3所示,与图2相比较效果明显改善,原图像中的楼体、路灯、树枝、车辆都相对图2获得更多、更有意义的边缘提取结果。
图3使用改进分水岭分割算法得到的结果3结果分析本文利用区域合并改进了分水岭的传统算法,实现了既可以有效地抑制噪声,又达到了增强图像的目的,解决了两者之间平衡的矛盾,得到了相对较好的效果。
我们的实验样本图像从彩色风景图像、彩色建筑物图像、彩色人脸图像中选取,在这些图像中实施本文算法抑制过分割效果较为明显,但在医学图像等灰度图像中算法效果有待进一步改善。
[参考文献][1]徐奕奕,刘智琦,刘琦.基于改进的分水岭算法图像分割方法研究[J].计算机仿真,2011(9):272-274.[2]周小红,蔚立磊,王国权.基于分水岭算法的图像分割方法研究[J].计算机仿真,2009(5):255-258.[3]韩明.基于单目视觉的颗粒粒度现场检测技术研究[D].绵阳:西南科技大学,2011.[4]吴德.基于图像处理的胶囊检测系统的研究[D].广州:广东工业大学,2011.[5]GaryBradski,AdrianKaebler.学习OpenCV[M].于仕琪,刘瑞祯,译.北京:清华大学出版社,2009:328.The Research and Application of Watershed Segmentation Algorithm Based on MorphologyYANYang1,2,WANGYun-ji2(1.CollegeofComputerScienceandTechnology,ChangchunNormalUniversity,Changchun130032,China;2.CollegeofCommunicationEngineering,JilinUniversity,Changchun130022,China)Abstract:Inthispaper,wecarriedoutin-depthresearchonthewatershedalgorithmbasedonmorphology,andputforwardanimprovedmethodinviewoftheexistingproblemofoversegmentation.Themethodofregionmergingwasusedtolimitthenumberofallowableregions,andtheimprovedmethodcannotonlyinhibitoversegmentationphenomenon,butalsosegmenttheregionofinterestintheimage,inordertoachievethepurposeofextractingtheeffectiveedgeinformationofimage.ThemethodwasexperimentedunderOpenCV,andtheresultshowedthatthemethodcaneffectivelyeliminatelocalminimumvalueandnoise,soastoachievetheaccuratesegmentationresults.Key words:watershedalgorithm;oversegmentation;regionmerging;OpenCV22··。