OpenCV(图像处理)-基于Python-轮廓查找

简介: 1. 轮廓一个图像中具有相同颜色或强度(灰度图)的连续点所组成的集合,就是轮廓。轮廓可用于图形分析、物体的识别与检测等等。

1. 轮廓

一个图像中具有相同颜色或强度(灰度图)的连续点所组成的集合,就是轮廓。轮廓可用于图形分析、物体的识别与检测等等。

2.轮廓查找

在图像中,为了防止轮廓边缘强弱不明显,需要先对图像进行二值化或Canny操作(一般改为黑底白字),画轮廓时会修改输入的图像。


2.1 findContours()

查找图形的轮廓

contours, hierarchy = cv2.findContours(img, mode, ApproximationMode…)

contours:查找到所有轮廓的列表(点的集合)

hierarchy:层级,轮廓有无顺序


mode:(检测方式)


RETR_EXTERNAL = 0 :表示只检测外部轮廓(红色为轮廓)


ca27b11971ec488690b178e8cb3062f1.png

RETR_LIST = 1 :检测的轮廓不建立等级关系,从里到外、从右到左,一层一层的编号,返回的列表也是按这个顺序排列的


2f965a2519c84927b9227f49a2563ae8.png

RETR_CCOMP = 2 :每层最多两级,从里到外、从右到左,单个图形,每两级为一层


e91a55c523cc4f5daea0e79f3522d64f.png

RETR_TREE = 3 :按树形存储轮廓 ,从右到左,从外到里,一个图形一个图像的来,符合正常逻辑


4370506b6a164706a27b5fd8c68f5cb2.png

ApproximationMode:(逼近方式)

CHAIN_APPROX_NONE:保存所有轮廓上的点

CHAIN_APPROX_SIMPLE:只保存角点

2.2 drawContours()

根据获得到的坐标点(contours)绘制轮廓

cv2.drawContours(img, contours, contourIdx, color, thickness…)

img:需要画轮廓的图像

contours:轮廓的点集

contourldx:-1表示绘制所有轮廓 0~n

color:颜色(255,255,255)thinckness:线宽,-1是全部填充,1~n

import cv2
import numpy as np
img = cv2.imread('./image/contours1.png')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化,使轮廓更明显
ret, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 获得轮廓列表
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 画全部的轮廓
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
cv2.imshow('img', img)
# cv2.imshow('gray', gray)
cv2.imshow('binary', binary)
cv2.waitKey(0) 


4db2b0b035934683aff01944e129ae74.png

2.3 contourArea()和arcLength()

求轮廓的面积和周长

contour:点集(轮廓)

cv2.arcLength(curve, closed)

cv2.arcLength(curve, closed)

curve:点集(轮廓)

closed:True/False是否是封闭的轮廓

# 计算面积
area = cv2.contourArea(contours[0])
print('面积 = %d' % area)
# 计算周长
len = cv2.arcLength(contours[0], True)
print('周长 = %d' % len)

2.4 多边形逼近与凸包

多边形逼近就是按照画多边形的方式画出图形的轮廓,而凸包只需画出大概轮廓即可。左图为多边形逼近,右图为凸包。


910efe5b0cf84a26b22dd73a348b4bb2.png

approxPolyDP()

多边形逼近轮廓

approx = cv2.approxPolyDP(curve, epsilon, closed)

curve:点集(轮廓)

epsilon:精度(越小越逼近)

closed:是否是闭合的轮廓True/False

返回值approx是一个列表

import cv2
import numpy as np
def drawShape(src, points):
    i = 0
    while i<len(points):
        if i == len(points)-1:
            x1, y1 = points[i][0]
            x2, y2 = points[0][0]
            cv2.line(src, (x1, y1), (x2, y2), (0, 255, 0), 2)
        else:
            x1, y1 = points[i][0]
            x2, y2 = points[i+1][0]
            cv2.line(src, (x1, y1), (x2, y2), (0, 255, 0), 2)
        i = i+1
img = cv2.imread('./image/hand.png')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化,使轮廓更明显
ret, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
# 获得轮廓列表
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 多边形逼近法
e = 5
approx = cv2.approxPolyDP(contours[0], e, True)
drawShape(img, approx)
print(approx[0][0])
cv2.imshow('img_5', img)
# cv2.imshow('gray', gray)
cv2.imshow('binary', binary)
cv2.waitKey(0)

分别是精度为20,精度为5的逼近图像


1df135c74f8a4f43b486d7f11fc3f016.png

convexHull()

凸包

hull = cv2.convexHull(points, clockwise, …)

points:轮廓

clockwose:是否顺时针绘制True/False

返回值同样是一个列表

