第三篇:识别图片颜色并绘制轮廓
1. 实验原理
颜色识别的原理:
-
颜色在图像处理中通常使用 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
可以精确提取和标记物体的边界。 -
这种方法可以应用在以下场景:
-
交通标志识别。
-
物体检测与跟踪。
-
色彩分类任务。
-