opencv实践项目-颜色分割

38 篇文章 1 订阅

1.步骤

  • 高斯模糊
  • BGR转hsv
  • 阀值分割
  • 添加掩膜

2. 实现

原图:
在这里插入图片描述

#include <opencv2/opencv.hpp>
#include <vector>

using namespace cv;
using namespace std;
int main()
{
    cv::Mat img = cv::imread("/Users/xialz/Downloads/bird.png");
    cv::Mat blur;
    cv::GaussianBlur(img, blur, cv::Size(5, 5), 0);
    cv::Mat hsv;
    cv::cvtColor(blur, hsv, cv::COLOR_BGR2HSV);

    cv::Mat mask;
    cv::inRange(hsv, cv::Scalar(55, 0, 0), cv::Scalar(118,255,255), mask);

    cv::imshow("mask", mask);
    cv::Mat res;
    cv::bitwise_and(img, img, res, mask);

    cv::imshow("res", res);
    cv::waitKey(0);
    
    return 0;
}

mask:
mask
结果图:
j结果图

=几点说明=

  • 为何转hsv
    因为像素B,G和R的取值与落在物体上的光相关,因此这些值也彼此相 关,无法准确描述像素。相反,HSV空间中,三者相对独立,可以准确描述像素的亮度,饱和度 和色度。
  • inRange函数
CV_EXPORTS_W void inRange(InputArray src, InputArray lowerb,
                          InputArray upperb, OutputArray dst);

inRange函数是OpenCV提供的用于检测图像矩阵的元素各通道值是否介于两个指定的矩阵或标量lowerb和upperb对应通道值之间,如果检测图像的某个像素的各个通道值分别大于等于lowerb对应元素或标量的各个通道值且小于等于upperb对应元素或标量的各个通道值,则结果矩阵对应元素的各个通道被设置为255,否则被设置为0。

  • bitwise_and函数
CV_EXPORTS_W void bitwise_and(InputArray src1, InputArray src2,
                              OutputArray dst, InputArray mask = noArray());

对src1和src2像素值进行按位与运算,mask为掩膜(关于掩膜的描述

  • 阀值选取
    阈值分割,这可能是一个相当繁琐的任务。即 使我们可能想到通过使用颜色选择器工具来了解像素值,但是仍然需要进行不断的尝试,以便在 所有像素中获取期望的像素,有些时候这也可能是一项艰巨的任务
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值