基于OpenCV的图像分割(分水岭算法和GrabCut)

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

目录

一、分水岭算法

二、GrabCut


一、分水岭算法

res = cv.watershed(image,markers)

参数: 

  • image: 输入图像,必须是8位的3通道彩色图像
  • marker: 标记图像,32位单通道图像,它包括种子点信息,使用轮廓信息作为种子点。在进行分水岭算法之前,必须设置好marker信息,它包含不同区域的轮廓,每个轮廓有唯一的编号,使用findCountours方法确定轮廓位置,不同区域的交界位置为-1

返回:

  • res: 图像分割之后的结果

自动分割的步骤:

  1. 对原图像进行灰度化处理,并进行边缘检测或二值化
  2. 查找轮廓,并且把轮廓信息按不同的编号绘制在标记图像上,即标记种子点,将其传给marker参数
  3. 进行分水岭算法检测
  4. 绘制分割出来的区域,使用随机颜色进行填充

代码:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 1.读入图片
img = cv.imread(r"D:\Desktop\00aa\1.png")
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 2.canny边缘检测
canny = cv.Canny(gray_img, 80, 150)

# 3.轮廓检测并设置标记图像
# 寻找图像轮廓 返回修改后的图像 图像的轮廓 以及它们的层次
contours, hierarchy = cv.findContours(canny, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
# 32位有符号整数类型,
marks = np.zeros(img.shape[:2], np.int32)
# findContours检测到的轮廓
imageContours = np.zeros(img.shape[:2], np.uint8)

# 轮廓颜色
compCount = 0
index = 0
# 绘制每一个轮廓
for index in range(len(contours)):
    # 对marks进行标记,对不同区域的轮廓使用不同的亮度绘制,相当于设置注水点,有多少个轮廓,就有多少个轮廓
    # 图像上不同线条的灰度值是不同的,底部略暗,越往上灰度越高
    marks = cv.drawContours(marks, contours, index, (index, index, index), 1, 8, hierarchy)
    # 绘制轮廓,亮度一样
    imageContours = cv.drawContours(imageContours, contours, index, (255, 255, 255), 1, 8, hierarchy)

# 4 使用分水岭算法,并给不同的区域随机填色
# cv.watershed(输入图像,标记图像)
marks = cv.watershed(img, marks)
# 实现图像增强等相关操作的快速运算  图像sobely转换回灰度
afterWatershed = cv.convertScaleAbs(marks)

# 生成随机颜色
colorTab = np.zeros((np.max(marks) + 1, 3))
# 生成0~255之间的随机数
for i in range(len(colorTab)):
    aa = np.random.uniform(0, 255)
    bb = np.random.uniform(0, 255)
    cc = np.random.uniform(0, 255)
    colorTab[i] = np.array([aa, bb, cc], np.uint8)

bgrImage = np.zeros(img.shape, np.uint8)

# 遍历marks每一个元素值,对每一个区域进行颜色填充
for i in range(marks.shape[0]):
    for j in range(marks.shape[1]):
        # index值一样的像素表示在一个区域
        index = marks[i][j]
        # 判断是不是区域与区域之间的分界,如果是边界(-1),则使用白色显示
        if index == -1:
            bgrImage[i][j] = np.array([255, 255, 255])
        else:
            bgrImage[i][j] = colorTab[index]
# 5 图像显示
plt.imshow(bgrImage[:, :, ::-1])
plt.title('result')
plt.xticks([]), plt.yticks([])
plt.show()

分割结果如下所示:

基于OpenCV的图像分割(分水岭算法和GrabCut),笔记,计算机视觉,图像处理,人工智能

二、GrabCut

GrabCut算法的优势是:

1、只需要在目标外面画一个框,把目标框住,它就可以完成良好的分割:

2、如果增加额外的用户交互(由用户指定一些像素属于目标),那么效果会更好

3、它的边界处理技术会使目标分割边界更加自然和柔和:

该算法也有不完美的地方,如果背景比较复杂或者背景和目标的相似度很大,那分割效果就不好,而且该算法的速度较慢。

在openCV中实现GrabCut算法,使用的API:

grabCut(img,mask,rect,bgdModel,fgdModel,iterCount,mode )

参数:

  • img:输入图像,必须是8位的3通道彩色图像
  • mask: 掩码图像,如果使用掩码进行初始化,那么mask保存初始化掩码信息;也可以将用户交互所设定的前景与背景保存到mask中,然后再传入grabCut函数;在处理结束之后,mask中会保存结果。mask只能取以下四种值:基于OpenCV的图像分割(分水岭算法和GrabCut),笔记,计算机视觉,图像处理,人工智能
  • rect:用于限定需要进行分割的图像范围,只有该矩形窗口内的图像部分才被处理
  • bgdModel:背景模型,如果为None,函数内部会自动创建一个bgdModel;bgdModel必须是单通道浮点型图像,且行数只能为1,列数只能为13x5
  • fgdModel:前景模型,如果为None,函数内部会自动创建一个fgdModel;fgdModel必须是单通道浮点型图像,且行数只能为1,列数只能为13x5
  • iterCount:迭代次数,必须大于0
  • mode:指明grabcut函数进行哪种操作,如下所示: ​​​​​​基于OpenCV的图像分割(分水岭算法和GrabCut),笔记,计算机视觉,图像处理,人工智能

代码演示:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 1. 读取图片
img = cv.imread(r"D:\Desktop\00aa\1.png")

# 2. 掩码图像
mask = np.zeros(img.shape[:2], np.uint8)

print(img.shape[:2])
# 3.矩形窗口(x,y,w,h);
rect = [0, 0, 389, 582] # 全图显示,但是要注意,利用img.shape[:2]获取图像大小后,维度都需要减1才能填入w,h。利用shape获取的维度是h,w

# 4.物体分割
cv.grabCut(img, mask, tuple(rect), None, None, 5, cv.GC_INIT_WITH_RECT)

# 5.抠取图像
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
img_show = img * mask2[:, :, np.newaxis]

# 将矩形框绘制在图像上
cv.rectangle(img, (0, 0), (389, 582), (0, 255, 0), 3)

# # 6.图像显示
plt.figure(figsize=(10, 8), dpi=100)
plt.subplot(121), plt.imshow(img[:, :, ::-1]), plt.title('矩形框选位置')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_show[:, :, ::-1]), plt.title('抠取结果')
plt.xticks([]), plt.yticks([])
plt.show()

