96SEO 2026-02-19 22:56 11
markers#xff0c;Opencv官方文档的说…Opencv

3通道彩色图像矩阵序列第一个参数没什么要说的。
关键是第二个参数
就不一句一句翻译了大意说的是在执行分水岭函数watershed之前必须对第二个参数markers进行处理它应该包含不同区域的轮廓每个轮廓有一个自己唯一的编号轮廓的定位可以通过Opencv中findContours方法实现这个是执行分水岭之前的要求。
接下来执行分水岭会发生什么呢算法会根据markers传入的轮廓作为种子也就是所谓的注水点对图像上其他的像素点根据分水岭算法规则进行判断并对每个像素点的区域归属进行划定直到处理完图像上所有像素点。
而区域与区域之间的分界处的值被置为“-1”以做区分。
简单概括一下就是说第二个入参markers必须包含了种子点信息。
Opencv官方例程中使用鼠标划线标记其实就是在定义种子只不过需要手动操作而使用findContours可以自动标记种子点。
而分水岭方法完成之后并不会直接生成分割后的图像还需要进一步的显示处理如此看来只有两个参数的watershed其实并不简单。
下边通过图示来看一下watershed函数的第二个参数markers在算法执行前后发生了什么变化。
对于一个原图
经过灰度化、滤波、Canny边缘检测、findContours轮廓查找、轮廓绘制等步骤后终于得到了符合Opencv要求的merkers我们把merkers转换成8bit单通道灰度图看看它里边到底是什么内容
看效果基本上跟图像的轮廓是一样的也是简单的勾勒出了物体的外形。
但如果仔细观察就能发现图像上不同线条的灰度值是不同的底部略暗越往上灰度越高。
由于这幅图像边缘比较少对比不是很明显.
从图像底部往上线条的灰度值是越来越高的并且merkers图像底部部分线条的灰度值由于太低已经观察不到了。
相互连接在一起的线条灰度值是一样的这些线条和不同的灰度值又能说明什么呢
答案是每一个线条代表了一个种子线条的不同灰度值其实代表了对不同注水种子的编号有多少不同灰度值的线条就有多少个种子图像最后分割后就有多少个区域。
再来看一下执行完分水岭方法之后merkers里边的内容发生了什么变化
可以看到执行完watershed之后merkers里边被分割出来的区域已经非常明显了空间上临近并且灰度值上相近的区域被划分为一个区域灰度值是一样不同区域间被划分开这其实就是分水岭对图像的分割效果了。
查找轮廓并且把轮廓信息按照不同的编号绘制到watershed的第二个入参merkers上相当于标记注水点。
绘制分割出来的区域视觉控还可以使用随机颜色填充或者跟原始图像融合以下以得到更好的显示效果。
opencv2/highgui/highgui.hpp#include
Image,image);//灰度化滤波Canny边缘检测Mat
imageGray;cvtColor(image,imageGray,CV_RGB2GRAY);//灰度转换GaussianBlur(imageGray,imageGray,Size(5,5),2);
Canny(imageGray,imageGray,80,150);
Image,imageGray);//查找轮廓vectorvectorPoint
findContours(imageGray,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
imageContoursMat::zeros(image.size(),CV_8UC1);
//Opencv分水岭第二个矩阵参数marksScalar::all(0);int
{//对marks进行标记对不同区域的轮廓进行编号相当于设置注水点有多少轮廓就有多少注水点drawContours(marks,
hierarchy);drawContours(imageContours,contours,index,Scalar(255),1,8,hierarchy);
marksShows;convertScaleAbs(marks,marksShows);imshow(marksShow,marksShows);imshow(轮廓,imageContours);watershed(image,marks);//我们再来看一下分水岭算法之后的矩阵marks里是什么东西Mat
afterWatershed;convertScaleAbs(marks,afterWatershed);imshow(After
Watershed,afterWatershed);//对每一个区域进行颜色填充Mat
PerspectiveImageMat::zeros(image.size(),CV_8UC3);for(int
indexmarks.atint(i,j);if(marks.atint(i,j)-1){PerspectiveImage.atVec3b(i,j)Vec3b(255,255,255);}
else{PerspectiveImage.atVec3b(i,j)
RandomColor(index);}}}imshow(After
ColorFill,PerspectiveImage);//分割并填充颜色的结果跟原始图像融合Mat
wshed;addWeighted(image,0.4,PerspectiveImage,0.6,0,wshed);imshow(AddWeighted
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback