OpenCV 第四章 深度估计与分割

4.2 捕获深度摄像头的帧

深度图:它是灰度图像,该图像的每个像素值都是摄像头到物体表面之间距离的估计值。比如,CAP_OPENNI_DEPTH_MAP通道的图像给出了基于浮点数的距离,该距离以毫米为单位。
点云图:它是彩色图像,该图像的每种颜色都对应一个 (x、y或z)维度空间。比如,CAP_ OPENNI POINT_ CLOUD_ _MAP通道会得到BGR图像,从摄像头的角度来看,B对应x (蓝色是右边),G对应y (绿色是向上),R对应z (红色对应深度),这个值的单位是米。
视差图:它是灰度图像,该图像的每个像素值代表物体表面的立体视差。立体视差是指:假如将从不同视角观察同一场景得到的两张图像叠放在一起, 这很可能让人感觉是两张不同的图像,在这个场景中,针对两张图像中两个孪生的物体之间任意对相互对应的两个像素点,可以度量这些像素之间的距离。这个度量就是立体视
差。近距离的物体会产生较大的立体视差,而远距离的就小一 些。因此近距离的物体在视差图中会更明亮一些。
有效深度掩模:它是表明一个给定的像素的深度信息是否有效(一个非零值表示有效,零值表示无效)。比如,如果深度摄像头依赖于红外照明器(红外闪光灯),在灯光被遮挡的区域(阴影)的深度信息就为无效。

4.6 使用分水岭和GrabCut算法进行物体分割
GrabCut算法实现步骤:
1.定义矩形:在图片中定义含有物体的矩形(一个或者多个)。
2.定义背景:矩形外的被自动认为是背景。
3.区别前景和背景
4.建模,标记未定义像素:用高斯混合模型对背景和前景建模,并将未定义的像素标记为可能的前景或背景。
5.相邻边:每一个像素都被看作通过虚拟边和周围像素相连接,每条边都有一个属于前景或背景的概率,概率基于它与周围像素颜色上的相似性。
6.连接像素:每一个像素会与一个前景或背景节点相连接。
7.节点连接后,若节点之间的边属于不同终端,则会切断他们之间的边,这就能将图像各部分分割出来。
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode=None)
img: 输入图像
mask:掩码图像,用来确定哪些区域是背景、前景,哪些可能是前景/背景,可以置为 cv2.GC_BGD,cv2.GC_FGD,cv2.GC_PR_BGD,cv2.GC_PR_FGD 或者直接填入 0,1,2,3
rect:包括前景的矩形,格式为(x,y,w,h)
bdgModel, fgdModel:算法内使用的数组,只需要创建两个大小为(1,65),数据类型为 np.float64 的数组
iterCount:算法的迭代次数
mode 可以置为 cv2.GC_INIT_WITH_RECT或cv2.GC_INIT_WITH_MASK,也可以联合使用,是用来确定我们修改的方式使用矩形形式还是掩码形式

分水岭算法:
把图像中低密度(变化少)的区域想象成山谷,高密度的区域想象成山峰。开始向山谷中注入水,直到不同山谷中的水开始汇聚。为了阻止不同山谷的水汇聚,可以设置一些栅栏,最后得到的栅栏就是图像分割。
OpenCV中morphologyEx(src, op, kernel)函数是一种形态学变化函数
src传入的图片
op进行变化的方式
kernel表示方框的大小

开运算(open):先腐蚀后膨胀的过程。开运算可以用来消除小黑点,在纤细点处分离物体、平滑较大物体的边界的 同时并不明显改变其面积。op = cv2.MORPH_OPEN 进行开运算
闭运算(close):先膨胀后腐蚀的过程。闭运算可以用来排除小黑洞。op = cv2.MORPH_CLOSE 进行闭运算
cv2.dilate( src, kernel, iteration)是OpenCV中形态学操作的膨胀函数,一般用于处理二值化图像。
参数说明: src表示输入的图片, kernel表示方框的大小, iteration表示迭代的次数
膨胀的作用是连通边界(白色部分的边界),可以连接不在一起的物体。 膨胀操作原理:存在一个kernel,在图像上进行从左到右,从上到下的平移,如果方框中存在白色,那么这个方框内所有的颜色都是白色
距离变换的定义是计算一个图像中非零像素点到最近的零像素点的距离,也就是到零像素点的最短距离
距离变换的处理图像通常都是二值图像,而二值图像其实就是把图像分为两部分,即背景和物体两部分,物体通常又称为前景目标!通常我们把前景目标的灰度值设为255,即白色,背景的灰度值设为0,即黑色。所以定义中的非零像素点即为前景目标,零像素点即为背景。所以图像中前景目标中的像素点距离背景越远,那么距离就越大,如果我们用这个距离值替换像素值,那么新生成的图像中这个点越亮。

cv2.subtract()相减

连接组件标记算法(connected component labeling algorithm)是图像分析中最常用的算法之一,算法的实质是扫描二值图像的每个像素点,对于像素值相同的而且相互连通分为相同的组(group),最终得到图像中所有的像素连通组件。
retval, labels =cv2.connectedComponents(image, connectivity, ltype)
image, // 输入二值图像,黑色背景
connectivity = 8, // 连通域,默认是8连通
ltype = CV_32, // 输出的labels类型,默认是CV_32S 输出
retval, //num_labels - labels, // 输出的标记图像,背景index=0

分水岭算法:
cv2.watershed(img, markers)
img- 输入8位3通道图像。
markers- 输入/输出标记的 32位单通道图像(图)。它应该具有相同的大小 image

分水岭算法实现图像自动分割的步骤:
1.图像灰度化、Canny边缘检测
2.查找轮廓,并且把轮廓信息按照不同的编号绘制到watershed的第二个参数markers上,相当于标记注水点。
3.watershed分水岭算法
4.绘制分割出来的区域,然后使用随机颜色填充,再跟源图像融合,以得到更好的显示效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值