opencv 彩色图像分割(inrange)_opencv inrange scalar-程序员宅基地

技术标签: 计算机视觉 "进阶"  计算机视觉 "入门 " --- OpenCv  opencv 彩色图像分割(inrange)  

                              opencv 彩色图像分割(inrange) 

 

原文地址: https://www.cnblogs.com/chenzhefan/p/7648433.html

灰度图像大多通过算子寻找边缘区域生长融合来分割图像。

  彩色图像增加了色彩信息,可以通过不同的色彩值来分割图像,常用彩色空间HSV/HSI, RGB, LAB等都可以用于分割!

  笔者主要介绍inrange() 来划分颜色区域。先看看OpenCV的文档:

  C++: void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)

  C: void cvInRangeS(const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst

  • src – first input array.  //
  • lowerb – inclusive lower boundary array or a scalar.
  • upperb – inclusive upper boundary array or a scalar.
  • dst – output array of the same size as src and CV_8U type
  • For two-channel arrays:

    \texttt{dst} (I)= \texttt{lowerb} (I)_0  \leq \texttt{src} (I)_0 \leq  \texttt{upperb} (I)_0  \land \texttt{lowerb} (I)_1  \leq \texttt{src} (I)_1 \leq  \texttt{upperb} (I)_1

  • and so forth.

  意思主要是:

  src:输入图像,CV2常用Mat类型;

  lowerb:lower boundary下限,scalar类型的像素值,单通道scalar取一个值就行,彩图3通道scalar三个值;

  upperb:上限,类型与lowerb同理;

  dst:输出图像,尺寸与src一致,类型是CV_8U,但没有指定通道数。

  对于多通道的输入,输出结果是各个通道的结果相与,当各通道结果都在上下限之内时,输出为255,否则为0。因此也有人将输出理解为掩码模板!

 

看个例子吧:

int hmax = 360;
int hmax_Max = 360;
//饱和度  
int smin = 0;
int smin_Max = 255;
int smax = 255;
int smax_Max = 255;
//亮度  
int vmin = 106;
int vmin_Max = 255;
int vmax = 250;
int vmax_Max = 255;
//显示原图的窗口  
string windowName = "src";
//输出图像的显示窗口  
string dstName = "dst";
//输出图像  
Mat dst;
//回调函数  
void callBack(int, void*)
{
    //输出图像分配内存  
    dst = Mat::zeros(img.size(), CV_32FC3);
    //掩码  
    Mat mask;
    inRange(hsv, Scalar(hmin, smin / float(smin_Max), vmin / float(vmin_Max)), Scalar(hmax, smax / float(smax_Max), vmax / float(vmax_Max)), mask);
    //只保留  
    for (int r = 0; r < bgr.rows; r++)
    {
        for (int c = 0; c < bgr.cols; c++)
        {
            if (mask.at<uchar>(r, c) == 255)
            {
                dst.at<Vec3f>(r, c) = bgr.at<Vec3f>(r, c);
            }
        }
    }
    //输出图像  
    imshow(dstName, dst);
    //保存图像  
    dst.convertTo(dst, CV_8UC3, 255.0, 0);
    imwrite("HSV_inRange.jpg", dst);
}
void test_main()
{
    //输入图像  
    img = imread("E:\\素材图片\\1.png",1);
    if (!img.data || img.channels() != 3)
        return ;
    imshow(windowName, img);
    //彩色图像的灰度值归一化  
    img.convertTo(bgr, CV_32FC3, 1.0 / 255, 0);
    //颜色空间转换  
    cvtColor(bgr, hsv, COLOR_BGR2HSV);
    //定义输出图像的显示窗口  
    namedWindow(dstName, WINDOW_NORMAL);
    //调节色相 H  
    createTrackbar("hmin", dstName, &hmin, hmin_Max, callBack);
    createTrackbar("hmax", dstName, &hmax, hmax_Max, callBack);
    //调节饱和度 S  
    createTrackbar("smin", dstName, &smin, smin_Max, callBack);
    createTrackbar("smax", dstName, &smax, smax_Max, callBack);
    //调节亮度 V  
    createTrackbar("vmin", dstName, &vmin, vmin_Max, callBack);
    createTrackbar("vmax", dstName, &vmax, vmax_Max, callBack);
    callBack(0, 0);
    waitKey(0);
    return;
}

函数外的为全局变量,头文件自己加上就行。

  放两张不同的图片分割结果:

 

 

 

  第一种是通过调节H值将红色和绿色分割开,SV的值我选择保持默认。(忽略结果图右下角的输入法。。。) 

 

      

 

  第二种调节H值并没有什么改善,但是可以调节S饱和度,将车牌前景和背景对比的更加强烈。(忽略结果图右下角的输入法。。。)

原文博主:https://github.com/chenzhefan/inrange_color

 

 

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41204464/article/details/84147032

智能推荐

强化学习RL简介:从基本概念到核心算法_强化学习(rl)-程序员宅基地

文章浏览阅读21次。1. 背景介绍1.1 什么是强化学习强化学习(Reinforcement Learning,简称RL)是一种机器学习方法,它通过让智能体(Agent)在环境(Environment)中采取行动,根据环境给出的奖励(Reward)或惩罚(Punishment)来学习最优策略。强化学习的目标是让智能体_强化学习(rl)

idea项目debug启动慢,打包慢_idea debug启动很慢-程序员宅基地

文章浏览阅读4.4k次,点赞3次,收藏2次。idea项目debug慢,打包慢_idea debug启动很慢

MongoDB系列之适用场景和不适用场景_mongodb的优缺点及应用场景-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏5次。MongoDB是一款开源的分布式架构的NoSQL数据库管理系统。对于需要复杂 SQL 查询的问题。MongoDB是不太适合的,在技术选项上需要根据业务场景和公司实际情况选择合适的数据库,关系型数据库和NoSQL数据库各有优缺点,应该根据实际场景合理选择数据库..._mongodb的优缺点及应用场景

vs解决方案和项目工程_vs的解决方案和项目什么关系-程序员宅基地

文章浏览阅读5.6k次,点赞21次,收藏81次。文章目录解决方案和项目文件夹的包含关系解决方案下的文件都有什么?解决方案(fangan.sln)文件参考链接解决方案和项目文件夹的包含关系  假设新建一个项目ssyy1,解决方案起名fangan,注意解决方案包括项目,此时生成的最外层目录为fangan代表整个解决方案的内容都在这个文件夹内。在这个fangan文件夹内包含有fangan.sln的解决方案配置文件和一个ssyy1文件夹,ssyy1..._vs的解决方案和项目什么关系

网站被劫持方式汇总_劫持网站有技术员联系方式吗-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏4次。网站劫持检测1、检测网站是否被劫持2、域名是否被墙3、DNS污染检测4、网站打开速度检测5、网站是否被黑、被入侵、被改标题、被挂黑链【深度检测】1、可以检测多层js劫持、图片劫持、FLASH劫持、地区电信劫持、DNS劫持、域名被墙、DNS污染2、可以获取严重占用加载时间的JS或者图片、css等html所用文件3、不支持搜索引擎快照劫持检测最长等待时间为10分钟。 此项选..._劫持网站有技术员联系方式吗

IE8提示JS错误(KB927917)终极解决方法_ie8打开网页提示js错误-程序员宅基地

文章浏览阅读1.2w次。IE8中会报HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)这个错误。将JS代码或引用文件放入页面底部的body之后,这样代码在body被解释之后执行,就不会出现这个错误了。DatePicker控件目前会有_ie8打开网页提示js错误

