opencv3计算机视觉+Python(四)

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

用GrabCut算法进行图像分割

在OpenCV中,实现了grabcut分割算法,该算法可以方便的分割出前景图像,操作简单,而且分割的效果很好。算法的原理参见papaer:“GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts

比如下面的一副图,我们只要选定一个四边形框,把框中的图像作为grabcut的一个输入参数,表示该框中的像素可能属于前景,但框外的部分一定属于背景。

GrabCut算法实现步骤为:

1.在图片中定义含有(一个或多个)物体的矩形

2.矩形外的区域被自动认为是背景

3.对于用户定义的矩形区域,可用背景中的数据来区别它里面的前景和背景区域

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

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

6.每一个像素(即算法中的节点)会与一个前景或背景节点连接

7.在节点完成连接后(可能与背景或前景连接),若节点之间的边属于不同终端(即一个节点属于前景,另一个节点属于背景),则会切断它们之间的边(这就是算法名中的切割部分),这就能将图像各部分分割出来。

import numpy as np
import cv2
from matplotlib import pyplot as plt

img=cv2.imread(‘1.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,160,400,670)#创建矩形
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)#使用了指定的空模型和掩模来运行GrabCut,并且实际上是用一个矩形来初始化这个操作
#做完这些后,我们的掩模已经变成包含0~3之间的值。值为0和2的将转为0,值为1,3的将转为1.然后保存在mask2中。这样就可以用mask2过滤出所有的0值像素(理论上会完整保留所有前景像素)
mask2=np.where((mask==0)|(mask==2),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("1.jpg"),cv2.COLOR_BGR2RGB))
plt.title("original"),plt.xticks([]),plt.yticks([])
plt.show()

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

把图像中的低密度的区域(变化很少)想象成山谷,图像中高密度的区域(变化很多)想象成山峰。开始向山谷中注入水直到不同的山谷中的水开始汇聚。为了阻止不同山谷的水汇聚,可以设置一些栅栏,最后得到的栅栏就是图像分割。

import numpy as np
import cv2
from matplotlib import pyplot as plt
img=cv2.imread("1.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#颜色转为灰度
ret,thresh=cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)#可为图像设一个阈值
kernel=np.ones((3,3),np.uint8)
opening=cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,iterations=2)#去除噪声
sure_bg=cv2.dilate(opening,kernel,iterations=3)

dist_transform=cv2.distanceTransform(opening,cv2.DIST_L2,5)#可以通过distanceTransform来获取确定的前景区域。也就是说,这是图像中最可能是前景的区域,越是远离背景区域的边界点越可能属于前景,这里用了阈值来决定那些区域是前景
ret,sure_fg=cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
#这个阶段之后,所得到的前景和背景中有重合的部分该怎么办?首先需要确定这些区域,这可从sure_bg与sure_fg的集合相减得到
sure_fg=np.uint8(sure_fg)
unknown=cv2.subtract(sure_bg,sure_fg)
#现在有了这些区域,就可以设定栅栏来阻止水汇聚,这是通过connectedComponents函数完成。
ret,markers=cv2.connectedComponents(sure_fg)

markers=markers+1
markers[unknown==255]=0
#把栅栏绘制成红色
markers=cv2.watershed(img,markers)
img[markers==-1]=[255,0,0]
plt.imshow(img)
plt.show()

原文地址:https://www.cnblogs.com/yifdu25/p/8445471.html

时间: 2024-10-18 22:28:01

opencv3计算机视觉+Python(四)的相关文章

《OpenCV3计算机视觉-python语言实现(第二版)》高清带标签PDF下载学习

1 写在前面 这本书比较福利,是基于Python版本的OpenCV学习教程,非常的不错,下面提供一个可以下载高清带标签PDF的链接 百度云盘下载链接:<OpenCV3计算机视觉 - Python语言实现(第二版)>高清带标签PDF 2 主要目的: 本书将从图像处理的基本操作出发,带你开启先进计算机视觉概念的探索之旅.计算机视觉是一个快速发展的学科,在现实生活中,它的应用增长得非常快,因此写作本书的目的是为了帮助计算机视觉领域的新手和想要了解全新的OpenCV 3.0.0的计算机视觉专家. 通过

