【OpenCv 4 Python 3.7】分水岭算法

分水岭算法(Python+OpenCV) 分水岭算法算法思想 阅读详情

分水岭算法

在这里插入图片描述

使用分水岭算法进行图像分割
步骤:
  (一)获取灰度图像,二值化图像,进行形态学操作,消除噪点
  (二)在距离变换前加上一步操作:通过对上面形态学去噪点后的图像,进行膨胀操作,可以得到大部分都是背景的区域(原黑色不是我们需要的部分是背景)
  (三)使用距离变换distanceTransform获取确定的前景色
相关知识补充(重点)
  (四)在获取了背景区域和前景区域(其实前景区域是我们的种子,我们将从这里进行灌水,向四周涨水,但是这个需要在markers中表示)后,这两个区域中有未重合部分(注1)怎么办?首先确定这些区域(寻找种子)
   开始获取未知区域unknown(栅栏会创建在这一区域),为下一步获取种子做准备
   (五)获取了这些区域,我们可以获取种子,这是通过connectedComponents实现,获取masker标签,确定的前景区域会在其中显示为以1开始的数据,这就是我们的种子,会从这里开始漫水
  重点:
  (六)根据未知区域unknown在markers中设置栅栏,并将背景区域加入种子区域,一起漫水
  (七)根据种子开始漫水,让水漫起来找到最后的漫出点(栅栏边界),越过这个点后各个山谷中水开始合并。注意watershed会将找到的栅栏在markers中设置为-1
  
距离变换
distanceTransform :参数
src:输入的图像,一般为二值图像
distanceType:所用的求解距离的类型,有CV_DIST_L1, CV_DIST_L2 , or CV_DIST_C
mask_size:距离变换掩模的大小,可以是 3 或 5. 对 CV_DIST_L1 或 CV_DIST_C 的情况,参数值被强制设定为 3, 因为 3×3 mask 给出 5×5 mask 一样的结果,而且速度还更快。
在这里插入图片描述
距离变换的处理图像通常都是二值图像,而二值图像其实就是把图像分为两部分,即背景和物体两部分,物体通常又称为前景目标!
通常我们把前景目标的灰度值设为255,即白色
背景的灰度值设为0,即黑色。
所以定义中的非零像素点即为前景目标,零像素点即为背景。
所以图像中前景目标中的像素点距离背景越远,那么距离就越大,如果我们用这个距离值替换像素值,那么新生成的图像中这个点越亮。
在这里插入图片描述
在这里插入图片描述

代码实现:

import cv2 as cv
import numpy as np

