Python实现图片查找轮廓、多边形拟合、最小外接

1. 概述

在计算机视觉中,图像的轮廓识别是一个非常基础而重要的问题。一般情况下,我们需要先进行图像的二值化操作,然后查找图像的轮廓,并对轮廓进行多边形拟合,最后找到最小的外包矩形来描述图像的形状。在本文中,我们将通过Python实现图片的查找轮廓、多边形拟合、最小外接的过程。

2. 图像处理基础

在进行图像处理之前,我们需要先了解一些基础的图像处理概念。

2.1 二值化

二值化是将图像像素的灰度值变为0或255的过程,使得图像只有黑白两种颜色。在图像处理中,经常使用二值化操作来处理图片,因为它可以减少图片中的噪声和细节,只保留重要的信息。

常见的二值化方法有全局阈值二值化、Otsu二值化、自适应阈值二值化等。

2.2 边缘检测

边缘检测是找出图像中物体的边缘的过程。常见的边缘检测算法有Sobel算子、Canny算子、Laplacian算子等。

2.3 轮廓识别

在进行边缘检测之后,我们可以根据边缘的信息来识别图像中的轮廓。轮廓是指物体外形的连续性边界,是一系列像素点的集合。

2.4 多边形拟合

在识别出图像的轮廓之后,我们可以使用多边形拟合算法来将轮廓点拟合成平滑的多边形。常见的多边形拟合算法有Douglas-Peucker算法、Ramer-Douglas-Peucker算法等。

2.5 最小外接矩形

最小外接矩形是指将一组点集包含在矩形内部,并且这个矩形的面积最小。在计算机视觉中,最小外接矩形通常被用来描述物体的形状。

3. Python实现

在Python中,我们可以使用OpenCV库来实现图像的处理和分析。OpenCV是一个开源的计算机视觉库,它提供了一系列用于图像处理的函数和算法。

3.1 安装OpenCV

在Python中安装OpenCV非常简单,只需使用pip命令即可。

pip install opencv-python

3.2 图像二值化

在使用OpenCV进行图像二值化时,可以使用cv2.threshold()函数。该函数的第一个参数是要二值化的原图像,第二个参数是用来对像素值进行分类的阈值,第三个参数是指定像素值小于阈值时要赋予的值,第四个参数是指定像素值大于阈值时要赋予的值。

下面是使用cv2.threshold()函数实现图像二值化的代码:

import cv2

# 读取原图像

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

# 灰度化处理

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

# 二值化处理

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 显示结果

cv2.imshow('Binary Image', binary)

cv2.waitKey(0)

cv2.destroyAllWindows()

上述代码中的cv2.THRESH_BINARY表示使用全局阈值方法进行二值化。

3.3 图像边缘检测

在进行图像边缘检测时,可以使用cv2.Canny()函数。该函数的第一个参数是要处理的原始图像,第二个参数和第三个参数分别是指定高低阈值。使用Canny算子进行边缘检测时,高于高阈值的像素被认为是边缘像素,低于低阈值的像素被认为是非边缘像素。介于两个阈值之间的像素,只有与高阈值相邻的像素才被认为是边缘像素,其余像素被认为是非边缘像素。

下面是使用cv2.Canny()函数实现图像边缘检测的代码:

import cv2

# 读取原图像

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

# 灰度化处理

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

# 边缘检测

edges = cv2.Canny(gray, 100, 200)

# 显示结果

cv2.imshow('Edges Image', edges)

cv2.waitKey(0)

cv2.destroyAllWindows()

3.4 图像轮廓识别

在使用OpenCV进行轮廓识别时,可以使用cv2.findContours()函数。该函数的第一个参数是输入图像,第二个参数是轮廓检索模式,第三个参数是轮廓近似方法。该函数的返回值包括三个值,第一个返回值是轮廓本身,第二个返回值是轮廓的层次结构,第三个返回值是轮廓的近似值。

下面是使用cv2.findContours()函数实现图像轮廓识别的代码:

import cv2

# 读取原图像

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

# 灰度化处理

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

# 边缘检测

edges = cv2.Canny(gray, 100, 200)

# 轮廓识别

contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓

img_contours = img.copy()

cv2.drawContours(img_contours, contours, -1, (0, 255, 0), 2)

# 显示结果

cv2.imshow('Contours Image', img_contours)

cv2.waitKey(0)

cv2.destroyAllWindows()

3.5 多边形拟合

在使用OpenCV进行多边形拟合时,可以使用cv2.approxPolyDP()函数。该函数的第一个参数是轮廓点集,第二个参数是拟合精度,第三个参数是指定是否闭合多边形。

下面是使用cv2.approxPolyDP()函数实现多边形拟合的代码:

import cv2

# 读取原图像

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

# 灰度化处理

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

# 边缘检测

edges = cv2.Canny(gray, 100, 200)

# 轮廓识别

contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 多边形拟合

for contour in contours:

epsilon = 0.02 * cv2.arcLength(contour,True)

approx = cv2.approxPolyDP(contour,epsilon,True)

cv2.drawContours(img, [approx], 0, (0, 0, 255), 2)

# 显示结果

cv2.imshow('Approx Poly Image', img)

cv2.waitKey(0)

cv2.destroyAllWindows()

3.6 最小外接矩形

在使用OpenCV确定最小外接矩形时,可以使用cv2.minAreaRect()函数。该函数的输入参数是轮廓点集,返回值是表示最小外接矩形的结构体,其中包括矩形中心坐标,矩形宽度和高度,以及矩形的旋转角度。

下面是使用cv2.minAreaRect()函数确定最小外接矩形的代码:

import cv2

# 读取原图像

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

# 灰度化处理

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

# 边缘检测

edges = cv2.Canny(gray, 100, 200)

# 轮廓识别

contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 绘制最小外接矩形

for contour in contours:

rect = cv2.minAreaRect(contour)

box = cv2.boxPoints(rect)

box = np.int0(box)

cv2.drawContours(img, [box], 0, (0, 0, 255), 2)

# 显示结果

cv2.imshow('Min Area Rect Image', img)

cv2.waitKey(0)

cv2.destroyAllWindows()

4. 总结

通过使用OpenCV库和Python编程语言,我们可以实现图像的处理和分析。本文以图片查找轮廓、多边形拟合、最小外接矩形为例,向读者介绍了基础的图像处理概念及相关实现。希望本文能对读者在图像处理方面有所启发。

后端开发标签