随便推点

linux安装python3.7_python3.7 安装 linux-程序员宅基地

文章浏览阅读630次。这里用到的Linux系统是centos7系统,centos7是自带py的但是py的2.7.5版本 连接服务器的使用的是SSH Secure shell1.首先安装依赖包1)安装gcc编译器  gcc编译器有些系统版本已经默认安装了,可以通过 gcc --version进行查看     安装gc..._python3.7 安装 linux

BootStrap3.X模态框垂直居中显示_bootstrap3 弹出框 垂直居中-程序员宅基地

文章浏览阅读9.5k次。当点击按钮时modal的位置看起来很不舒服, 解决办法总结有两: 1.使用modal 弹出事件方法;   从官方文档中可以了解到, modal组件有不少事件接口: 其中 “shown.bs.modal”可以在弹窗框出现后 做一些处理, 更改弹出框的样式当然是可以的: script type="text/javascript"> $(_bootstrap3 弹出框 垂直居中

P4 开发实践 — 软件 DSL 架构_p4 dsl-程序员宅基地

文章浏览阅读1.1k次。P4 实现了一种 Programmable Match-Action Pipeline(流水线可编程)架构,作为 Pipeline,就是:开发者可以自定义 Match Fields、自定义 Action Type、从而实现自定义的 Match-Action Table,再由多张这样的 Tables 进而形成一条 Pipeline。_p4 dsl

【Unity实战篇 】| 2.5D游戏是如何做出来的呢,2.5D游戏快速制作教程_unity 开发2.5d游戏-程序员宅基地

文章浏览阅读4.5w次,点赞80次,收藏158次。玩过游戏的朋友都知道,市面上最常见的游戏多数分为2D和3D两种。2D和3D游戏之间的差异大家都知道,一个是类似纸片游戏属于二维层面,另一个则是在3D立体空间中游玩。其中还夹杂着一个2.5D游戏,本篇文章就来讲一下怎么通过Unity进行2.5D游戏是怎样的以及如何制作2.5D游戏。制作方法很简单,文中使用到了Tile Map Editor制作2D地图,通过控制相机角度来形成伪3D来制作2.5D效果的游戏。下面就一起来看看到底是怎样制作的吧!_unity 开发2.5d游戏

汇编实验——分类统计字符个数count_char_汇编分类统计字符个数-程序员宅基地

文章浏览阅读6.3k次,点赞3次,收藏9次。;************************************************************实验代码datarea segment mess1 db 'Please enter character string : ',13,10,'$'_汇编分类统计字符个数

大数据岗位秋招面试八股文总结(不定时更新)_大数据面试八股文-程序员宅基地

文章浏览阅读1.3k次。第一次是局部聚合,先给每个key都打上一个随机数,比如10以内的随机数,此时原先一样的key就变成不一样的了,比如(hello, 1) (hello, 1) (hello, 1) (hello, 1),就会变成(1_hello, 1) (1_hello, 1) (2_hello, 1) (2_hello, 1)。然后将各个key的前缀给去掉,就会变成(hello,2)(hello,2),再次进行全局聚合操作,就可以得到最终结果了,比如(hello, 4)。分区表按照分区字段的值进行分割,容易产生数据倾斜。_大数据面试八股文

推荐文章

热门文章

相关标签