#分水岭算法
def watershed_demo():
    # remove noise if any
    print(src.shape)
    #边缘保留滤波
    blurred = cv.pyrMeanShiftFiltering(src, 10, 100)
    # gray\binary image
    gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary-image", binary)

    # morphology operation:形态学操作
    # 结构元素
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
    #开操作    #iterations连续两次开操作
    mb = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel, iterations=2)
    #iterations=3 :3次膨胀,可以获取到大部分都是背景的区域
    sure_bg = cv.dilate(mb, kernel, iterations=3)
    cv.imshow("mor-opt", sure_bg)

    # distance transform :距离变换   cv.DIST_L1:棋盘格局里 DIST_L2:欧几里距离   3:掩模移动距离
    dist = cv.distanceTransform(mb, cv.DIST_L2, 3)#获取距离数据结果
    #normalize:归一化  因为distanceTransform返回的图像数据是浮点数值,要想在浮点数表示的颜色空间中,数值范围必须是0-1.0,所以要将其中的数值进行归一化处理
    #(重点)在整数表示的颜色空间中,数值范围是0-255,但在浮点数表示的颜色空间中,数值范围是0-1.0,所以要把0-255归一化。
    dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)
    cv.imshow("distance-t", dist_output*50)
    #再通过设定合理的阈值对距离变换后的图像进行二值化处理,则可得到图像的几何中心
    # 获取前景色
    ret, surface = cv.threshold(dist, dist.max()*0.6, 255, cv.THRESH_BINARY)
    ##保持色彩空间一致才能进行运算,现在是背景空间为整型空间,前景为浮点型空间,所以进行转换
    surface_fg = np.uint8(surface)
    cv.imshow("surface-bin", surface_fg)
    unknown = cv.subtract(sure_bg, surface_fg)
    #连通区域
    #ret是连通域处理的边缘条数,是上面提到的确定区域(出去背景外的其他确定区域:就是前景),就是种子数,我们会从种子开始向外涨水
    #markers是我们创建的一个标签(一个与原图像大小相同,数据类型为 in32 的数组),其中包含有我们原图像的确认区域的数据(前景区域)
    ret, markers = cv.connectedComponents(surface_fg)

    # watershed transform :分水岭变换
    """现在知道了那些是背景那些是硬币(确定的前景区域)了。
       那我们就可以创建标签(一个与原图像大小相同,数据类型为 in32 的数组),并标记其中的区域了。
       对我们已经确定分类的区域(无论是前景还是背景)使用不同的正整数标记,对我们不确定的区域(unknown区域)使用 0 标记。
        我们可以使用函数 cv2.connectedComponents()来做这件事。
        它会把对标签进行操作,将背景标记为 0,其他的对象使用从 1 开始的正整数标记(其实这就是我们的种子,水漫时会从这里漫出)。然后将这个标签返回给我们markers
        但是,我们知道如果背景标记为 0,那分水岭算法就会把它当成未知区域了。(我们要将未知区域标记为0,所以我们要将背景区域变为其他整数,例如+1)
        所以我们想使用不同的整数标记它们。
        而对不确定的区域(函数cv2.connectedComponents 输出的结果中使用 unknown 定义未知区域)标记为 0。"""
    markers = markers + 1
    markers[unknown==255] = 0
    markers = cv.watershed(src, markers=markers)
    src[markers==-1] = [0, 0, 255]
    cv.imshow("result", src)



