openCV 3计算机视觉 Python语言实现 笔记 第4章 深度估计与分割

简介: openCV 3计算机视觉 Python语言实现 笔记 第4章 深度估计与分割

第4章 深度估计与分割

使用深度摄像头的数据来识别前景区域和背景区域。

4.1 创建模块

cameo中的捕获和处理摄像头的代码可以重用,所以讲这部分代码分离放在depth.py中。4.2 捕获深度摄像头的帧

深度相关通道的概念

深度图:灰度图像;每个像素值都是摄像头到物体表面之间距离的估计值。

点云图:彩色图像;每种颜色对应一个(x、y、z)维度空间。

视差图:灰度图像;每个像素值代表物体表面的立体视差。(立体视差:同一场景在不同视角下感觉不同。针对两个物体之间任一相互对应的两个像素点,可以度量这些像素点之间的距离,这个度量度量就是立体视差。离摄像头近的立体视差小,远的大。因此近距离的物体在视差图中会更明亮)。

有效深度掩模:表明一个给定的像素的深度信息是否有效(有效非0,无效为0)。比如,如果深度摄像头依赖红外闪光灯,那么灯光被遮挡处就无效。

4.3 从视差图得到掩模


4.4 对复制操作执行掩模


4.5 用普通摄像头进行深度估计

4.6 使用分水岭和GrabCut算法进行物体分割

GrabCut算法实现步骤:

1.定义矩形:在图片中定义含有物体的矩形。

2.定义背景:矩形外的被自动认为是背景。

3.区别前景和背景

4.建模,标记未定义像素:用高斯混合模型对背景和前景建模,并将未定义的像素标记为可能的前景或背景。

5.相邻边:每一个像素都被看作通过虚拟边和周围像素相连接,每条边都有一个属于前景或背景的概率,概率基于它与周围像素颜色上的相似性。

6.连接像素:每一个像素会与一个前景或背景节点相连接。

7.节点连接后,若节点之间的边属于不同终端,则会切断他们之间的边,这就能将图像各部分分割出来。


实例:

import numpy as np

import cv2

from matplotlib import  pyplot as plt

#加载图像

img = cv2.imread('statue_small.jpg')

#创建同形状的掩模

mask = np.zeros(img.shape[:2],np.uint8)

#创建以0填充的前景和背景模型

bgdModel = np.zeros((1,65),np.float64)

fgdModel = np.zeros((1,65),np.float64)

rect = (100,50,421,378)

cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,

           cv2.GC_INIT_WITH_RECT)

#将掩模值为0和2的转换成0,过滤掉0值像素

mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')

img = img*mask2[:,:,np.newaxis]

#显示图片

plt.subplot(121), plt.imshow(img)

plt.title('grabcut'), plt.xticks([]),plt.yticks([])

plt.subplot(122),plt.imshow(cv2.cvtColor(cv2.imread('statue_small.jpg'),

                                        cv2.COLOR_BGR2RGB))

plt.title('original'), plt.xticks([]),plt.yticks([])

plt.show()








4.6.2 使用分水岭算法进行图像分割

分水岭算法:

把图像中低密度(变化少)的区域想象成山谷,高密度的区域想象成山峰。

开始向山谷中注入水,直到不同山谷中的水开始汇聚。

为了阻止不同山谷的水汇聚,可以设置一些栅栏,最后得到的栅栏就是图像分割。


import numpy as np

import cv2

from matplotlib import  pyplot as plt

#加载图片,转换为灰度图片

img = cv2.imread("lion.jpg")

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#为图像设置一个阈值,这个操作将图像分为两部分:黑色部分和白色部分

ret, thresh = cv2.threshold(

   gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

#通过morphologyEx变换来去除噪声数据。这是一种对图像进行膨胀之后再进行腐蚀的操作,它可以提取图像特征

kernel = np.ones((3,3),np.uint8)

opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2)

