图像处理与轮廓检测的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