YOLO 基于opencv的斑马显示别-图像处理与轮廓检测的Python实现

图像处理与轮廓检测的Python实现

基于opencv的斑马显示别-图像处理与轮廓检测的Python实现

本文通过三个代码示例,展示了如何使用Python中的OpenCV库进行图像处理和轮廓检测。这些代码的核心功能是读取图像、将其转换为灰度图、通过二值化处理提取轮廓,并在图像上绘制检测到的矩形轮廓。以下是对代码的详细阐述。

import cv2

import numpy as np

from google.colab.patches import cv2_imshow

# Read the image

image3 = cv2.imread("img3.png", cv2.IMREAD_COLOR)

# Convert to grayscale

gray = cv2.cvtColor(image3, cv2.COLOR_RGB2GRAY)

# Create a binary thresholded image

_, binary = cv2.threshold(gray, 165, 240, cv2.THRESH_BINARY_INV)

# Find the contours from the thresholded image

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

# Draw all contours

for c in contours:

# Filtering the contours of rectangle type

rect = cv2.minAreaRect(c)

box = cv2.boxPoints(rect)

# Convert all coordinates floating point values to int

box = np.intp(box)

# Draw a green rectangle

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

# Display the final image

cv2_imshow(image3)

1. 图像读取与灰度转换

每个代码片段的第一步是读取图像文件。使用cv2.imread()函数加载图像,并通过cv2.IMREAD_COLOR参数确保图像以彩色模式读取。读取的图像存储在变量image3中。

接下来,图像被转换为灰度图。灰度转换是图像处理中的常见操作,能够简化后续处理步骤。通过cv2.cvtColor()函数,将彩色图像从RGB颜色空间转换为灰度图,结果存储在变量gray中。灰度图仅包含亮度信息,去除了颜色信息,便于后续的二值化处理。

import cv2

import numpy as np

from google.colab.patches import cv2_imshow

# Read the image

image3 = cv2.imread("zz.jpg", cv2.IMREAD_COLOR)

# Convert to grayscale

gray = cv2.cvtColor(image3, cv2.COLOR_RGB2GRAY)

# Create a binary thresholded image

_, binary = cv2.threshold(gray, 165, 240, cv2.THRESH_BINARY_INV)

# Find the contours from the thresholded image

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

# Draw all contours

for c in contours:

# Filtering the contours of rectangle type

rect = cv2.minAreaRect(c)

box = cv2.boxPoints(rect)

# Convert all coordinates floating point values to int

box = np.intp(box)

# Draw a green rectangle

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

# Display the final image

cv2_imshow(image3)

2. 二值化处理

灰度图经过二值化处理,将图像中的像素值转换为黑白两种颜色。二值化的目的是突出图像中的目标区域,便于轮廓检测。代码中使用cv2.threshold()函数实现二值化:

第一个参数是输入的灰度图像。第二个参数是阈值(165),用于将像素值分为两类。第三个参数是最大值(240),当像素值超过阈值时,将其设置为该值。第四个参数是二值化类型cv2.THRESH_BINARY_INV,表示反向二值化,即大于阈值的像素设为0,小于阈值的像素设为最大值。

二值化处理的结果存储在变量binary中,生成一张黑白图像,其中目标区域为白色,背景为黑色。

3. 轮廓检测

二值化图像被用于轮廓检测。轮廓是图像中连续的边界线,通常用于目标检测和形状分析。代码中使用cv2.findContours()函数检测轮廓:

第一个参数是二值化图像。第二个参数是轮廓检索模式cv2.RETR_TREE,表示检测所有轮廓并建立层级关系。第三个参数是轮廓近似方法cv2.CHAIN_APPROX_SIMPLE,表示仅保留轮廓的端点,减少存储空间。

函数返回两个值:contours和hierarchy。contours是一个列表,包含所有检测到的轮廓;hierarchy描述了轮廓之间的层级关系。

4. 轮廓过滤与矩形绘制

在检测到的轮廓中,代码进一步过滤出矩形轮廓,并在图像上绘制绿色矩形框。具体步骤如下:

最小外接矩形计算:使用cv2.minAreaRect()函数计算轮廓的最小外接矩形。该函数返回一个旋转矩形,包含中心点、宽度、高度和旋转角度。矩形顶点提取:通过cv2.boxPoints()函数将旋转矩形转换为四个顶点坐标。坐标转换:将浮点型坐标转换为整型,便于绘制。绘制矩形:使用cv2.drawContours()函数在原始图像上绘制绿色矩形框。参数(0, 255, 0)表示绿色,2表示线条宽度。

import cv2

import numpy as np

from google.colab.patches import cv2_imshow

# Read the image

image3 = cv2.imread("z4.jfif", cv2.IMREAD_COLOR)

# Convert to grayscale

gray = cv2.cvtColor(image3, cv2.COLOR_RGB2GRAY)

# Create a binary thresholded image

_, binary = cv2.threshold(gray, 165, 240, cv2.THRESH_BINARY_INV)

# Find the contours from the thresholded image

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

# Draw all contours

for c in contours:

# Filtering the contours of rectangle type

rect = cv2.minAreaRect(c)

box = cv2.boxPoints(rect)

# Convert all coordinates floating point values to int

box = np.intp(box)

# Draw a green rectangle

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

# Display the final image

cv2_imshow(image3)

5. 结果显示

最后,使用cv2_imshow()函数显示处理后的图像。该函数是Google Colab环境中用于显示图像的工具,功能类似于cv2.imshow()。

代码示例分析

三个代码片段的结构完全相同,唯一的区别在于输入图像的文件名:

第一个代码处理img3.png。第二个代码处理zz.jpg。第三个代码处理z4.jfif。

这种设计使得代码可以灵活应用于不同的图像文件,只需修改文件名即可。

技术细节与优化建议

阈值选择:代码中使用的阈值(165)和最大值(240)是固定的,可能不适用于所有图像。可以通过动态阈值方法(如Otsu算法)优化二值化效果。轮廓过滤:当前代码仅绘制矩形轮廓,未对其他形状的轮廓进行处理。可以根据实际需求扩展功能,例如检测圆形或多边形。性能优化:对于高分辨率图像,轮廓检测和绘制可能较慢。可以通过图像缩放或减少轮廓近似点优化性能。

应用场景

该代码适用于以下场景:

目标检测:在图像中定位矩形目标,如文档、车牌或建筑物。图像标注:在图像上绘制边界框,用于数据标注或可视化。形状分析:分析图像中的几何形状,提取特征信息。

总结

本文通过三个代码示例,详细阐述了如何使用OpenCV进行图像处理、轮廓检测和矩形绘制。代码结构清晰,功能实用,适用于多种图像处理任务。通过调整参数和扩展功能,可以进一步优化代码的适用性和性能。

YOLO 基于opencv的斑马显示别-图像处理与轮廓检测的Python实现https://www.kuazhi.com/post/715738682.html

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容