import cv2
import numpy as np
def drawShape(src, points):
    i = 0
    while i<len(points):
        if i == len(points)-1:
            x1, y1 = points[i][0]
            x2, y2 = points[0][0]
            cv2.line(src, (x1, y1), (x2, y2), (0, 255, 0), 2)
        else:
            x1, y1 = points[i][0]
            x2, y2 = points[i+1][0]
            cv2.line(src, (x1, y1), (x2, y2), (0, 255, 0), 2)
        i = i+1
img = cv2.imread('./image/hand.png')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化,使轮廓更明显
ret, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
# 获得轮廓列表
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 凸包
hull = cv2.convexHull(contours[0])
drawShape(img, hull)
cv2.imshow('img', img)
cv2.imshow('binary', binary)
cv2.waitKey(0)


0a7d18c4cb254d79bba17759c1b94a2a.png

2.5 外接矩形

分为最大外接矩形和最小外接矩形,如下图所示。


11b65d45dbe746c2ae2c59062988d8a7.png

minAreaRect()

最小外接矩形

RotatedRect = cv2.minAreaRect(points)

points:点集(轮廓)

返回值:矩形中心点坐标,宽高,旋转角度

boundingRect()

最大外接矩形

x, y, w, h = cv2.boundingRect(array)

array:点集(轮廓)

返回值是矩形的列表:(x,y是起始坐标,w是宽度,h是高度)

import cv2
import numpy as np
img = cv2.imread('./image/hello.jpeg')
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化,使轮廓更明显
ret, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
# 获得轮廓列表
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 获取最小外接矩阵,中心点坐标,宽高,旋转角度
r = cv2.minAreaRect(contours[1])
# 获取矩形四个顶点,浮点型
box = cv2.boxPoints(r)
# 取整
box = np.intp(box)
# 画轮廓
cv2.drawContours(img, [box], -1, (0, 255, 0), 2)
# 获取最大外接矩形
x, y, w, h = cv2.boundingRect(contours[1])
# 画矩形
cv2.rectangle(img, (x, y), (x+w, y+h),(255, 0, 0), 2)
cv2.imshow('img', img)
cv2.imshow('binary', binary)
cv2.waitKey(0)


bb66dc32925148bda067d73e5a65ca6e.png

目录
相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
109 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
11天前
|
计算机视觉 开发者 Python
利用Python进行简单的图像处理
【10月更文挑战第36天】本文将引导读者理解如何使用Python编程语言和其强大的库,如PIL和OpenCV,进行图像处理。我们将从基本的图像操作开始,然后逐步深入到更复杂的技术,如滤波器和边缘检测。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供新的视角和技能,让你能够更好地理解和操作图像数据。
|
1月前
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
103 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
1月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
71 2
|
2月前
|
机器学习/深度学习 计算机视觉 Python
opencv环境搭建-python
本文介绍了如何在Python环境中安装OpenCV库及其相关扩展库,包括numpy和matplotlib,并提供了基础的图像读取和显示代码示例,同时强调了使用Python虚拟环境的重要性和基本操作。
|
1月前
|
算法 数据可视化 计算机视觉
Python中医学图像处理常用的库
在Python中,医学图像处理常用的库包括:ITK(及其简化版SimpleITK)、3D Slicer、Pydicom、Nibabel、MedPy、OpenCV、Pillow和Scikit-Image。这些库分别擅长图像分割、配准、处理DICOM和NIfTI格式文件、图像增强及基础图像处理等任务。选择合适的库需根据具体需求和项目要求。
53 0
|
1月前
|
数据挖掘 计算机视觉 Python
基于Python的简单图像处理技术
【10月更文挑战第4天】在数字时代,图像处理已成为不可或缺的技能。本文通过Python语言,介绍了图像处理的基本方法,包括图像读取、显示、编辑和保存。我们将一起探索如何使用PIL库进行图像操作,并通过实际代码示例加深理解。无论你是编程新手还是图像处理爱好者,这篇文章都将为你打开一扇新窗,让你看到编程与创意结合的无限可能。
|
3月前
|
计算机视觉 开发者 Python
使用Python进行简单图像处理
【8月更文挑战第31天】 本文将介绍如何使用Python编程语言来处理图像。我们将通过代码示例来展示如何读取、显示、编辑和保存图像文件。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供一个清晰的指引,帮助你开始自己的图像处理项目。
|
3月前
|
机器学习/深度学习 人工智能 监控
利用Python和OpenCV实现实时人脸识别系统
【8月更文挑战第31天】本文将引导您了解如何使用Python结合OpenCV库构建一个简易的实时人脸识别系统。通过分步讲解和示例代码,我们将探索如何从摄像头捕获视频流、进行人脸检测以及识别特定个体。本教程旨在为初学者提供一条明晰的学习路径,帮助他们快速入门并实践人脸识别技术。
|
算法 搜索推荐 计算机视觉
下一篇
无影云桌面