python3+opencv3识别图片中的物体并截取的方法


Posted in Python onDecember 05, 2018

如下所示:

运行环境:python3.6.4
   opencv3.4.0

# -*- coding:utf-8 -*-
 
"""
Note: 使用Python和OpenCV检测图像中的物体并将物体裁剪下来
"""
 
import cv2
import numpy as np
 
 
# step1:加载图片,转成灰度图
image = cv2.imread("353.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 
# step2:用Sobel算子计算x,y方向上的梯度,之后在x方向上减去y方向上的梯度,通过这个减法,我们留下具有高水平梯度和低垂直梯度的图像区域。
gradX = cv2.Sobel(gray, cv2.CV_32F, dx=1, dy=0, ksize=-1)
gradY = cv2.Sobel(gray, cv2.CV_32F, dx=0, dy=1, ksize=-1)
 
# subtract the y-gradient from the x-gradient
gradient = cv2.subtract(gradX, gradY)
gradient = cv2.convertScaleAbs(gradient)
# show image
cv2.imshow("first", gradient)
cv2.waitKey()
 
# step3:去除图像上的噪声。首先使用低通滤泼器平滑图像(9 x 9内核),这将有助于平滑图像中的高频噪声。
# 低通滤波器的目标是降低图像的变化率。如将每个像素替换为该像素周围像素的均值。这样就可以平滑并替代那些强度变化明显的区域。
# 然后,对模糊图像二值化。梯度图像中不大于90的任何像素都设置为0(黑色)。 否则,像素设置为255(白色)。
# blur and threshold the image
blurred = cv2.blur(gradient, (9, 9))
_, thresh = cv2.threshold(blurred, 90, 255, cv2.THRESH_BINARY)
# SHOW IMAGE
cv2.imshow("thresh", thresh)
cv2.waitKey()
 
# step4:在上图中我们看到蜜蜂身体区域有很多黑色的空余,我们要用白色填充这些空余,使得后面的程序更容易识别昆虫区域,
# 这需要做一些形态学方面的操作。
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# show image
cv2.imshow("closed1", closed)
cv2.waitKey()
 
# step5:从上图我们发现图像上还有一些小的白色斑点,这会干扰之后的昆虫轮廓的检测,要把它们去掉。分别执行4次形态学腐蚀与膨胀。
# perform a series of erosions and dilations
closed = cv2.erode(closed, None, iterations=4)
closed = cv2.dilate(closed, None, iterations=4)
# show image
cv2.imshow("closed2", closed)
cv2.waitKey()
 
# step6:找出昆虫区域的轮廓。
# cv2.findContours()函数
# 第一个参数是要检索的图片,必须是为二值图,即黑白的(不是灰度图),
# 所以读取的图像要先转成灰度的,再转成二值图,我们在第三步用cv2.threshold()函数已经得到了二值图。
# 第二个参数表示轮廓的检索模式,有四种:
# 1. cv2.RETR_EXTERNAL表示只检测外轮廓
# 2. cv2.RETR_LIST检测的轮廓不建立等级关系
# 3. cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
# 4. cv2.RETR_TREE建立一个等级树结构的轮廓。
# 第三个参数为轮廓的近似方法
# cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
# cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
 
# cv2.findContours()函数返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。
# cv2.findContours()函数返回第一个值是list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。
# 每一个ndarray里保存的是轮廓上的各个点的坐标。我们把list排序,点最多的那个轮廓就是我们要找的昆虫的轮廓。
x = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# import pdb
# pdb.set_trace()
_a, cnts, _b = x
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]
 
# OpenCV中通过cv2.drawContours在图像上绘制轮廓。
# 第一个参数是指明在哪幅图像上绘制轮廓
# 第二个参数是轮廓本身,在Python中是一个list
# 第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓
# 第四个参数是轮廓线条的颜色
# 第五个参数是轮廓线条的粗细
 
# cv2.minAreaRect()函数:
# 主要求得包含点集最小面积的矩形,这个矩形是可以有偏转角度的,可以与图像的边界不平行。
# compute the rotated bounding box of the largest contour
rect = cv2.minAreaRect(c)
# rect = cv2.minAreaRect(cnts[1])
box = np.int0(cv2.boxPoints(rect))
 
 
# draw a bounding box arounded the detected barcode and display the image
cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
cv2.imshow("Image", image)
cv2.imwrite("contoursImage2.jpg", image)
cv2.waitKey(0)
 
# step7:裁剪。box里保存的是绿色矩形区域四个顶点的坐标。我将按下图红色矩形所示裁剪昆虫图像。
# 找出四个顶点的x,y坐标的最大最小值。新图像的高=maxY-minY,宽=maxX-minX。
Xs = [i[0] for i in box]
Ys = [i[1] for i in box]
x1 = min(Xs)
x2 = max(Xs)
y1 = min(Ys)
y2 = max(Ys)
hight = y2 - y1
width = x2 - x1
cropImg = image[y1:y1+hight, x1:x1+width]
 
# show image
cv2.imshow("cropImg", cropImg)
cv2.imwrite("bee.jpg", cropImg)
cv2.waitKey()

以上这篇python3+opencv3识别图片中的物体并截取的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python通过yield实现数组全排列的方法
Mar 18 Python
python版本的读写锁操作方法
Apr 25 Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 Python
python 3.7.0 安装配置方法图文教程
Aug 27 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
django数据模型中null和blank的区别说明
Sep 02 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 Python
python 中的@运算符使用
May 26 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 Python
Django框架之路由用法
Jun 10 Python
解决Python3.5+OpenCV3.2读取图像的问题
Dec 05 #Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
Dec 05 #Python
对python opencv 添加文字 cv2.putText 的各参数介绍
Dec 05 #Python
Python寻找两个有序数组的中位数实例详解
Dec 05 #Python
解决Python下imread,imwrite不支持中文的问题
Dec 05 #Python
python批量下载网站马拉松照片的完整步骤
Dec 05 #Python
解决python3中cv2读取中文路径的问题
Dec 05 #Python
You might like
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
基于Jquery的开发个代阴影的对话框效果代码
2011/07/28 Javascript
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
2013/04/23 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/06/05 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
NumPy 如何生成多维数组的方法
2018/02/05 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
python3.6使用pymysql连接Mysql数据库
2018/05/25 Python
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
帕克纽约:PARKER NY
2018/12/09 全球购物
ORACLE十问
2015/04/20 面试题
物理教育专业毕业生推荐信
2013/11/03 职场文书
茶叶生产计划书
2014/01/10 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
python 如何用terminal输入参数
2021/05/25 Python
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python