OpenCV图像分割(2)分水岭算法图像分割函数watershed()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

使用分水岭算法执行基于标记的图像分割。

该函数实现了分水岭算法的一种变体,即无参数基于标记的分割算法,在文献 [186] 中有描述。

在将图像传递给函数之前,你需要在图像的标记中大致勾勒出所期望的区域,并使用正数(>0)索引。因此,每一个区域表现为一个或多个连接组件,其像素值为1、2、3等。这样的标记可以从二值掩模中通过 findContours 和 drawContours 获取(参见watershed.cpp演示)。标记是未来图像区域的“种子”。标记中的所有其他像素,即那些与轮廓区域的关系未知且应由算法定义的像素,应设置为0。在函数的输出中,标记中的每一个像素都被设置为“种子”组件的值,或者在区域之间的边界处设置为-1。
OpenCV 中的 watershed() 函数是一种用于图像分割的技术,它基于分水岭算法来分割图像中的不同区域。分水岭算法通常用于分割那些彼此紧密相连的对象,特别是当对象之间没有清晰的边界时。
注意
任何两个相邻的连通组件不一定被分水岭边界(-1的像素)分隔;例如,它们可以在传递给函数的初始标记图像中相互接触

函数原型


void cv::watershed	
(InputArray 	image,InputOutputArray 	markers 
)	

参数

  • 参数mage 输入的8位3通道图像。
  • 参数markers 输入/输出的32位单通道图像(标记地图)。它应该与image具有相同的尺寸。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 读取图像cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/fruit_small.jpg" );if ( img.empty() ){std::cout << "Could not open or find the image!" << std::endl;return -1;}// 转换为灰度图像cv::Mat gray;cvtColor( img, gray, cv::COLOR_BGR2GRAY );// 二值化处理cv::Mat thresh;threshold( gray, thresh, 0, 255, cv::THRESH_BINARY_INV + cv::THRESH_OTSU );// 噪声去除cv::Mat kernel = cv::getStructuringElement( cv::MORPH_ELLIPSE, cv::Size( 3, 3 ) );morphologyEx( thresh, thresh, cv::MORPH_OPEN, kernel, cv::Point( -1, -1 ), 2 );// 距离变换cv::Mat dist;distanceTransform( thresh, dist, cv::DIST_L2, 3 );normalize( dist, dist, 0, 1.0, cv::NORM_MINMAX );// 标记生成cv::Mat markers = cv::Mat::zeros( dist.size(), CV_32S );cv::Mat dist8u;dist.convertTo( dist8u, CV_8U );std::vector< std::vector< cv::Point > > contours;std::vector< cv::Vec4i > hierarchy;findContours( dist8u, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE );// 标记轮廓for ( size_t i = 0; i < contours.size(); i++ ){cv::drawContours( markers, contours, static_cast< int >( i ), static_cast< int >( i + 1 ), -1 );}// 设置背景区域cv::Mat marker32 = markers.clone();cv::Mat markerAc = cv::Mat::zeros( markers.size(), CV_8U );for ( int i = 0; i < img.rows; i++ ){for ( int j = 0; j < img.cols; j++ ){if ( marker32.at< int >( i, j ) == -1 ){markerAc.at< uchar >( i, j ) = 255;}}}cv::morphologyEx( markerAc, markerAc, cv::MORPH_CLOSE, kernel );// 应用分水岭算法cv::watershed( img, markers );// 处理结果std::vector< cv::Vec3b > colors( 256 );for ( int i = 0; i < colors.size(); i++ ){colors[ i ][ 0 ] = static_cast< unsigned char >( ( i * 127 / 255 ) % 255 );colors[ i ][ 1 ] = static_cast< unsigned char >( ( i * 251 / 255 ) % 255 );colors[ i ][ 2 ] = static_cast< unsigned char >( ( i * 237 / 255 ) % 255 );}cv::Mat dst = cv::Mat::zeros( markers.size(), CV_8UC3 );for ( int i = 0; i < markers.rows; i++ ){for ( int j = 0; j < markers.cols; j++ ){int index = markers.at< int >( i, j );if ( index == -1 )dst.at< cv::Vec3b >( i, j ) = cv::Vec3b( 0, 0, 255 );  // 分水岭区域elsedst.at< cv::Vec3b >( i, j ) = colors[ index ];}}// 显示结果cv::imshow( "Original Image", img );cv::imshow( "Threshold Image", thresh );cv::imshow( "Markers Before Watershed", markerAc );cv::imshow( "Segmented Image", dst );cv::waitKey( 0 );return 0;}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150107.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

matlab中在一个图上持续画多条曲线的方法

在数据分析的过程中&#xff0c;会遇到一种情况&#xff0c;就是想对多组数据进行分析&#xff0c;这时就想把他们放在同一张图里&#xff0c;来看他们表现出来的特征。如下图所示&#xff1a; 例如&#xff0c;我这里有几组数据&#xff0c;想对他们的整体趋势进行分析。 1、…

乐观锁处理秒杀超卖问题及悲观锁解决一人一单

Service Transactional//事务控制 public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderService {ResourceSeckillVoucherServiceImpl seckillVoucherService;ResourceRedisIdWorker redisIdWorker;Re…

Navicat连接数据库

一、MySQL地卸载&#xff1a; 二、Navicat连接数据库&#xff1a; 安装navicat的安装&#xff1a; 错误解决方法&#xff1a; 实验过程&#xff1a; 在本地sql数据库可以访问&#xff0c;说明数据库开启 用navicat连接&#xff1a;出现问题&#xff1a; 将mysql用户登录的加密…

图论系列(dfs)9.25

