OpenCV——分水岭算法

这篇具有很好参考价值的文章主要介绍了OpenCV——分水岭算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、分水岭算法

1、概述

  分水岭算法是一种图像分割常用的算法,可以有效地将图像中的目标从背景中分离出来。本文以OpenCV库中的分水岭算法为基础,介绍图像分割中的常用概念和算法原理,并结合实际案例展示分水岭算法的应用。

2、图像分割概念

  图像分割指的是将图像分成多个不同的区域或对象的过程。图像分割是计算机视觉和图像处理领域中的重要问题,包括物体检测、形状分析、三维重建、医学图像处理等众多应用。对于图像分割,有四种典型的方法:

  • 阈值分割:基于给定的阈值将图像分成两个区域。

  • 区域生长:从种子像素开始生长,合并与种子相邻的像素来形成区域。

  • 边缘检测:通过检测图像中的边缘,将图像分割成不同的对象。

  • 基于聚类的方法:利用聚类算法将图像分成多个区域。

3、分水岭算法原理

  分水岭算法是一种基于图论的图像分割算法,它将图像看成一个拓扑图,把亮度值看成高度,水从高处向低处流动,在高处建立分界线,将图像分割成多个区域。分水岭算法包含以下四个步骤:

  1. 载入图像并转化为灰度图像。

  2. 对灰度图像进行形态学变换,以抑制图像中的噪声和平滑图像。

  3. 计算距离变换,找到不同区域之间的分界线,将其看成浸没的水平面。

  4. 利用分界线将图像分成多个区域。

二、主要函数

  cv::watershed 函数实现了基于距离变换的分水岭算法。该函数的原型如下:

void watershed(InputArray image, 
               InputOutputArray markers
               );
  • image:输入的图像,必须为8位的3通道彩色图像。
  • markers:输出的标记图像,必须为单通道32位整型图像。

在使用cv::watershed函数进行分水岭算法分割时,需要先进行前期处理,包括图像的预处理和创建标记图像。

三、C++代码

#include <opencv2\opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	Mat img, imgGray, imgMask;
	Mat maskWaterShed;  // watershed()函数的参数
	img = imread("HoughLines.jpg");  //原图像
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	cvtColor(img, imgGray, COLOR_BGR2GRAY);
	//提取边缘并进行闭运算
	Canny(imgGray, imgMask, 150, 300);
	Mat k = getStructuringElement(0, Size(3, 3));
	morphologyEx(imgMask, imgMask, MORPH_CLOSE, k);
	imshow("边缘图像", imgMask);
	imshow("原图像", img);

	//计算连通域数目
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(imgMask, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
	//在maskWaterShed上绘制轮廓,用于输入分水岭算法
	maskWaterShed = Mat::zeros(imgMask.size(), CV_32S);
	for (int index = 0; index < contours.size(); index++)
	{
		drawContours(maskWaterShed, contours, index, Scalar::all(index + 1),
			-1, 8, hierarchy, INT_MAX);
	}
	//分水岭算法   需要对原图像进行处理
	watershed(img, maskWaterShed);

	vector<Vec3b> colors;  // 随机生成几种颜色
	for (int i = 0; i < contours.size(); i++)
	{
		int b = theRNG().uniform(0, 255);
		int g = theRNG().uniform(0, 255);
		int r = theRNG().uniform(0, 255);
		colors.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r));
	}

	Mat resultImg = Mat(img.size(), CV_8UC3);  //显示图像
	for (int i = 0; i < imgMask.rows; i++)
	{
		for (int j = 0; j < imgMask.cols; j++)
		{
			// 绘制每个区域的颜色
			int index = maskWaterShed.at<int>(i, j);
			if (index == -1)  // 区域间的值被置为-1(边界)
			{
				resultImg.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
			}
			else if (index <= 0 || index > contours.size())  // 没有标记清楚的区域被置为0 
			{
				resultImg.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
			}
			else  // 其他每个区域的值保持不变:1,2,…,contours.size()
			{
				resultImg.at<Vec3b>(i, j) = colors[index - 1];  // 把些区域绘制成不同颜色
			}
		}
	}

	resultImg = resultImg * 0.6 + img * 0.4;
	imshow("分水岭结果", resultImg);
	waitKey(0);
	return 0;
}

四、结果展示

1、原始图像

OpenCV——分水岭算法,OpenCV 图像/点云处理,算法,opencv,计算机视觉,3d,c++

2、分割结果