print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("E:/ji_qi_xue_xi/opencv_kejian/opencv_python_image/coins.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
watershed_demo()
cv.waitKey(0)

cv.destroyAllWindows()

结果:

在这里插入图片描述

python+opencv-13 分水岭算法实现图像分割 python+opencv-13 分水岭算法实现图像分割图像分割分水岭算法确定一幅图像的前景图像 图像分割 图像分割是一种基本的图像处理技术,是指将图像分成不同特性的区域,并对目标进行提取的技术,它是由图像处理到图像分析的关键步骤。 目标提取和图像理解都是在图像分割的基础上进行的。 分水岭算法 分水岭算法会把临近像素间的相似性作为重要的参考因素,在空间位置上相近和灰度值相近的像素点互相连接起来构成一个封闭的区域。 可以把灰度图与地形图做对比。灰度值低的地方是山谷,灰度值高的地方是山峰。这样山峰包围了山谷,也 阅读详情

相关推荐

数字图像处理(二)分水岭算法+python

1、算法原理说明 传统分水岭算法: 任何灰阶图像都可以视为地形表面。图像中每一像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆地,而集水盆地的边界则形成分水岭。 我们用在局部最小值的地方,打一个小孔,然后把整个地形浸入到水中。那么当水没过高峰时,不同盆地的水,必然会产生融合。为了防止这种情况,我们在水没过高峰时,就在两盆地的边缘线处竖起一座大坝。然后继续此操作,知道最后填满水。所创建的大坝就会形成分水岭。 但是这种做法,由于图像中存在很多的噪声或局部不规则性,会产生很多小的集水

packdge_black的博客 3762

分水岭算法的python实现及解析

1 算法简介 分水岭算法的原理很容易查到,就是往山谷中注水,把不同湖水接触的位置称作分水岭,这么做的结果有两个: 1.得到整个区域的分界线 2.把整个区域编号 这是一种很容易过分割的算法,需要一些预处理手段和一些优化,本文只解析基本原理 (下图的注水过程是一种基于人为标记的方法) 2 代码步骤说明 分水岭算法的步骤如下: 1.将图像的所有像素按像素值从小到大排序,这里可以利用直方图将像素信息塞入数组 2.开始按灰度级从小到大顺序遍历所有像素,先将该灰度级的全部像素标记为待计算点,若点的邻域内有已存在的水池

sinat_29018995的博客 1万+

Python实现图像分割的分水岭算法及完整源码

具体来说,分水岭算法首先通过计算梯度图像得到图像的边缘信息,然后根据这些边缘信息构建出一个高度图像,将高度图像看做一个地形图,通过对地形图进行水流模拟,最终得到每个局部最低点的分割区域。虽然分水岭算法在图像分割中有着很好的效果,但是其也存在着一些缺陷,比如对于图像中存在的重叠和重复区域的分割效果并不理想。因此,在实际应用中,需要根据具体情况选择不同的算法来实现图像分割。图像分割是计算机视觉领域的一个重要课题,其在很多领域中都有着广泛的应用,其中分水岭算法是一个非常经典的图像分割方法。

BUG?不存在的! 944

Python+Opencv分水岭算法

目录一、分水岭算法(Watershed)简介二、分水岭算法实现步骤三、阈值和轮廓检测硬币分割代码实现与分析四、分水岭硬币分割代码实现五、代码效果展示与分析参考资料注意事项 一、分水岭算法(Watershed)简介   所有的灰度图像都可视为拓扑平面,我们将灰度值高的区域看成山峰,将灰度值低的区域看成山谷,我们向图像上所有的"山谷"中注入不同颜色的水,不断的注水,水位则会不断上升,注入的水将灌满山谷...

WZZ18191171661的博客 9029

OpenCV实战——基于分水岭算法的图像分割

分水岭变换是一种流行的图像处理算法,用于快速将图像分割成同质区域。分水岭变换主要基于以下思想:当图像被视为拓扑浮雕时,均质区域对应于相对平坦且由陡峭的边缘界定的盆地。算法的原始版本倾向于过度分割图像,从而产生多个小区域,因此 OpenCV 中实现了该算法的改进版本,通过使用一组预定义的标记来指导图像分割区域的定义。

盼小辉丶的博客 2万+

【学习OpenCV4】分水岭算法详解

本文分享内容来自图书《学习OpenCV 4:基于Python的算法实战》,该书内容如下: 第1章 OpenCV快速入门; 第2章 图像读写模块imgcodecs; 第3章 核心库模块core; 第4章 图像处理模块imgproc(一); 第5章 图像处理模块imgproc(二); 第6章 可视化模块highgui; 第7章 视频处理模块videoio; 第8章 视频分析模块video; 第9章 照片处理模块photo; 第10章 2D特征模块features2d; 第11章 相机标定与三维重建模块calib

lxiao428的博客 1704

分水岭算法-python-opencv

分水岭算法简单原理: 对于一个图像的灰度值,将图像放平,可以看成是类似与山谷与山顶的图像,灰度值小的就是山底。先找到若干个山底,同时加水,当加到一定程度时候,某些山顶会被淹没,此时在山顶修建大坝,避免两处水汇集在一起。此时这个大坝就是分水岭,即边缘。 原图像: 二值化: 利用OTSU方法首先进行二值化操作: 详情请看:图像阈值处理-OpenCV_独憩的博客-优快云博客 import cv2.cv2 import numpy as np import cv2 as cv from mat.

qq_54517101的博客 2264

OpenCV图像处理之——分水岭算法的图像分割

这篇博客将介绍如何使用分水岭算法进行基于标记的图像分割,OpenCV通过cv2.watershed()实现;

qq_40985985的博客 4458

python手撕分水岭算法

主要思路就是: 2 获取初始标记 如果如opencv官方例程那样,用距离变换来确认标记,非常容易过分割,所用我们可以通过手动进行标记。 可以使用opencv的鼠标事件实现标记。 3 主函数 首先获得标记 开运算 分水岭 要想分割的好,要避免不同区域的连通,相同区域的分裂。锐化和高斯模糊感觉用了效果不好。 4 实验结果 4.1 标记图像 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VAJ5vW9r-1670081090282)(markers.png)]对比opencv官

qtzbxjg的博客 1484

python opencv之分水岭算法示例

主要介绍了python opencv之分水岭算法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Vivado 2023.1及更早版本永久License全功能解锁:HLS、System Generator等IP核使用详解

