颜色识别的原理:
颜色在图像处理中通常使用 HSV 空间来表示。
HSV 空间是基于人类视觉系统的一种颜色模型,其中:
H(Hue):色调,表示颜色的种类,例如红色、绿色。
S(Saturation):饱和度,表示颜色的纯度。
V(Value):明度,表示颜色的亮度。
使用 HSV 空间分割颜色比直接使用 RGB 空间更加直观且效果更好。
轮廓绘制的原理:
轮廓是指图像中具有相同颜色或灰度值的边界。
在 OpenCV 中,通过以下步骤实现轮廓绘制:
转换图像到 HSV 空间,设定颜色阈值,分割出感兴趣区域。
使用 cv2.findContours 查找轮廓。
使用 cv2.drawContours 将轮廓绘制在原图或复制图像上。
2. 实验代码以下是基于 OpenCV 的完整代码:
import cv2
import numpy as np
# --------------------1. 读取图像--------------------
# 加载目标图片
image = cv2.imread("./color_1.png")
# 调整图片大小,方便显示和处理
image = cv2.resize(image, (0, 0), fx=0.5, fy=0.5)
# --------------------2. 转换到 HSV 空间--------------------
# 将图像从 BGR 空间转换到 HSV 空间
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# --------------------3. 定义颜色阈值范围--------------------
# 定义要识别的颜色范围(以蓝色为例)
# 这里的值需要根据实际颜色进行调整
lower_blue = np.array([100, 150, 50]) # HSV 下界
upper_blue = np.array([140, 255, 255]) # HSV 上界
# 使用 inRange 函数分割颜色区域
mask = cv2.inRange(image_hsv, lower_blue, upper_blue)
# --------------------4. 图像处理--------------------
# 使用形态学操作去除噪点(可选)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
mask_cleaned = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# --------------------5. 查找轮廓--------------------
# 在掩码图像中查找轮廓
contours, hierarchy = cv2.findContours(mask_cleaned, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# --------------------6. 绘制轮廓--------------------
# 创建一个原始图像的副本,用于绘制轮廓
image_contours = image.copy()
# 在副本上绘制轮廓
cv2.drawContours(image_contours, contours, -1, (0, 255, 0), 3)
# --------------------7. 显示结果--------------------
# 显示原始图像
cv2.imshow("Original Image", image)
# 显示掩码图像
cv2.imshow("Mask", mask_cleaned)
# 显示绘制了轮廓的图像
cv2.imshow("Contours", image_contours)
# 等待按键退出
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 实验现象实验效果:
原始图像窗口:显示原始图像。
掩码窗口:显示分割后的蓝色区域(白色部分为识别的颜色)。
轮廓绘制窗口:显示绘制了颜色轮廓的图像。
实验总结:
使用 HSV 空间可以高效地分割颜色区域。
cv2.findContours 和 cv2.drawContours 可以精确提取和标记物体的边界。
这种方法可以应用在以下场景:
交通标志识别。
物体检测与跟踪。
色彩分类任务。