分水岭算法Word下载.docx
- 文档编号:22756585
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:21
- 大小:1.92MB
分水岭算法Word下载.docx
《分水岭算法Word下载.docx》由会员分享,可在线阅读,更多相关《分水岭算法Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
InputArray
image,
InputOutputArray
markers
);
第一个参数image,必须是一个8bit3通道彩色图像矩阵序列,第一个参数没什么要说的。
关键是第二个参数markers,Opencv官方文档的说明如下:
Beforepassingtheimagetothefunction,youhavetoroughlyoutlinethedesiredregionsintheimagemarkerswithpositive(>
0)indices.So,everyregionisrepresentedasoneormoreconnectedcomponentswiththepixelvalues1,2,3,andsoon.SuchmarkerscanberetrievedfromabinarymaskusingfindContours()anddrawContours().Themarkersare“seeds”ofthefutureimageregions.Alltheotherpixelsinmarkers,whoserelationtotheoutlinedregionsisnotknownandshouldbedefinedbythealgorithm,shouldbesetto0’s.Inthefunctionoutput,eachpixelinmarkersissettoavalueofthe“seed”componentsorto-1atboundariesbetweentheregions.
就不一句一句翻译了,大意说的是在执行分水岭函数watershed之前,必须对第二个参数markers进行处理,它应该包含不同区域的轮廓,每个轮廓有一个自己唯一的编号,轮廓的定位可以通过Opencv中findContours方法实现,这个是执行分水岭之前的要求。
接下来执行分水岭会发生什么呢?
算法会根据markers传入的轮廓作为种子(也就是所谓的注水点),对图像上其他的像素点根据分水岭算法规则进行判断,并对每个像素点的区域归属进行划定,直到处理完图像上所有像素点。
而区域与区域之间的分界处的值被置为“-1”,以做区分。
简单概括一下就是说第二个入参markers必须包含了种子点信息。
Opencv官方例程中使用鼠标划线标记,其实就是在定义种子,只不过需要手动操作,而使用findContours可以自动标记种子点。
而分水岭方法完成之后并不会直接生成分割后的图像,还需要进一步的显示处理,如此看来,只有两个参数的watershed其实并不简单。
下边通过图示来看一下watershed函数的第二个参数markers在算法执行前后发生了什么变化。
对于一个原图:
经过灰度化、滤波、Canny边缘检测、findContours轮廓查找、轮廓绘制等步骤后终于得到了符合Opencv要求的merkers,我们把merkers转换成8bit单通道灰度图看看它里边到底是什么内容:
这个是分水岭运算前的merkers:
这个是findContours检测到的轮廓:
看效果,基本上跟图像的轮廓是一样的,也是简单的勾勒出了物体的外形。
但如果仔细观察就能发现,图像上不同线条的灰度值是不同的,底部略暗,越往上灰度越高。
由于这幅图像边缘比较少,对比不是很明显,再来看一幅轮廓数量较多的图效果:
从这两幅图对比可以很明显看到,从图像底部往上,线条的灰度值是越来越高的,并且merkers图像底部部分线条的灰度值由于太低,已经观察不到了。
相互连接在一起的线条灰度值是一样的,这些线条和不同的灰度值又能说明什么呢?
答案是:
每一个线条代表了一个种子,线条的不同灰度值其实代表了对不同注水种子的编号,有多少不同灰度值的线条,就有多少个种子,图像最后分割后就有多少个区域。
再来看一下执行完分水岭方法之后merkers里边的内容发生了什么变化:
可以看到,执行完watershed之后,merkers里边被分割出来的区域已经非常明显了,空间上临近并且灰度值上相近的区域被划分为一个区域,灰度值是一样,不同区域间被划分开,这其实就是分水岭对图像的分割效果了。
总的概括一下watershed图像自动分割的实现步骤:
1.图像灰度化、滤波、Canny边缘检测
2.查找轮廓,并且把轮廓信息按照不同的编号绘制到watershed的第二个入参merkers上,相当于标记注水点。
3.watershed分水岭运算
4.绘制分割出来的区域,视觉控还可以使用随机颜色填充,或者跟原始图像融合以下,以得到更好的显示效果。
以下是Opencv分水岭算法watershed实现的完整过程:
1.#include
"
opencv2/imgproc/imgproc.hpp"
2.#include
opencv2/highgui/highgui.hpp"
3.
4.#include
<
iostream>
5.
6.using
namespace
cv;
7.using
std;
8.
9.Vec3b
RandomColor(int
value);
//生成随机颜色函数
10.
11.int
main(
int
argc,
char*
argv[]
)
12.{
13.
Mat
image=imread(argv[1]);
//载入RGB彩色图像
14.
imshow("
Source
Image"
image);
15.
16.
//灰度化,滤波,Canny边缘检测
17.
imageGray;
18.
cvtColor(image,imageGray,CV_RGB2GRAY);
//灰度转换
19.
GaussianBlur(imageGray,imageGray,Size(5,5),2);
//高斯滤波
20.
Gray
imageGray);
21.
Canny(imageGray,imageGray,80,150);
22.
Canny
23.
24.
//查找轮廓
25.
vector<
Point>
>
contours;
26.
Vec4i>
hierarchy;
27.
findContours(imageGray,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
28.
imageContours=Mat:
:
zeros(image.size(),CV_8UC1);
//轮廓
29.
marks(image.size(),CV_32S);
//Opencv分水岭第二个矩阵参数
30.
marks=Scalar:
all(0);
31.
index
=
0;
32.
compCount
33.
for(
;
hierarchy[index][0],
compCount++
34.
{
35.
//对marks进行标记,对不同区域的轮廓进行编号,相当于设置注水点,有多少轮廓,就有多少注水点
36.
drawContours(marks,
contours,
index,
Scalar:
all(compCount+1),
1,
8,
hierarchy);
37.
drawContours(imageContours,contours,index,Scalar(255),1,8,hierarchy);
38.
}
39.
40.
//我们来看一下传入的矩阵marks里是什么东西
41.
marksShows;
42.
convertScaleAbs(marks,marksShows);
43.
marksShow"
marksShows);
44.
轮廓"
imageContours);
45.
watershed(image,marks);
46.
47.
//我们再来看一下分水岭算法之后的矩阵marks里是什么东西
48.
afterWatershed;
49.
convertScaleAbs(marks,afterWatershed);
50.
After
Watershed"
afterWatershed);
51.
52.
//对每一个区域进行颜色填充
53.
PerspectiveImage=Mat:
zeros(image.size(),CV_8UC3);
54.
for(int
i=0;
i<
marks.rows;
i++)
55.
56.
j=0;
j<
marks.cols;
j++)
57.
58.
index=marks.at<
int>
(i,j);
59.
if(marks.at<
(i,j)==-1)
60.
61.
PerspectiveImage.at<
Vec3b>
(i,j)=Vec3b(255,255,255);
62.
63.
else
64.
65.
(i,j)
=RandomColor(index);
66.
67.
68.
69.
ColorFill"
PerspectiveImage);
70.
71.
//分割并填充颜色的结果跟原始图像融合
72.
wshed;
73.
addWeighted(image,0.4,PerspectiveImage,0.6,0,wshed);
74.
AddWeighted
wshed);
75.
76.
waitKey();
77.}
78.
79.Vec3b
value)
span
style="
line-height:
20.8px;
font-family:
sans-serif;
//生成随机颜色函数<
/span>
80.{
81.
value=value%255;
//生成0~255的随机数
82.
RNG
rng;
83.
aa=rng.uniform(0,value);
84.
bb=rng.uniform(0,value);
85.
cc=rng.uniform(0,value);
86.
return
Vec3b(aa,bb,cc);
87.}
第一幅图像分割效果:
按比例跟原始图像融合:
第二幅图像原始图:
分割效果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分水岭 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)