一、主题空间 场地由若干主题空间与走廊组成&#xff0c;场地的地图记作由一维字符串型数组 grid&#xff0c;字符串中仅包含 "0"&#xff5e;"5" 这 6 个字符。地图上每一个字符代表面积为 1 的区域&#xff0c;其中 "0" 表示走廊&#xff0…

计算机毕设选题推荐-基于python的电子健康信息分析系统【源码+文档+调试】

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、电子健康信息…

H7-TOOL脱机烧录增加国产3PEAK混合信号单片机TPS32和富芮坤FR8008,FR8003和FR2012支持

支持单路&#xff0c;1拖4和1拖16脱机烧录 3PEAKS思瑞浦混合信号单片机TPS32M支持 1、在线烧录&#xff0c;脱机烧录均正常。 2、注意事项&#xff1a;推荐使用整片擦除。 在线烧录&#xff1a; 脱机烧录&#xff1a; 接线效果&#xff1a; 富芮坤FR8008x支持&#xff0c;支…

校园自助打印系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;店长管理&#xff0c;打印店管理&#xff0c;打印服务管理&#xff0c;服务类型管理&#xff0c;预约打印管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&…

java基础课程-spring security基础课程

1. spring security介绍&#xff1a; 1.1 spring security定义&#xff1a; 2. Spring Security使用 2.1 用户身份认证&#xff1a; 2.1.1 写在配置文件中&#xff1a; 2.1.2 不用配置文件&#xff1a;&#xff0c;service实现UserDetailService这个类的的loadUserByUserNam…

CNVD漏洞和证书挖掘经验总结

前言 本篇文章主要是分享一下本人挖掘CVND漏洞碰到的一些问题&#xff0c;根据过往成功归档的漏洞和未归档的漏洞总结出的经验&#xff0c;也确实给审核的大佬们添了很多麻烦&#xff08;主要真的没人教一下&#xff0c;闷着头尝试犯了好很多错误&#xff0c;希望各位以后交一个…

JavaScript类型转换和相等性详解

类型转换 10"objects" //10objects,数字10转换为字符串 "7"*"4" //28&#xff0c;两个字符串均转为数字,只要不是加&#xff0c;其他都按两个数字算 var n 1-"x"// NaN&#xff0c;字符串x无法转化为数字 n"objects"//…

微服务--Docker

Docker是一个开源的应用容器引擎&#xff0c;它基于Go语言并遵从Apache2.0协议开源。Docker提供了一种轻量级、可移植和自包含的容器化环境&#xff0c;使开发人员能够在不同的计算机上以一致的方式构建、打包和分发应用程序。 一、Docker的基本概念 容器&#xff08;Contain…

TON生态系统开发指南:从零开始构建你的Web3应用

随着Web3的不断发展&#xff0c;TON&#xff08;The Open Network&#xff09;生态系统逐渐成为备受瞩目的区块链平台。依托其与Telegram的深度整合&#xff0c;TON生态为开发者提供了一个极具潜力的开发环境&#xff0c;特别是在社交、支付和金融这三个核心领域。本文旨在帮助…

企业源代码也需要加密?2024十款源代码加密软件排行榜

在当今数字化时代&#xff0c;源代码作为企业的核心资产&#xff0c;其重要性不言而喻。源代码不仅是企业技术创新的体现&#xff0c;更是商业机密和竞争优势的基石。然而&#xff0c;随着网络攻击和数据泄露事件的频发&#xff0c;源代码的安全性面临着前所未有的挑战。企业源…

零基础转行学网络安全怎么样?能找到什么样的工作?

网络安全对于现代社会来说变得越来越重要&#xff0c;但是很多人对于网络安全的知识却知之甚少。那么&#xff0c;零基础小白可以学网络安全吗&#xff1f;答案是肯定的。 零基础转行学习网络安全是完全可行的&#xff0c;但需要明确的是&#xff0c;网络安全是一个既广泛又深入…

centos7 更新 yum源 为 阿里云 LTS

centos7 更新 yum源 为 阿里云 按照下面的 步骤 1,2&#xff0c;3,4 来一遍 参考文档 CentOS yum源设置为国内aliyun yum源 https://developer.aliyun.com/article/1523301?spm5176.26934562.main.2.16c938e4ys9prQ CentOS 镜像 https://developer.aliyun.com/mirror/cent…

【每天学点AI】五个阶段带你了解人工智能大模型发展史!

20世纪50年代 NLP的早期研究主要基于规则的方法&#xff0c;依赖于语言学专家手工编写的规则和词典。这些规则通常是关于语法、语义和句法结构的人工规则。 例如一个简单的陈述句通常遵循“主语 谓语 宾语”的结构&#xff0c;每一个陈述句都以这种规则做标记。 那时候的NLP…

SpringCloud之服务网关zuul初级篇

SpringCloud之服务网关zuul初级篇 前面的文章我们介绍了&#xff0c;Eureka用于服务的注册于发现&#xff0c;Feign支持服务的调用以及均衡负载&#xff0c;Hystrix处理服务的 熔断防止故障扩散&#xff0c;Spring Cloud Config服务集群配置中心&#xff0c;似乎一个微服务框…

从 Tesla 的 TTPoE 看资源和算法

特斯拉的 ttpoe 出来有一段时间了&#xff0c;不出所料网上一如既往的一堆 pr 文&#xff0c;大多转译自 演讲 ppt 和 Replacing TCP for Low Latency Applications&#xff0c;看了不下 20 篇中文介绍&#xff0c;基本都是上面这篇文章里的内容&#xff0c;车轱辘话颠来倒去。…

大数据毕业设计选题推荐-超市进货推荐系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

CSS 实现元素根据自身位置进行偏移

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>.item {…