《分水岭算法分析.docx》由会员分享,可在线阅读,更多相关《分水岭算法分析.docx(3页珍藏版)》请在优知文库上搜索。
1、算法流程解读:1.读取文件2 .BGR转灰度3 .获取图片大小4 .中值滤波,去除斑点噪声5 .OTSU二值化,图像化为黑白两色,THRESH_BINARY表示大于阈值为255(白色),反之为0(黑色)。生成的图像赋予变量th。6 .定义内核矩阵kernel,对th进行形态学开运算,先腐蚀后膨胀用来消除小型白色区域,赋予变量img(相反,MORPHL0SE对应闭运算,先膨胀后腐蚀,用于消除小型黑色区域)7 .定义背景,为img进行膨胀运算所得(注意膨胀与腐蚀均针对图像中高亮区域,即白色区域所进行的操作)8 .距离变换,输出dist_transform为每个点到最近的0像素点(黑色)的距离。9
2、.定义前景,对距离变换的输出dist_transform进行阈值化,阈值设置为CliStJtranSform最大值的0.7倍,大于该值的点将会被赋为255白色,否则为0黑色。由于8步骤处dist_transform表示每个点到0(黑色)的距离,即距离越远约大,故处理后,距离远的点为白色,距离近的点为黑色。10 .定义unknown为背景减前景。11 .通过COnneCtedCOmPOnentS函数获取前景中连通域信息,返回连通域个数numlabels,与连通域的标记图像labelsim,每个点表示当前为第几个连通域。12.获取unknown中白色区域位置,将labels_im对应位置赋予0(黑
3、色)13.定义IabeLhue、blank_ch,用于将图像不同连通域域颜色区分。14 .执行分水岭算法,输入原图imagejaw与连通域标记图像labels_im,算法会将区域与区域之间的部分(分水岭)置为T,结果赋予IabeIS15 .将原图的分水岭部分颜色置为255,0,0红色16 .输出处理结果图与连通域标记分析:从算法流程上讲,该算法意在对图像不同的区域进行分割与划分操作,最终输出各个区域的划分结果。由于采用的是灰度值的运算操作,故进能对图像不同亮度的区域进行划分。并且算法对于二值化时的阈值设置较为敏感,特别是图像色彩、明暗不均时,很难有合适的阈值使得算法能够较好的划分不同区域。结果
4、分析:原算法从逻辑上有些许bug,步骤13对不同区域颜色的区分似乎没有意义。步骤5中将明处标记为白,暗处标记为黑。虽然白色黑色是相对的,但前述步骤的很多操作都是针对白色区域(膨胀、颜色标记等),而却将白色定义为了bg背景,反而将黑色定义为了fg前景。此时UnknOWn参数的定义似乎找不到合适的解释,并且调用watershed函数的意义也不明确(对背景进行分割?虽然调整参数依旧能够得到结果,但还是感觉有些奇怪。可以看到在当前算法下,由于目标与图像边界,导致了背景被划分为不同区域,而算法将背景标记为了不同颜色。而不同的连通域却没有被正确标记(颜色都为红)。watershed算法在此处发挥的作用似乎也不能被理解,划分结果意义不明。运算结果:可以看到修正后的算法将标记的是不同连通域,而背景统一为红色。很难用语言描述,但算法综合测试下来,我认为应当是步骤5中的二值化方法选取问题,若将THRESHBINARY修改为THRESHBINARYlNV就没有上述逻辑问题了,即将背景标记为黑色而前景标记为白色,此时膨胀、相减操作便很好理解了,膨胀即扩张目标区域,相减后unknown即表示由于该区域为临界区域暂无法确定是前景/背景,后续颜色标记也表示为不同目标区域。算法逻辑自洽。 , Raw Image X运算结果:图像一些较小的黑色区域被滤波掉了,同时分水岭算法正确的将一些链接在一起的圈点进行了分割: