这段代码用于分析图像中的颜色信息并根据颜色值的平均值来判断是接近黄色还是接近紫色。具体步骤如下:
- 读取图像:
- 使用OpenCV的
cv2.imread
方法读取指定路径下的图像。
- 定义需要识别的颜色及其阈值范围:
- 颜色以RGB颜色空间的阈值范围表示,存在一个颜色字典
color_dist
,其中包括了需要识别的颜色(’pink’和’yellow’)及其对应的阈值范围。
- 对图像进行高斯模糊和颜色空间转换:
- 使用高斯模糊来平滑图像。
- 将图像从BGR颜色空间转换为HSV颜色空间,以便更好地处理颜色信息。
- 使用腐蚀操作:
- 使用
cv2.erode
方法对HSV图像进行腐蚀操作,以消除噪点,使边缘更加清晰。
- 查找颜色区域块:
- 针对每个需要识别的颜色,使用
cv2.inRange
方法找到在阈值范围内的颜色区域。 - 使用
cv2.findContours
方法查找颜色区域的轮廓。
- 获取最大颜色区域:
- 从所有颜色区域中选择面积最大的区域,将其用矩形框出。
- 随机生成20个点位:
- 随机生成20个点位坐标,用于计算平均颜色值。
- 计算20个点位的平均颜色值:
- 遍历这些点位,获取每个点位的颜色值,然后计算这些颜色值的平均值。
- 判断平均颜色值接近哪种颜色:
- 通过计算平均颜色值与黄色和紫色的颜色距离,判断平均颜色值接近哪种颜色。
- 输出结果:
- 根据颜色判断结果,输出是阴性还是阳性。
- 绘制矩形框和随机点位到图像上,以可视化显示结果。
- 显示图像:
- 使用OpenCV的窗口来显示处理后的图像。
代码中的cv2.namedWindow
和cv2.imshow
方法用于创建窗口并显示图像。最终,根据平均颜色值的判断结果,会在控制台输出相应信息,并在图像上绘制矩形框和随机点位以可视化显示结果。
import cv2
import numpy as np
# 读取图像
# image = cv2.imread("./test.png")
image = cv2.imread("./t2.jpg")
ball_color = ['yellow', 'pink'] # 需要识别的颜色 支持多个颜色
color_dist = {
'pink': {'Lower': np.array([150, 43, 46]), 'Upper': np.array([175, 255, 255])},
'yellow': {'Lower': np.array([21, 43, 46]), 'Upper': np.array([34, 255, 255])},
'purple': {'Lower': np.array([125, 43, 46]), 'Upper': np.array([155, 255, 255])}
}
gs_frame = cv2.GaussianBlur(image, (5, 5), 0) # 高斯模糊
hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV) # 转化成HSV图像
erode_hsv = cv2.erode(hsv, None, iterations=2) # 腐蚀 粗的变细
colorArr = []
for colorValue in ball_color: #获取所有匹配的区域块
inRange_hsv = cv2.inRange(erode_hsv, color_dist[colorValue]['Lower'], color_dist[colorValue]['Upper'])
c = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
colorArr += c
mask = max(colorArr, key=cv2.contourArea) #获取最大色块
rect = cv2.minAreaRect(mask)
box = cv2.boxPoints(rect)
box = np.intp(box)
# 计算边界框的中心点坐标
center_x = int((box[0][0] + box[2][0]) / 2)
center_y = int((box[0][1] + box[2][1]) / 2)
# 随机生成20个点位
points = []
for _ in range(20):
x = np.random.randint(center_x - 8, center_x + 8)
y = np.random.randint(center_y - 8, center_y + 8)
points.append((x, y))
# 计算20个点位的平均颜色值
avg_color = np.zeros(3)
for point in points:
color = hsv[point[1], point[0]]
avg_color += color
avg_color = tuple(map(int, avg_color / len(points)))
# 打印平均颜色值
print("平均颜色值:", avg_color)
# 判断平均颜色值接近黄色还是接近紫色
yellow_dist = np.linalg.norm(avg_color - color_dist['yellow']['Lower'])
purple_dist = np.linalg.norm(avg_color - color_dist['purple']['Lower'])
# 接口应在这里返回结果
if yellow_dist < purple_dist:
print("平均颜色值接近黄色----阴性")
else:
print("平均颜色值接近紫色----阳性")
# 绘制矩形和随机点位
cv2.drawContours(image, [np.intp(box)], -1, (0, 255, 255), 2)
for point in points:
cv2.circle(image, point, 3, (0, 0, 255), -1)
# 显示图像
cv2.namedWindow("img", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.imshow('img', image)
cv2.waitKey(0)
评论前必须登录!
注册