基础
hsv_image = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
hsv_image是通过将BGR图像转换为HSV颜色空间而得到的新图像。它包含了与原始图像相同的尺寸,但颜色通道由BGR转换为HSV。
具体地说,hsv_image是一个三维数组,其形状与原始图像相同(通常是高度 x 宽度 x 3)。它的三个通道分别表示色相(Hue)、饱和度(Saturation)和明度(Value),这些通道的值范围如下:
色相(Hue)通道:取值范围为0到179,表示不同类型的颜色。
饱和度(Saturation)通道:取值范围为0到255,表示颜色的纯度或鲜艳度。值为0意味着灰度色调,值越高表示越鲜艳的颜色。
明度(Value)通道:取值范围为0到255,表示颜色的亮度。值为0表示黑色,值为255表示最亮的颜色。
通过在hsv_image中访问相应的通道,您可以获取每个像素点在HSV颜色空间中的数值。
例如,如果您想要获取图像的色相通道,可以使用hsv_image[:, :, 0]来访问。类似地,您可以使用hsv_image[:, :, 1]和hsv_image[:, :, 2]来获取饱和度和明度通道的值。
希望能够解答您的疑问!如果还有其他问题,请随时提问。
- 色相
hsv_image[:, :, 0]
- 饱和度
hsv_image[:, :, 1]
- 明度通道的值
hsv_image[:, :, 2]来获取和
掩膜
mask_image_2 = cv2.inRange(
hsv_image,
green_lower_color_range_2,
green_upper_color_range_2
) # 过滤图片的 绿色2 掩膜
交
direction_mask_image = cv2.bitwise_and(mask_image_2, direction_mask)
图片简单处理案例1:
- 获取图片中的绿色
def image_filter_green():
img = cv2.imread("4.png") # 读取图片
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 将图片转换为HSV颜色空间
# 定义绿色的范围(在HSV颜色空间中)
lower_green = np.array([40, 50, 50])
upper_green = np.array([80, 255, 255])
# 创建掩膜,根据绿色的范围将图像中的绿色部分设置为白色,其他部分设置为黑色
mask = cv2.inRange(hsv_img, lower_green, upper_green)
# 对原始图像进行掩膜操作,提取绿色部分
green_img = cv2.bitwise_and(img, img, mask=mask)
# 保存提取的绿色部分图像
cv2.imwrite("green_image.png", green_img)
# 显示结果
cv2.imshow("Green Image", green_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 获取图片中的红色
def image_filter_red():
img = cv2.imread("4.png") # 读取图片
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 将图片转换为HSV颜色空间
# 定义红色的范围(在HSV颜色空间中)
lower_red1 = np.array([0, 50, 50])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 50, 50])
upper_red2 = np.array([180, 255, 255])
# 创建掩膜,根据红色的范围将图像中的红色部分设置为白色,其他部分设置为黑色
mask1 = cv2.inRange(hsv_img, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv_img, lower_red2, upper_red2)
mask = cv2.bitwise_or(mask1, mask2)
# 对原始图像进行掩膜操作,提取红色部分
red_img = cv2.bitwise_and(img, img, mask=mask)
# 保存提取的红色部分图像
cv2.imwrite("red_image.png", red_img)
# 显示结果
cv2.imshow("Red Image", red_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 合并绿色和红色
def image_merged():
green_img = cv2.imread("green_image.png") # 读取绿色部分图像
red_img = cv2.imread("red_image.png") # 读取红色部分图像
# 将两个图像进行加法运算,实现图像的叠加
merged_img = cv2.add(green_img, red_img)
# 保存合并后的图像
cv2.imwrite("merged_image.png", merged_img)
# 显示结果
cv2.imshow("Merged Image", merged_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 选中图片中的红色和绿色...(需要修改颜色的HSV范围)
def test_2():
# 读取图片
image = cv2.imread('1.png')
image1 = cv2.imread("merged_image.png", flags=cv2.IMREAD_GRAYSCALE)
# 将图片从BGR转换为HSV颜色空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义绿色的HSV范围
lower_green = np.array([40, 50, 50], dtype=np.uint8) # 这里只选择绿色
upper_green = np.array([80, 255, 255] , dtype=np.uint8) # 这里只选择绿色
# 使用掩膜获得绿色区域
mask = cv2.inRange(hsv, lower_green, upper_green)
# 取交集
mask_image = cv2.bitwise_and(mask, image1)
# 查找轮廓
contours, hierarchy = cv2.findContours(mask_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制绿色轮廓
for contour in contours:
area = cv2.contourArea(contour)
# if area > 1000: # 设置最小面积
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
M = cv2.moments(contour) # 计算轮廓的矩
if M["m00"] != 0:
cX = int(M["m10"] / M["m00"]) # 计算轮廓的中心点坐标
cY = int(M["m01"] / M["m00"])
center_list.append((cX, cY,))
# 各个轮廓之间连线
for a, b in zip(center_list[0::], center_list[1::]):
cv2.line(image, a, b,(0, 255, 0), 2)
# 显示结果
cv2.imshow('image', image)
# cv2.imshow('mask_image', mask_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图片:
-
素材图片

-
获取出的绿色

-
获取出的红色

-
合并获取的红色和绿色

去除图片中的白色像素

去除图片中的黑色像素