基于OpenCV的图像分割(分水岭算法和GrabCut),笔记,计算机视觉,图像处理,人工智能

参考:图像分割文章来源地址https://www.toymoban.com/news/detail-818778.html

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

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

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

相关文章

  • [图像处理]14.分割算法比较 OTSU算法+自适应阈值算法+分水岭

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

    2024年02月09日
    浏览(50)
  • 使用opencv c++完成图像中水果分割(分水岭、形态学操作、通道处理)单独标记每个水果

    2023.4.16日更新 1. 利用一阶矩增加了草莓等水果的质心绘制。 2. 绘制出了生长方向。 原为本人机器人视觉作业。参考文章http://t.csdn.cn/eQ0qp(目测是上一届的学长) 要求:在网络上寻找水果重叠在一起的图片、经过一系列图像处理,完成每个水果的分割,并单独标记出来。 导

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

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

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

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

    2024年02月03日
    浏览(36)
  • OpenCV——分水岭算法

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

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

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

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

    2024年01月16日
    浏览(40)
  • 【opencv】示例-grabcut.cpp 使用OpenCV库的GrabCut算法进行图像分割

    left mouse button - set rectangle SHIFT+left mouse button - set GC_FGD pixels CTRL+left mouse button - set GC_BGD pixels 这段代码是一个 使用OpenCV库的GrabCut算法进行图像分割 的C++程序。它允许用户通过交互式方式选择图像中的一个区域,并利用GrabCut算法尝试将其分割出来。代码中包含用户操作指南、

    2024年04月13日
    浏览(42)
  • [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)
  • OpenCV - C++实战(06) — Grabcut图像分割

    目录 第6章  图像分割 6.1 Grabcut实现 6.1.1 定义前景和背景 6.1.2   cv::grabCut() 6.1.3 cv::compare() 6.1.4 算法实现 ​​​​​​​ Github代码地址:GitHub - Qinong/OpenCV         Opencv提供了一种常用的图像分割算法Grabcut。Grabcut算法比较复杂,计算量也很大,但有很高的精确度。 6

    2024年02月07日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包