如何使用OpenCV Python计算图像对象的范围?

如何使用OpenCV Python计算图像对象的范围?

OpenCV是一个广泛使用的计算机视觉和机器学习库,它广泛用于图像处理,视频分析,数字图像处理,计算机视觉等领域。本文将介绍如何使用OpenCV Python计算图像对象的范围。

准备工作

在开始计算图像对象的范围之前,我们需要做一些准备工作。 首先安装OpenCV的Python模块:

pip install opencv-python

然后,导入所需的库:

import cv2
import numpy as np

加载图像

我们需要加载要计算的图像。 首先,我们使用OpenCV读取图像:

img = cv2.imread('image.png')

这将加载名为image.png的图像并将其存储在变量img中。 可以使用imshow函数查看图像:

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这将显示图像并等待用户按下键盘键,然后关闭窗口。

灰度转换

计算图像对象的范围之前,我们需要将图像转换为灰度。 可以使用以下代码将BGR图像转换为灰度:

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

这会将图像从彩色空间转换为灰度空间。

cv2.imshow('grayscale', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

这将显示转换后的灰度图像并等待用户按下键盘键,然后关闭窗口。

二值化

在计算图像对象的范围之前,我们还需要对图像进行二值化。这将使我们能够将背景与前景分开,并提取图像对象。可以将图像通过以下方式二值化:

ret, thresh = cv2.threshold(gray, 127, 255, 0)

这个函数的第一个参数是灰度图像,第二个参数是阈值,第三个参数是最大值(如果像素值超过阈值),第四个参数是二值化类型。 这将返回一个二进制图像,其中图像对象是白色的。

cv2.imshow('binary', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

这份代码将显示二值化图像并等待用户按下键盘键,然后关闭窗口。

查找轮廓

接下来,我们需要查找图像中的轮廓。 这可以通过findContours函数完成:

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

findContours函数的第一个参数是二进制图像,第二个参数是轮廓的检索模式,第三个参数是轮廓的逼近方法。 这将返回所有的轮廓和层次结构。

cv2.drawContours(img, contours, -1, (0, 255, 0), 2)
cv2.imshow('contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这将绘制所有的轮廓并显示图像。 在这里,我们将绘制绿色的轮廓线。

计算轮廓的凸包和边界矩形

现在我们已经找到了轮廓,我们需要计算其凸包和边界矩形。 可以通过以下方式计算凸包和边界矩形:

# 计算凸包
hull = cv2.convexHull(c)
# 计算边界矩形
x, y, w, h = cv2.boundingRect(c)

cv2.convexHull函数将返回一个numpy数组,其中包含凸包的顶点。 对于cv2.boundingRect函数,它会返回一个矩形,可以用来框定轮廓。

for c in contours:
    hull = cv2.convexHull(c)
    x, y, w, h = cv2.boundingRect(c)
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
    cv2.drawContours(img, [hull], 0, (0, 0, 255), 2)

cv2.imshow('convex hull and bounding rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这将绘制一个蓝色的矩形,用于框定轮廓,以及一个红色的凸包线。

计算轮廓的面积和轮廓长度

在计算图像对象的范围时,我们也需要计算图像对象的面积和轮廓长度。 可以分别使用cv2.contourArea和cv2.arcLength函数来计算它们:

for c in contours:
    hull = cv2.convexHull(c)
    x, y, w, h = cv2.boundingRect(c)
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
    cv2.drawContours(img, [hull], 0, (0, 0, 255), 2)
    area = cv2.contourArea(hull)
    length = cv2.arcLength(hull, True)
    cv2.putText(img, "Area: {:.2f}".format(area), (x+10, y+30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    cv2.putText(img, "Length: {:.2f}".format(length), (x+10, y+50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

cv2.imshow('area and length', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

这将在图像的左上角和右上角的矩形内显示每个轮廓的面积和长度。

结论

在本文中,我们介绍了如何使用OpenCV Python计算图像对象的范围。 我们看到了如何加载图像,将其转换为灰度和二值图像,如何查找轮廓,并计算凸包和边界矩形。我们还学习了如何计算轮廓的面积和长度。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Python OpenCV