OpenCV——分水岭算法,OpenCV 图像/点云处理,算法,opencv,计算机视觉,3d,c++

五、参考链接

[1] 【OpenCv】图像分割——分水岭算法文章来源地址https://www.toymoban.com/news/detail-526897.html

到了这里,关于OpenCV——分水岭算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV——分水岭算法

      分水岭算法是一种图像分割常用的算法,可以有效地将图像中的目标从背景中分离出来。本文以OpenCV库中的分水岭算法为基础,介绍图像分割中的常用概念和算法原理,并结合实际案例展示分水岭算法的应用。   图像分割指的是将图像分成多个不同的区域或对象的过程

    2024年02月12日
    浏览(37)
  • [图像处理]14.分割算法比较 OTSU算法+自适应阈值算法+分水岭

    参考文献: OTSU阈值分割+孔洞填充+海陆分离_SwordKii的博客-CSDN博客 drawContours函数_普通网友的博客-CSDN博客_drawcontours R329-opencv阈值分割算法——自适应阈值_Third Impact的博客-CSDN博客_opencv自适应阈值分割 分水岭算法的python实现及解析_进不去的博客-CSDN博客_python分水岭算法 分水

    2024年02月09日
    浏览(50)
  • OPENCV实战分水岭法一

    2024年02月09日
    浏览(40)
  • 图像分割 - 分水岭算法

    目录 1. 介绍 2.  分水岭算法的实现 距离变换 连接连通分量 3. 代码 图像是由x,y表示的,如果将灰度值也考虑进去的话,那么一幅图像需要一个三维的空间去表

    2024年02月02日
    浏览(31)
  • (数字图像处理MATLAB+Python)第十章图像分割-第四,五节:分水岭分割和综合案例

    分水岭分割 :图像处理中常用的一种分割方法,它基于图像中灰度或颜色的变化来划分不同的区域。分水岭分割算法的原理是基于地理学上的分水岭概念。将图像看作一个 地貌图 ,在图像中低洼的部分被看作水池,而高处则表示山脉。通过在图像中加入水并让其逐渐充满,

    2024年02月10日
    浏览(48)
  • 【实战篇:粘连物体分割——利用分水岭算法实现糖豆分割检测】

    通过pycharm安装时空门 问题: 讲一下分水岭算法的原理、实现步骤、以及应用。 回答: 分水岭算法是一种基于图像变换与分割的图像分析算法,主要用于图像分割。该算法可以解决很多图像处理领域的问题,例如医学图像分析、面部识别、数字水印等。下面将详细介绍分水岭

    2024年02月03日
    浏览(36)
  • 比特币上市首日:重要分水岭!

    作者:秦晋 如果按美国东部时间计算,今天是比特币现货ETF上市交易的第一天。也是具有历史纪念意义的一天。昨天,美国证券交易委员会正式批准11只比特币现货ETF进入证券交易所展开交易。这是加密金融与传统金融之间的一个重要「分水岭」时刻。 比特币现货ETF在开市交

    2024年01月16日
    浏览(40)
  • [SDR] GNU Radio 系列教程(十四) —— GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解

    目录 1、前言 2、ZMQ 块的类型 3、ZMQ 块的使用 4、DEMO 4.1 同一台电脑上的两个流程图 4.2 不同电脑上的两个流程图 4.3 作为 REQ/REP 服务器的 Python 程序 4.4 作为 PUSH/PULL 服务器的 Python 程序 4.5 处理流程图数据的 Python 程序 参考链接 学会使用 GNU Radio 中的 ZMQ,是从低阶使用者向高阶

    2023年04月26日
    浏览(32)
  • 自学SLAM(6)相机与图像实践:OpenCV处理图像与图像拼接(点云)

    如果写过SLAM14讲第一次的作业,或者看过我之前的运行ORB_SLAM2教程应该都安装过OpenCV了,如果没有安装,没关系,可以看我之前的博客,里面有如何安装OpenCV。 链接: 运行ORB-SLAM2(含OpenCV的安装) 让我们先来看一段代码,学习一下OpenCV的函数调用。 改代码中,演示了如下几

    2024年02月06日
    浏览(39)
  • 数字图像处理 基于OpenCV的景深融合算法

            景深 合成是对显微镜头连续变焦时采集的非平面物体的图像序列进行分析,提取序列里每一帧图像中聚焦相对清晰的区域,然后对这些区域按其位置进行聚焦清晰度竞争、图像 融合 ,形成一幅新的各区域都清晰的全 景深 的图像。         这里算法的前提是图像

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包