OpenCV学习记录(三):简单的使用图像掩膜提取图像中感兴趣对象

OpenCV中给出了很多种提取对象特征的方法。
从简单的图像色块>图像阈值分割>轮廓查找>特征点检测>直方图检测等等有很多。这些简单的方法看似没有什么实际的场景可以直接拿来使用,但是就学习的时候拿来学习学习是非常恰当的。
下面就按照颜色阈值的方式来查找图像中的蓝色物体,提取出对象的掩膜并进行覆盖。

色域转换

通常情况下,摄像机直接采集到的图像是RGB色域的(在Opencv中三通道色彩默认是BGR排列)。对于人的肉眼来说RGB色域是更好的选择,三色差别显著,但是对于计算机来说并不是很明显。相当于人眼观察时要一个颜色特征明显的色域空间,对于计算机来说通常使用HSV色域空间。在Opencv中可以很简单的实现色域的转换。

hsv = cv.cvtColor(imagein, cv.COLOR_BGR2HSV)

这样我们就完成了色域的转换。
在这里插入图片描述

转换色域后我们可以看出图像的颜色差别更加直观了。

阈值提取

这是最简单的一种图像特征的提取方式,直接通过对图像中的特定颜色进行阈值调整,可以提取出固定的颜色。有一些树莓派的小球跟踪小车就是通过对图像的阈值直接处理后在加上轮廓特征提取出小球相对相机的坐标位置,然后控制小车向前向后或者左右转。
这里我们直接设置阈值

    # 定义HSV中蓝色的范围
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    # 设置HSV的阈值使得只取蓝色
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    blur = cv.GaussianBlur(mask,(5,5),0)

掩膜提取和原图覆盖

这里通过阈值处理之后我们就得到了一张只包含我们感兴趣颜色部分的图像,这张图像可以称之为掩膜。把掩膜图像和原始的图像进行相加处理就可以得到原始图像中只包含我们感兴趣区域的图像。
融合掩膜与原图像:

    # 将掩膜和图像逐像素相加
    res = cv.bitwise_and(frame,frame, mask= mask)

在这里插入图片描述
Mask是阈值处理之后的图像就是我们将要使用的掩膜,RES是将掩膜与原图像相加之后的结果。

最后直观的放两张图对比一下:
在这里插入图片描述

在这里插入图片描述
可以看到提取的效果还是挺好的。
这里决定掩膜质量的因素是阈值的数值和色域空间的选择

源代码

源码中使用了matplotlib画了图。阈值后的图像做了平滑处理。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

cap = cv.VideoCapture(0)
while(1):
    # 读取帧
    _, frame = cap.read()
    # 转换颜色空间 BGR 到 HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # 定义HSV中蓝色的范围
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    # 设置HSV的阈值使得只取蓝色
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    blur = cv.GaussianBlur(mask,(5,5),0)

    # 将掩膜和图像逐像素相加
    res = cv.bitwise_and(frame,frame, mask= mask)
    cv.imshow('frame',frame)
    cv.imshow('mask',mask)
    cv.imshow('res',res)

    plt.subplot(221), plt.imshow(frame), plt.title('Original')
    plt.xticks([]), plt.yticks([])
    plt.subplot(222), plt.imshow(hsv), plt.title('HSV')
    plt.xticks([]), plt.yticks([])
    plt.subplot(223), plt.imshow(mask), plt.title('Mask')
    plt.xticks([]), plt.yticks([])
    plt.subplot(224), plt.imshow(res), plt.title('RES')
    plt.xticks([]), plt.yticks([])
    plt.show()

    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break
cv.destroyAllWindows()
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用OpenCV的cv2.rectangle方法生成mask,然后将mask应用于原始图像即可。 以下是示例代码: ```python import cv2 import numpy as np # 读取原始图像 img = cv2.imread('image.jpg') # 预设宽高 width, height = 300, 400 # 生成mask,将感兴趣区域设为白色,其余部分设为黑色 mask = np.zeros(img.shape[:2], dtype=np.uint8) mask[0:height, 0:width] = 255 # 应用mask,将非感兴趣区域设为黑色 masked_img = cv2.bitwise_and(img, img, mask=mask) # 转换为灰度图 gray_img = cv2.cvtColor(masked_img, cv2.COLOR_BGR2GRAY) # 二值化处理,形成黑白图 _, bw_img = cv2.threshold(gray_img, 1, 255, cv2.THRESH_BINARY) # 显示结果 cv2.imshow('Original Image', img) cv2.imshow('Mask', mask) cv2.imshow('Masked Image', masked_img) cv2.imshow('Black and White Image', bw_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子,我们读取了一张名为“image.jpg”的图像,并设定了宽300和高400。然后,我们使用cv2.rectangle方法生成了一个mask,将感兴趣的区域设为白色,其余部分设为黑色。接着,我们将mask应用于原始图像,将非感兴趣区域设为黑色,并将结果转换为灰度图。最后,我们使用cv2.threshold方法对灰度图进行二值化处理,形成黑白图,并将结果显示出来。 注意,这个示例,我们使用了cv2.rectangle方法生成了一个矩形的mask,如果需要生成其他形状的mask,可以使用其他的OpenCV方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

絮沫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值