Python OpenCV进阶:图像翻转、轮廓排序与颜色识别实战

今天早睡
今天早睡
发布时间:2026-10-12| 2人浏览过
原创

本文详解Python OpenCV图像处理进阶技巧。通过imutils库实现图像180度翻转与轮廓排序(上下/左右),利用Canny边缘检测提取轮廓。深入讲解HSV空间颜色识别原理,通过cv2.inRange与形态学处理精准提取目标颜色,并提供动态阈值调节方法。

利用imutils实现图像翻转

在OpenCV处理中,imutils是一个轻量级且高效的辅助库,能够简化常见的图像处理操作。安装该库可通过GitHub官方源或CSDN镜像进行:

pip install imutils

imutils不仅支持基础的图像缩放(resizing),还封装了透视变换(4-point Perspective Transform)和轮廓排序等常用功能。其中,imutils.rotate函数用于图像翻转,其核心参数为待处理图像与旋转角度。默认情况下,旋转中心为图像中心。

以下代码演示了如何调用摄像头并实时进行180度翻转显示:

import cv2
import imutils

# 打开摄像头
vc = cv2.VideoCapture(0)

if vc.isOpened():
  flag, frame = vc.read()
  # 初始帧翻转显示
  img = imutils.rotate(frame, 180)
  cv2.imshow("frame", img)
else:
  flag = False

# 循环读取并翻转
while flag:
  flag, frame = vc.read()
  if frame is None:
    break
  if flag is True:
    # 执行180度翻转
    img = imutils.rotate(frame, 180)
    cv2.imshow("frame", img)
    # 按ESC键退出
    if cv2.waitKey(10) == 27:
      break

vc.release()
cv2.destroyAllWindows()

图像轮廓检测与排序

在识别图像中的物体时,获取轮廓后往往需要对其进行排序(如从左到右、从上到下)。imutils库提供了contours.sort_contours函数,可直接返回排序后的轮廓列表及对应的外接矩形坐标。

排序与标注实现

处理流程包括:读取图像、灰度转换、Canny边缘检测、提取轮廓,最后利用imutils进行排序和标注。

from imutils import contours
import cv2

# 读取图像
img = cv2.imread(r"D:\opencv-workspace\Opencv\test17--VScode\shapes.png")
draw_img = img.copy()
img_rect = img.copy()

# 灰度转换与边缘检测
grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_edge = cv2.Canny(grey, 10, 20)

# 提取轮廓
# RETR_EXTERNAL 仅提取外层轮廓
# CHAIN_APPROX_NONE 保存所有轮廓点
cnts, hierarchy = cv2.findContours(img_edge, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 按“从上到下”排序,返回排序后的轮廓和边界框
(cnts, boundingBoxes) = contours.sort_contours(cnts, "top-to-bottom")

# 标注轮廓序号
for (i, c) in enumerate(cnts):
  # label_contour 直接在图像上绘制轮廓并标注序号
  sortedImage = contours.label_contour(draw_img, c, i, color=(240, 0, 159))

# 绘制外接矩形
for (x, y, w, h) in boundingBoxes:
  img_rect = cv2.rectangle(img_rect, (x, y), (x+w, y+h), (240, 0, 159), 2)

cv2.imshow("top-to-bottom", sortedImage)
cv2.imshow("rect", img_rect)
cv2.waitKey(0)
cv2.destroyAllWindows()

排序模式支持:"left-to-right"、"right-to-left"、"top-to-bottom"和"bottom-to-top"。此外,也可使用cv2.drawContours手动绘制轮廓,但imutils的label_contour能更直观地展示排序结果。

基于HSV空间的颜色识别

在RGB或BGR空间中,颜色的亮度、饱和度和色调混合在一起,难以直接通过阈值分割。OpenCV推荐使用HSV(色相H、饱和度S、明度V)空间进行颜色识别,通过调整H值范围即可精准提取特定颜色。

颜色空间转换与阈值提取

首先将图像从BGR转换为HSV,然后设定颜色的上下阈值。在HSV空间中,H的范围通常为0-179,S和V为0-255。通过cv2.inRange生成掩膜(Mask),再利用位与运算提取目标颜色。

import cv2
import numpy as np

# 读取图像
img = cv2.imread(r"D:\opencv-workspace\Opencv\test16--VScode\photo.jpg")

# 转换为HSV空间
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 设定绿色的HSV阈值
# H: 50-70, S: 255, V: 255
lower_green = np.array([50, 255, 255])
upper_green = np.array([70, 255, 255])

# 生成掩膜:在阈值范围内的像素变为255,否则为0
mask_green = cv2.inRange(img_hsv, lower_green, upper_green)

# 显示掩膜结果
cv2.imshow("img_or", mask_green)

# 提取绿色区域
res_green = cv2.bitwise_and(img, img, mask=mask_green)
cv2.imshow("img", res_green)
cv2.waitKey(0)
cv2.destroyAllWindows()

动态获取与调节HSV阈值

若不确定具体颜色的HSV值,可通过将BGR颜色转换为HSV来查询。例如,获取BGR值为[193, 189, 147]的颜色对应的HSV值:

import cv2
import numpy as np

color = np.uint8([[[193, 189, 147]]])  # BGR值
hsv = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
print(hsv)  # 输出: [[[ 93 61 193]]]

为了适应不同光照条件,可以使用OpenCV的Trackbar(滑动条)动态调整阈值。以下代码创建了一个包含6个滑动条的窗口,分别控制H、S、V的低值和高值:

import cv2
import numpy as np

def function(x):
  # 获取滑动条当前值
  lowH = cv2.getTrackbarPos("lowH", "img_666")
  lowS = cv2.getTrackbarPos("lowS", "img_666")
  lowV = cv2.getTrackbarPos("lowV", "img_666")
  HighH = cv2.getTrackbarPos("HighH", "img_666")
  HighS = cv2.getTrackbarPos("HighS", "img_666")
  HighV = cv2.getTrackbarPos("HighV", "img_666")
  
  # 构建阈值数组
  lower = np.uint8([lowH, lowS, lowV])
  upper = np.uint8([HighH, HighS, HighV])
  
  # 生成掩膜并提取颜色
  mask = cv2.inRange(img_hsv, lower, upper)
  res = cv2.bitwise_and(img, img, mask=mask)
  cv2.imshow("img", res)

# 读取图像并转换
img = cv2.imread(r"D:\opencv-workspace\Opencv\test16--VScode\test.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 创建窗口和滑动条
cv2.namedWindow("img_666")
cv2.createTrackbar("lowH", "img_666", 0, 179, function)
cv2.createTrackbar("lowS", "img_666", 0, 255, function)
cv2.createTrackbar("lowV", "img_666", 0, 255, function)
cv2.createTrackbar("HighH", "img_666", 0, 179, function)
cv2.createTrackbar("HighS", "img_666", 0, 255, function)
cv2.createTrackbar("HighV", "img_666", 0, 255, function)

cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过调节滑动条,可以实时观察颜色提取效果。若识别出现漏色现象,可尝试结合形态学处理(如开运算或闭运算)使图像更饱满,从而优化识别效果。

以上就是Python OpenCV图像翻转、轮廓排序与颜色识别的详细内容,更多关于OpenCV图像处理进阶的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。