下面我们将学习opencv和HSV,因为RGB相同的颜色在各种照明条件下可能看起来不同,HSV 模型将颜色信息(色调)与亮度和强度分开,这使得检测黄色、红色或绿色等颜色变得更加容易,尤其是在不同的光照条件下HSV更胜一筹,RGB不太适合颜色检测。所以使用 HSV(色相、饱和度、值)颜色模型来检测图像中的红色。接下来逐步完成每个步骤,包括导入库、加载图像、将图像转换为 HSV 色彩空间、创建红色蒙版、查找轮廓以及在黄色区域周围绘制边界框。
接下来以检测键盘红色按键及黑色按键的红色图标为例,原图为:
这是最后检测后输出的效果图:
首先,需要安装三个库一般用pip安装分别是:
OpenCV (cv2):图像处理任务,读取、显示和作图像。
NumPy (np) :处理用于表示图像的数组。
Matplotlib (plt) :用于用户友好的方式显示图像。
然后导入这些库:
import cv2
import numpy as np
import matplotlib.pyplot as plt
加载图像:
def detect_red_color(image_path):
""" 函数接收一个图像文件路径
利用HSV颜色空间检测红色区域
并返回已绘制红色区域边界框的图像. """
# 将图像文件从存储路径读取到内存中,转换成程序可处理的图像数据对象
image_path='777.jpg'
image = cv2.imread(image_path)
将RGB转换为HSV并定义上下限,红色低色调区间(接近0°的红色)下限:[0, 50, 50]上限:[10, 255, 255]高色调区间(接近180°的红色)下限:[170, 50, 50]上限:[180, 255, 255] ):
# 将图像从默认的RGB/BGR颜色空间转换为HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义红色的HSV范围
red_lower = np.array([0,50,50])
# 红色下限值
red_upper = np.array([180,255,255]) # 红色上限值
将色点用绿色框选出:
# 创建红色遮罩以分离红色区域
mask = cv2.inRange(hsv_image, red_lower, red_upper)
# 查找红色区域的轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 创建原始图像的副本,以便在其上绘制边界框
output_image = image.copy()
# 遍历每个轮廓,并在检测到的红色区域周围绘制边界框
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
if cv2.contourArea(contour) >80:
#过滤掉小轮廓
cv2.rectangle(output_image, (x, y), (x + w, y + h), (0,255,0),2)
# 绘制绿色边界框
# 将输出图像转换为RGB格式以便用matplotlib显示
output_image_rgb = cv2.cvtColor(output_image, cv2.COLOR_BGR2RGB)
显示原图与检测图:
# 并排显示原始图像与处理后的图像
plt.figure(figsize=(12, 6))
# 显示原始图像
plt.subplot(1,2,1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Original Image")
plt.axis('off')
# 显示经过红色检测处理后的图像
plt.subplot(1,2,2)
plt.imshow(output_image_rgb)
plt.title("red Color Detection with Bounding Boxes")
plt.axis('off')
# 显示图表
plt.show()
保存的图像数据作为函数执行结果输出,切记(return 语句之前必须有 def 函数定义):
def main_processing():
#创建了一个新的函数,该函数:(return 语句之前必须有 def 函数定义)
return output_image #将变量output_image保存的图像数据作为函数执行结果输出
# Example usage 使用示例
image_path ='777.jpg'
# Replace with your image path 替换为实际图像路径
output_image = detect_red_color(image_path)
本文用的是vscode配置python开发环境编写opencv。通过将图像转换为 HSV、定义红色范围、创建蒙版和查找轮廓,成功地用边界框隔离并突出显示了红色区域。这种方法对于计算机视觉中的颜色检测任务非常强大。
这是完整代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
def detect_red_color(image_path):
""" 函数接收一个图像文件路径
利用HSV颜色空间检测红色区域
并返回已绘制红色区域边界框的图像. """
# 将图像文件从存储路径读取到内存中,转换成程序可处理的图像数据对象
image_path='777.jpg'
image = cv2.imread(image_path)
# 将图像从默认的RGB/BGR颜色空间转换为HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义红色的HSV范围
red_lower = np.array([0,50,50])
# 红色下限值
red_upper = np.array([180,255,255]) # 红色上限值
# 创建黄色遮罩以分离红色区域
mask = cv2.inRange(hsv_image, red_lower, red_upper)
# 查找黄色区域的轮廓
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 创建原始图像的副本,以便在其上绘制边界框
output_image = image.copy()
# 遍历每个轮廓,并在检测到的红色区域周围绘制边界框
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
if cv2.contourArea(contour) >80:
#过滤掉小轮廓
cv2.rectangle(output_image, (x, y), (x + w, y + h), (0,255,0),2)
# 绘制绿色边界框
# 将输出图像转换为RGB格式以便用matplotlib显示
output_image_rgb = cv2.cvtColor(output_image, cv2.COLOR_BGR2RGB)
# 并排显示原始图像与处理后的图像
plt.figure(figsize=(12, 6))
# 显示原始图像
plt.subplot(1,2,1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Original Image")
plt.axis('off')
# 显示经过红色检测处理后的图像
plt.subplot(1,2,2)
plt.imshow(output_image_rgb)
plt.title("red Color Detection with Bounding Boxes")
plt.axis('off')
# 显示图表
plt.show()
def main_processing():
#创建了一个新的函数,该函数:(return 语句之前必须有 def 函数定义)
return output_image #将变量output_image保存的图像数据作为函数执行结果输出
# Example usage 使用示例
image_path ='777.jpg'
# Replace with your image path 替换为实际图像路径
output_image = detect_red_color(image_path)
有问题评论区解答,谢谢观看。