本文深入解析Vivado 2023.1及更早版本的全功能许可证,详细指导如何解锁HLS、System Generator等高级IP核。通过许可证类型对比、功能验证方法和实战应用指南,帮助FPGA开发者充分利用Vivado工具套件,提升复杂系统设计和算法加速的效率。

weixin_31286719的博客 383

win10+Python3.7.3+OpenCV3.4.1入门学习(十七 图像分割与提取)————17.3 分水岭算法图像分割实例i

Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm 17.3 分水岭算法图像分割实例 本节结合前面介绍的知识,讲解一个图像分割实例。使用分水岭算法进行图像分割时,基本的步骤为: 1.通过形态学开运算对原始图像O去噪。 2.通过腐蚀操作获取“确定背景B”。需要注意,这里得到“原始图像-确定背景”即可。 3.利用距离变换函数cv2.distan...

qq_951274168的博客 439

一文详细讲解CRM系统(附架构图、流程、功能介绍)

专为中小企业量身打造高性价比的数字化转型路径!企业如何用CRM才能真正做到降本增效?今天,就用一文讲清这些问题!读完本文,你将清楚得了解CRM的概念、框架、流程、功能、企业成功案例,文末还有常见问题解答。

Dabeishandong的博客 9931

win10+Python3.7.3+OpenCV3.4.1入门学习(十七 图像分割与提取)————17.1 图像分割与提取—分水岭算法基本原理

Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm 第17章 图像分割与提取 在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来。例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆、行人或者其他对象。我们希望将这些对象从视频中提取出来,而忽略那些没有对象进入背景的...

qq_951274168的博客 733

基于Xilinx的I2S Receiver IP核和I2S Transmitter IP核音频验证

基于Xilinx的I2S Receiver IP核和I2S Transmitter IP核音频验证 文章目录前言一、工程构架二、Xilinx IP的配置1.I2S Transmitter IP配置:2.I2S Receiver IP配置:3.WM8960的配置:总结 前言 本实验基于Xilinx ZU4EV平台,也适用于ZYNQ平台。音频验证完成,记录调过程。 ①Xilinx 音频IP只支持主模式,左对齐或右对齐方式,16bit或24bit字长。 ②WM8960器件作为从模式;24bit字长;数据传输格

weixin_45637597的博客 6815

ArcGis布局视图中Excel表格无边框插入与图例符号边框定制技巧

本文详细解析了在ArcGis布局视图中实现Excel表格无边框插入与图例符号边框定制的专业技巧。通过源头净化Excel表格、精准粘贴以及分解图例并单独设置边框属性,有效解决了地图报告中常见的视觉粗糙问题,帮助用户提升专题图与报告的精致度与专业感。

weixin_29292535的博客 305

OpenCV-Python——第22章:分水岭算法实现图像分割

目录 0 原理 1 举例说 1)二值化 2)去除图像中的所有的白噪声 3)提取肯定是硬币的区域 4)获得边界区域 5)标记区域 6)实施分水岭算法 0 原理 在地理学中,分水岭是一个山脊,该山脊通过不同的水系来区分排水区域。集水盆地是把水排入河流或水库的地理区域。分水岭变换把这些概念应用到灰度图像处理中,从而解决许多图像分割问题。 理解分水岭变换要求我们把灰...

YukinoAI的博客 1万+

OpenSpec 完全指南 config.yaml文件

不管是项目内还是全局存放,自定义工作流都要遵守以下规则,否则会导致OpenSpec无法识别,新手一定要记牢:一个文件夹 = 一个工作流:工作流文件夹的名称,就是中schema字段要填写的名称;每个工作流文件夹必须包含:这是工作流的核心定义文件,没有它,OpenSpec无法识别这个工作流;模板文件统一放templates/目录:如果需要自定义生成文件的模板(比如统一的提案模板、任务模板),就放在工作流文件夹下的templates/里,OpenSpec会自动识别;

h a 6 6 6 c k 为 你解决复杂难题! 1425

Python opencv图像处理基础总结(七) 基于分水岭算法的图像分割

opencv图像处理基础总结,基于分水岭算法的图像分割,介绍了分水岭算法的原理、距离变换、opencv有关函数的用法,基于距离的分水岭分割的流程,python代码实现分水岭算法的图像分割

叶庭云 成为自己的光 5944