OpenCV3计算机视觉+python(三)

使用OpenCV3处理图像 下面要介绍的内容都与图像处理有关,这时需要修改图像,比如要使用具有艺术性的滤镜.外插(extrapolate)某些部分.分割.粘贴或其他需要的操作. 不同色彩空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法.当前,在计算机视觉中有三种常用的色彩空间:灰度.BGR以及HSV(Hue,Saturation,Value) 1.灰度色彩空间是通过去除彩色信息来将其转换成灰阶,灰度色彩空间对中间处理特别有效,比如人脸检测. 2.BGR,即蓝-绿-红色彩空间,每

opencv3计算机视觉+Python(一)

基本I/O脚本 读/写图像文件 OpenCV的imread函数和imwrite函数能支持各种静态图像文件格式.不同系统支持的文件格式不一样,但都支持BMP格式,通常还应该支持PNG.JPEG和TIFF格式. 大多数常用的opencv函数都在cv2模块中.可能也会遇到其他基于cv或cv2.cv模块的opencv帮助,这些都是传统版本.Python模块被称为cv2并不表示该模块是针对OpenCv2.x.x版本的 imread()函数的参数: 1.IMREAD_ANYCOLOR=4 2.IMREAD_

OpenCV3计算机视觉+Python(五)

人脸检测和识别 本章将介绍Haar级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配.本章将考虑如何将多个Haar级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸),而其他的分类器可识别小的区域(眼睛.鼻子和嘴). Haar级联的概念 当谈到目标分类和位置跟踪时,希望精确定位什么?什么才是目标的可识别部分? 摄影作品(甚至是来自网络摄像头的图像)可能包含很多令人愉悦的细节.但是,由于灯光.视角.视距.摄像头抖动以及数字噪声的变化,图像细节变得不稳定.人们在

分享+《OpenCV3计算机视觉 Python语言实现(第二版)》+刘波

下载:https://pan.baidu.com/s/1x-OJl3lVsxbjYGrQ6Xf_RQ 更多资料分享:http://blog.51cto.com/14087171 更多资料下载:https://pan.baidu.com/s/1lMO23nnrIag8Glvy2Be0Iw 原文地址:http://blog.51cto.com/14087171/2328885

python 四种数值类型(int,long,float,complex)介绍

Python支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下. 数字数据类型存储数值.他们是不可改变的数据类型,这意味着改变数字数据类型的结果,在一个新分配的对象的值.Number对象被创建,当你给他们指派一个值.例如: var1 = 1 var2 = 10 您也可以删除数字对象的参考,使用del语句.del语句的语法是: del var1[,var2[,var3[..

『python』OpenCV3计算机视觉库安装

1.下载OpenCV: https://codeload.github.com/Itseez/opencv/zip/3.0.0 2.解压下载相关依赖: sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev pyt

『python』OpenCV3计算机视觉库第二弹_简单的图片处理

注意,本库基于python2.7,所以语法细节和之前有所不同 cv2和numpy深度契合,其图片读入后就是numpy.array,只不过dtype比较不常用而已,支持全部数组方法(废话... cv2.cvtColor(img,cv2.COLOR_BAYER_BG2BGR) img.item(0,0) img.itemset((0,0),0) cv2.imshow('my image',img) cv2.waitKey() cv2.destroyAllWindows() 1 # coding=ut

OpenCV/OpenCV3计算机视觉软件支持库和最新资源

1.OpenCV简介 OpenCV近几年随着视频设备的广泛使用,发展的非常之快.中国的大部分视频应用几乎都用了其中的代码.但是由于各种原因,OpenCV的资料却比较杂乱,本人基于学习和使用和一些经验体会,整理如下,供参考: OpenCV(http://opencv.org/)最初是Intel?开发的一个计算机视觉软件库,现在开源后已经成为使用广泛.发展快速的通用计算机视觉库,很多车牌识别.人脸认证等应用大部分都是基于OpenCV开发的. 2.OpenCV支持能力 OpenCV是实时的图像处理处理