#通过morphologyEx变换之后的图像进行膨胀,得到背景区域

sure_bg = cv2.dilate(opening,kernel,iterations=3)

#通过distanceTransform获取前景区域

dist_transfrom = cv2.distanceTransform(opening,cv2.DIST_L2,5)



ret,sure_fg  =  cv2.threshold(dist_transfrom,0.7*dist_transfrom.max(),255,0)

#找到前景和背景重合部分

sure_fg = np.uint8(sure_fg)

unkown = cv2.subtract(sure_bg,sure_fg)

#

ret,markers = cv2.connectedComponents(sure_fg)

#在背景区域加1,将unkown区域设置为0

markers = markers+1

markers[unkown==255] = 0

#让水漫起来将栅栏绘成红色

markers = cv2.watershed(img,markers)

img[markers==-1] = [255,0,0]

plt.imshow(img)

plt.show()


相关文章
|
2月前
|
人工智能 Ruby Python
python__init__方法笔记
本文总结了Python中`__init__`方法的使用要点,包括子类对父类构造方法的调用规则。当子类未重写`__init__`时,实例化会自动调用父类的构造方法;若重写,则需通过`super()`或直接调用父类名称来显式继承父类初始化逻辑。文中通过具体代码示例展示了不同场景下的行为及输出结果,帮助理解类属性与成员变量的关系,以及如何正确使用`super()`实现构造方法的继承。
103 9
|
3月前
|
数据采集 JSON API
Python 实战:用 API 接口批量抓取小红书笔记评论,解锁数据采集新姿势
小红书作为社交电商的重要平台,其笔记评论蕴含丰富市场洞察与用户反馈。本文介绍的小红书笔记评论API,可获取指定笔记的评论详情(如内容、点赞数等),支持分页与身份认证。开发者可通过HTTP请求提取数据,以JSON格式返回。附Python调用示例代码,帮助快速上手分析用户互动数据,优化品牌策略与用户体验。
|
9月前
|
机器学习/深度学习 监控 算法
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
222 3
|
3月前
|
数据采集 JSON API
Python 实战!利用 API 接口获取小红书笔记详情的完整攻略
小红书笔记详情API接口帮助商家和数据分析人员获取笔记的详细信息,如标题、内容、作者信息、点赞数等,支持市场趋势与用户反馈分析。接口通过HTTP GET/POST方式请求,需提供`note_id`和`access_token`参数,返回JSON格式数据。以下是Python示例代码,展示如何调用该接口获取数据。使用时请遵守平台规范与法律法规。
|
9月前
|
机器学习/深度学习 计算机视觉
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
269 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
|
9月前
|
搜索推荐 Python
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
88 3
|
9月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
165 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
9月前
|
Python
python知识点100篇系列(14)-分割大文件然后在合并
【10月更文挑战第2天】在工作中,因邮件附件大小限制或网络条件不佳,常需将大文件分割为小文件发送,接收后再合并。Python的文件读写功能可轻松实现此需求,也可借助第三方库filesplit简化操作。安装filesplit后,仅需几行代码即可完成文件的分割与合并,但掌握Python内置方法同样重要。
144 0
|
9月前
|
JSON 数据格式 计算机视觉
Opencv实用笔记(一): 获取并绘制JSON标注文件目标区域(可单独保存目标小图)
本文介绍了如何使用OpenCV和Python根据JSON标注文件获取并绘制目标区域,同时可将裁剪的图像单独保存。通过示例代码,展示了如何读取图片路径、解析JSON标注、绘制标注框并保存裁剪图像的过程。此外,还提供了相关的博客链接,供读者进一步学习。
227 0
|
9月前
|
算法 C++ Python
Leecode 101刷题笔记之第四章:和你一起你轻松刷题(Python)
这篇博客是关于LeetCode上使用Python语言解决二分查找问题的刷题笔记,涵盖了从基础到进阶难度的多个题目及其解法。
83 0

推荐镜像

更多