如何在OpenCV Python中找到图像轮廓的边界矩形?

如何在OpenCV Python中找到图像轮廓的边界矩形?

在图像处理中,常常需要找到图像中的特定物体或区域,并从中提取出我们需要的信息。OpenCV是一个功能强大的图像处理库,它可以帮助我们在Python中实现这个过程。本文将介绍如何使用OpenCV Python找到图像轮廓的边界矩形,以及如何对边界矩形进行操作。

什么是边界矩形

边界矩形是在图形学中常用的一种方式,用来包围和描述物体的位置和大小。它可以是旋转的,也可以是垂直的,具体形状取决于所包括的物体形状。

边界矩形通常用来计算物体的面积和周长,或者在图像识别过程中,用来定位和追踪物体的位置。

如何找到边界矩形

在OpenCV中,我们可以使用findContours函数来查找图像中的轮廓。findContours函数将返回一个轮廓的列表和一个层次结构,我们可以使用这些信息来找到我们感兴趣的轮廓。

在找到轮廓之后,我们可以使用boundingRect函数来获取轮廓的边界矩形。

下面是一个例子:

import cv2

# 读取图像
img = cv2.imread('example.png')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 找到图像轮廓
contours, hierarchy = cv2.findContours(gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

# 获取第一个轮廓的边界矩形
x, y, w, h = cv2.boundingRect(contours[0])

# 在原始图像中绘制出边界矩形
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 显示结果
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码说明:

  1. 首先使用imread函数从文件中读取图像。
  2. 然后将图像转换为灰度图像,这是因为findContours函数需要接收一幅灰度图像作为输入。
  3. 调用findContours函数来获取图像的轮廓。
  4. 使用boundingRect函数来获取第一个轮廓的边界矩形。
  5. 使用rectangle函数在原始图像中绘制出边界矩形。
  6. 最后使用imshow函数显示结果。

边界矩形的参数

boundingRect函数返回一个包含四个值的元组,分别是xywh

xy表示矩形左上角的坐标,wh表示矩形的宽度和高度。因此,要获取矩形的右下角坐标,我们可以使用如下代码:

x2 = x + w
y2 = y + h

绘制旋转的边界矩形

如果图像中的物体不是垂直或水平的,我们可能需要绘制旋转的边界矩形,以更精确地描述物体的位置。

在OpenCV中,我们可以使用minAreaRect函数来获取物体的旋转边界矩形。

下面是一个例子:

import cv2

# 读取图像
img = cv2.imread('example.png')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 找到图像轮廓
contours, hierarchy = cv2.findContours(gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

# 获取第一个轮廓的旋转边界矩形
rect = cv2.minAreaRect(contours[0])
box = cv2.boxPoints(rect)
box = np.int0(box)

# 在原始图像中绘制旋转边界矩形
cv2.drawContours(img, [box], 0, (0, 255, 0), 2)

# 显示结果
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码说明:

  1. 首先使用imread函数从文件中读取图像。
  2. 然后将图像转换为灰度图像,这是因为findContours函数需要接收一幅灰度图像作为输入。
  3. 调用findContours函数来获取图像的轮廓。
  4. 使用minAreaRect函数来获取第一个轮廓的旋转边界矩形。
  5. 使用boxPoints函数将矩形的四个顶点转换为坐标。
  6. 使用drawContours函数在原始图像中绘制旋转边界矩形。
  7. 最后使用imshow函数显示结果。

对边界矩形进行操作

有了边界矩形,我们就可以对图像中的物体进行各种各样的操作,例如截取和调整大小等。下面是一些操作的示例代码:

截取边界矩形内的图像

# 读取图像
img = cv2.imread('example.png')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 找到图像轮廓
contours, hierarchy = cv2.findContours(gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

# 获取第一个轮廓的边界矩形
x, y, w, h = cv2.boundingRect(contours[0])

# 截取边界矩形内的图像
roi = img[y:y+h, x:x+w]

# 显示结果
cv2.imshow('image', roi)
cv2.waitKey(0)
cv2.destroyAllWindows()

调整边界矩形大小

# 读取图像
img = cv2.imread('example.png')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 找到图像轮廓
contours, hierarchy = cv2.findContours(gray, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

# 获取第一个轮廓的边界矩形
x, y, w, h = cv2.boundingRect(contours[0])

# 将边界矩形大小扩大2倍
w *= 2
h *= 2

# 调整边界矩形大小
img = cv2.resize(img, (w, h))

# 显示结果
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结论

使用OpenCV Python可以非常轻松地找到图像轮廓的边界矩形,并对其进行各种各样的操作,例如截取和调整大小等。在实际应用中,我们可以根据需要对边界矩形进行处理,以达到我们需要的效果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Python OpenCV