【OpenCV-Python】:使用OpenCV处理图像并提取轮廓及其矩和面积

本文详细讲解了如何通过OpenCV库读取图像,将其转换为灰度并进行二值化处理,提取轮廓,并计算每个轮廓的矩和面积,以便于图像分析和物体检测。
摘要由CSDN通过智能技术生成

摘要:本文介绍了如何使用OpenCV库来读取图像,将其转换为灰度图像,进行二值化处理,提取轮廓,并计算每个轮廓的矩和面积。通过这个过程,我们可以更好地理解和分析图像中的物体形状和特征。

目录

一、引言

二、环境准备

三、代码实现

1. 导入必要的库

2. 读取图片

3. 检查图片是否读取成功

4. 将图片转换为灰度图像

5. 对灰度图像进行二值化处理

6. 查找轮廓

7. 绘制轮廓

8. 显示图像

9. 遍历轮廓并计算矩和面积

10. 等待并关闭窗口

11.下面是使用OpenCV进行图像轮廓提取和矩计算的完整代码:

四、运行与结果

五、总结


一、引言

在图像处理和计算机视觉领域,轮廓提取是一项重要的任务。通过提取图像的轮廓,我们可以获取到物体的形状信息,进而进行后续的分析和处理。OpenCV是一个强大的计算机视觉库,它提供了丰富的函数和工具来处理和分析图像。本文将介绍如何使用OpenCV来实现图像的轮廓提取和矩计算。

二、环境准备

在开始之前,请确保已经安装了OpenCV库。你可以通过pip来安装它:

pip install opencv-python

三、代码实现

1. 导入必要的库

import cv2  
import numpy as np
#我们导入了cv2(OpenCV库)和numpy(用于数组操作)。

2. 读取图片

img_path = 'pic/shape4.jpg'  # 替换为你的图片路径  
img = cv2.imread(img_path)

我们定义了一个变量img_path来存储图片的路径,并使用cv2.imread函数读取图片。

3. 检查图片是否读取成功

if img is None:  
    print("错误:图片未正确读取,请检查文件路径。")  
    exit()

如果图片没有正确读取(例如文件路径错误或文件损坏),cv2.imread会返回None。我们通过检查img是否为None来确保图片读取成功。

4. 将图片转换为灰度图像

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

在轮廓提取之前,通常需要将彩色图像转换为灰度图像,因为灰度图像只包含亮度信息,处理起来更简单。

5. 对灰度图像进行二值化处理

ret, img_binary = cv2.threshold(gray, 125, 255, cv2.THRESH_BINARY)

二值化处理是将灰度图像的像素值转换为0或255,这有助于我们更清晰地识别轮廓。这里使用了一个简单的阈值方法。

6. 查找轮廓

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

使用cv2.findContours函数在二值化图像中查找轮廓。这个函数返回两个值:轮廓列表contours和轮廓之间的层次结构hierarchy

7. 绘制轮廓

img_contours = np.zeros(img.shape, np.uint8) + 255  
cv2.drawContours(img_contours, contours, -1, (0, 0, 255), 2)

我们创建了一个全白的图像img_contours,与原图同样大小,并在其上绘制了红色轮廓。-1表示绘制所有轮廓。

8. 显示图像

cv2.imshow('原图', img)  
cv2.imshow('轮廓', img_contours)

使用cv2.imshow函数显示原图和带有轮廓的图像。

9. 遍历轮廓并计算矩和面积

for n, contour in enumerate(contours):  
    moments = cv2.moments(contour)  
    print(f'轮廓{n}的矩:', moments)  
    if moments['m00'] != 0:  
        area = moments['m00']  
        print(f'轮廓{n}的面积:', area)  
    else:  
        print(f'轮廓{n}没有有效面积。')

对于找到的每个轮廓,我们使用cv2.moments函数计算其矩。矩包含了关于轮廓形状的信息,例如面积(m00)。如果m00不为0,则计算并打印轮廓的面积。

10. 等待并关闭窗口

cv2.waitKey(0)  
cv2.destroyAllWindows()

使用cv2.waitKey(0)等待用户按键,然后使用cv2.destroyAllWindows()关闭所有打开的窗口。

11.下面是使用OpenCV进行图像轮廓提取和矩计算的完整代码:

import cv2  
import numpy as np  
  
# 读取图片  
img_path = 'pic/shape4.jpg'  # 替换为你的图片路径  
img = cv2.imread(img_path)  
  
# 检查图片是否读取成功  
if img is None:  
    print("错误:图片未正确读取,请检查文件路径。")  
    exit()  
  
# 将图片转换为灰度图像  
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
  
# 对灰度图像进行二值化处理  
ret, img_binary = cv2.threshold(gray, 125, 255, cv2.THRESH_BINARY)  
  
# 查找轮廓  
contours, hierarchy = cv2.findContours(img_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  
  
# 创建一个与原图同样大小的全白图像  
img_contours = np.zeros(img.shape, np.uint8) + 255  
  
# 在全白图像上绘制所有轮廓,轮廓颜色为红色  
cv2.drawContours(img_contours, contours, -1, (0, 0, 255), 2)  
  
# 显示原图和带有轮廓的图像  
cv2.imshow('原图', img)  
cv2.imshow('轮廓', img_contours)  
  
# 遍历所有轮廓,并计算它们的矩  
for n, contour in enumerate(contours):  
    moments = cv2.moments(contour)  
  
    # 打印轮廓的矩  
    print(f'轮廓{n}的矩:', moments)  
  
    # 打印轮廓的面积,注意:如果m00为0,则不计算面积  
    if moments['m00'] != 0:  
        area = moments['m00']  
        print(f'轮廓{n}的面积:', area)  
    else:  
        print(f'轮廓{n}没有有效面积。')  
  
# 等待按键,然后关闭窗口  
cv2.waitKey(0)  
cv2.destroyAllWindows()

四、运行与结果

将上述代码保存为.py文件,并在安装了OpenCV的环境中运行它。确保你的图片路径正确无误。运行代码后,将会显示两个窗口:一个是原图窗口,另一个是带有红色轮廓的图像窗口。同时,控制台会输出每个轮廓的矩和面积信息。

五、总结

通过本文的介绍,我们学会了如何使用OpenCV库来读取图像、转换灰度、二值化、提取轮廓,并计算每个轮廓的矩和面积。这些操作对于图像分析和物体检测等任务非常有用,可以帮助我们更好地理解和处理图像数据。希望本文对你有所帮助,如果你有任何疑问或建议,请在下方留言交流。

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪猪爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值