这篇文章给大家分享的是有关C++ OpenCV图像分割之如何实现分水岭分割的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
API介绍void watershed( InputArray image, InputOutputArray markers );参数说明:image: 必须是一个8bit 3通道彩色图像矩阵序列
markers: 在执行分水岭函数watershed之前,必须对第二个参数markers进行处理,它应该包含不同区域的轮廓,每个轮廓有一个自己唯一的编号,轮廓的定位可以通过Opencv中findContours方法实现,这个是执行分水岭之前的要求。算法会根据markers传入的轮廓作为种子(也就是所谓的注水点),对图像上其他的像素点根据分水岭算法规则进行判断,并对每个像素点的区域归属进行划定,直到处理完图像上所有像素点。而区域与区域之间的分界处的值被置为“-1”,以做区分。上面的API函数非常简单,但是参数里面第二个说了在需要进行轮廓的提取,所以说在做分水岭操作之前,我们要结合以前学过的知识对图像进行先一步的处理如 均值滤波—-变成灰度图—二值化—形态学操作—查找轮廓等代码演示我们再新建一个项目名为opencv–Matting,按照配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法.运行一下看我们的源图上面就是我们的源图,然后我们开始进行图像分割1.均值漂移算法
我们看一下结果,右图上变化不大,就是相当于做了一个简单的模糊2.把图像转为灰度图并进行二值化操作
再运行看一下效果3.图二值化图像进行距离变化并归一化显示出来运行效果
4.将变换后的重新二值化显示出来运行效果5.定义markers并划到新的Mat里面
6.对源图进行形态学操作,去掉干扰,让效果更好
7.将生成的markers进行分水岭转换8.生成随机颜色,并填充颜色,在新的图像中画出来后看一下分割的效果9.显示最后填充的图片并打印出一共多少个我们来看一下运行效果可以看到上面已经把所有的颜色都区分开了,我们再看一下输入的轮廓数,下面打印出来的就是14个,也和我们图片中是一样的。
感谢各位的阅读!关于“C++ OpenCV图像分割之如何实现分水岭分割”这篇文章就分享到 香港云主机这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
小编给大家分享一下CPU主频越高越好吗,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!cpu主频越高越好吗?cpu主频,即cpu内核工作的时钟频率(CPU Clock Speed)。通…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。