深度学习实战103-基于KDD Cup 99数据集的搭建神经网络的检测系统(NIDS),通过对网络流量数据进行分析,提供完整代码

接下来,我们定义一个全连接神经网络模型。return x# 创建数据集和数据加载器# 初始化模型通过以上步骤,我们实现了一个基于PyTorch的简单网络入侵检测系统。这个系统使用KDD Cup 99数据集进行训练和评估。实际应用中,您可以根据需求调整模型结构、超参数以及数据预处理方法。希望对大家有所帮助!如果有任何问题或需要进一步的解释,请随时咨询。

微学AI的博客 1582

【100分】【等和子数组最小和】

逆序排序,这样能够使得在分组时优先选取较大的元素,以便将元素分配到较小的子集中,从而使得每个子集的和相对均衡。给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。分成若干个组,使得每组的和相等,并求出满足条件的所有分组中,组内元素和的最小值。在递归的过程中,我们需要注意一个优化点,即避免将相同和的桶重复计算。4 个子集(5),(1,4),(2,3),(2,3)2 个子集(5, 1, 4),(2,3, 2,3)个子集,则返回子集和的最小值,如果不能,则将。

weixin_54707168的博客 1168

OpenCV for Python之分水岭算法

OpenCV for Python之分水岭算法1 分水岭算法2 相关api3 算法实现 Opencv4官方文档:https://docs.opencv.org/2.4.4-beta/ Opencv4 for Python中文文档点击下载:OpenCV4 for Python 中文文档 1 分水岭算法   任何灰度图像都可以看作是一个地形表面,其中高强度表示山峰,低强度表示山谷。你开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。随着水位的上升,根据附近的山峰(坡度),来自不同山谷的水明显会开始合并

郑德帅 930

innovus:set_clock_latency与insertion_delay

当1ns clock latency设置在capture上,在report_timing报告中体现在other end arrival time以及capture clock path的Arrival Time上。因为-1ns的insertion delay存在,所以skew group报告中显示的Arrival (ns)是减1ns的结果,即1.819-1=0.819 ns。CTS阶段create_ccopt_clock_tree_spec之后,spec中会产生对应的insertion_delay命令。

m0_61544122的博客 1624

Python OpenCV分水岭算法分割和提取重叠或有衔接的图像中的对象

本文将介绍如何使用分水岭算法对触摸和重叠的图像中的对象进行分割和提取。 参考:https://www.pyimagesearch.com/2015/11/02/watershed-opencv/ 分水岭算法是一种分割的经典算法,在提取图像中连接或重叠的图像中的对象(例如上图中的硬币)时特别有用。 使用传统的图像处理方法(例如阈值检测和轮廓检测),我们将无法从图像中提取每个硬币–但是,利用分水岭算法...

qq_40985985的博客 7045

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Opencv3+Python3入门(20)分水岭算法】

分水岭算法 基于距离变换的分水岭分割算法一般流程: 1,输入图像 2,变换为灰度图像 3,二值化图像 4,距离变换 5,寻找种子点 6,生成marker 7,分水岭变换 8,输出图像 #20,分水岭算法 import cv2 as cv import numpy as np def image_Watershed(image): print(image.shape)...

【秋名鱼酱的博客】 1429

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【OpenCV-Python】23.OpenCV的图像分割——分水岭算法、图像金字塔算法

23.OpenCV的图像分割——分水岭算法、图像金字塔算法 文章目录前言一、使用分水岭算法分割图像1、cv2.distanceTransform()函数2、cv2.connectedComponents()函数3、cv2.watershed()函数二、图像金字塔1、高斯金字塔向下采样2、高斯金字塔向上采样3、拉普拉斯金字塔4、应用图像金字塔实现图像的分割和融合三、OpenCV-Python资源下载总结 前言   主要介绍OpenCV中的分水岭算法、图像金字塔对图像进行分割的方法。 一、使用分水岭算法

每天都在学习的小博主 3456

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 【OpenCv 4 Python 3.7】图像形态学操作之顶帽、黑帽、形态学梯度
下一篇: 【OpenCv 4 Python 3.7】人脸检测 (Haar\LBP)
YL_python_C++_java
博客等级 码龄7年 1392粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值