opencv 彩色图像分割(inrange)
灰度图像大多通过算子寻找边缘和区域生长融合来分割图像。
彩色图像增加了色彩信息,可以通过不同的色彩值来分割图像,常用彩色空间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:

and so forth.
意思主要是:
src:输入图像,CV2常用Mat类型;
lowerb:lower boundary下限,scalar类型的像素值,单通道scalar取一个值就行,彩图3通道scalar三个值;
upperb:上限,类型与lowerb同理;
dst:输出图像,尺寸与src一致,类型是CV_8U,但没有指定通道数。
对于多通道的输入,输出结果是各个通道的结果相与,当各通道结果都在上下限之内时,输出为255,否则为0。因此也有人将输出理解为掩码模板!
看个例子吧:
int hmax = ;
int hmax_Max = ;
//饱和度
int smin = ;
int smin_Max = ;
int smax = ;
int smax_Max = ;
//亮度
int vmin = ;
int vmin_Max = ;
int vmax = ;
int vmax_Max = ;
//显示原图的窗口
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 = ; r < bgr.rows; r++)
{
for (int c = ; c < bgr.cols; c++)
{
if (mask.at<uchar>(r, c) == )
{
dst.at<Vec3f>(r, c) = bgr.at<Vec3f>(r, c);
}
}
}
//输出图像
imshow(dstName, dst);
//保存图像
dst.convertTo(dst, CV_8UC3, 255.0, );
imwrite("HSV_inRange.jpg", dst);
}
void test_main()
{
//输入图像
img = imread("E:\\素材图片\\1.png",);
if (!img.data || img.channels() != )
return ;
imshow(windowName, img);
//彩色图像的灰度值归一化
img.convertTo(bgr, CV_32FC3, 1.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(, );
waitKey();
return;
}
函数外的为全局变量,头文件自己加上就行。
放两张不同的图片分割结果:
    
第一种是通过调节H值将红色和绿色分割开,SV的值我选择保持默认。(忽略结果图右下角的输入法。。。)
  
    
第二种调节H值并没有什么改善,但是可以调节S饱和度,将车牌前景和背景对比的更加强烈。(忽略结果图右下角的输入法。。。)
更多调节策略欢迎大家评价~~
附上完整可运行代码路径,还是不能运行的注意 readme。 https://github.com/chenzhefan/inrange_color
opencv 彩色图像分割(inrange)的更多相关文章
- Opencv均值漂移pyrMeanShiftFiltering彩色图像分割流程剖析
		
meanShfit均值漂移算法是一种通用的聚类算法,它的基本原理是:对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为 ...
 - OpenCV 之 图像分割 (一)
		
1 基于阈值 1.1 基本原理 灰度阈值化,是最简单也是速度最快的一种图像分割方法,广泛应用在硬件图像处理领域 (例如,基于 FPGA 的实时图像处理). 假设输入图像为 f,输出图像为 g,则经 ...
 - opencv 金字塔图像分割
		
我所知的opencv中分割函数:watershed(只是看看效果,不能返回每类pixel类属),cvsegmentImage,cvPyrSegmentation(返回pixel类属) 金字塔分割原理篇 ...
 - opencv::分水岭图像分割
		
分水岭分割方法原理 (3种) - 基于浸泡理论的分水岭分割方法 (距离) - 基于连通图的方法 - 基于距离变换的方法 图像形态学操作: - 腐蚀与膨胀 - 开闭操作 分水岭算法运用 - 分割粘连对象 ...
 - opencv::KMeans图像分割
		
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...
 - 立体匹配:关于用OpenCV彩色化middlebury网站给定的视差
		
#include "XYZ.h" void readPFM(Mat_<float> &disp, float &scale, string path) ...
 - opencv 彩色图像亮度、对比度调节 直方图均衡化
		
直接上代码: #include <Windows.h> #include <iostream>// for stand I/O #include <string> ...
 - opencv kmeans 图像分割
		
利用kmeans算法,将彩色图像的像素点作为样本,rgb值作为样本的属性, 对图像所有的像素点进行分类,从而实现对图像中目标的分割. c++代码(openCV 2.4.11) Scalar color ...
 - OpenCV meanshift 图像分割代码
		
参考:这个帖子的主要代码有错误,根据回帖改了一些 http://www.cnblogs.com/tornadomeet/archive/2012/06/06/2538695.html // means ...
 
随机推荐
- Windows下多线程编程(二)
			
线程的分类 1. 有消息循环线程 MFC中有用户界面线程,从CWinThread派生出一个新的类作为UI线程类CUIThread,然后调用AfxBeginthread(RUNTIME_CLAS ...
 - Java线程池停止空闲线程是否有规则呢?
			
Java线程池中线程的数量超过核心线程的数量,且所有线程空闲,空闲时间超过keepAliveTime,会停止超过核心线程数量的线程,那么会保留哪些线程呢?是不是有规则呢? 测试代码: ThreadPo ...
 - Jenkins配置项目构建后的钉钉通知
			
首先在任意一个钉钉群里创建自定义的钉钉机器人,然后能够看到钉钉开放的webhook 复制webhook Jenkins中安装钉钉插件,然后在项目的配置当中,构建后操作里添加钉钉报警 url一般默认已经 ...
 - ql Server 2012完全卸载方法
			
第一步,在控制面板里面找到程序——卸载程序这一项,打开之后就会是这样的了 第二步,经过第一步打开卸载程序后,在里面找到Microsoft SQLserver 2012 (64-bit)这一项,可以通过 ...
 - 一本通1639Biorhythms
			
1639:Biorhythms 时间限制: 1000 ms 内存限制: 524288 KB [题目描述] 原题来自:POJ 1006 人生来就有三个生理周期,分别为体力.感情和智力周期 ...
 - [代码]--ORA-01843: 无效的月份
			
1.插入的日期如果是DateTime类型的,没有影响 2.如果DateTime.ToString()获取的日期,就会报错,例如(@param_datetime = cf.GetServerDateTi ...
 - 【刷题】BZOJ 4946 [Noi2017]蔬菜
			
Description http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf Solution 网上大部分都是并查集写法,但是有大神写了非并查集写 ...
 - Crash dump进程信息
			
linux下 比较简单,这里不在说明, windows下 相对复杂一点,用SetUnhandledExceptionFilter 来捕获 MiniDumpWriteDump 来写dmp文件,这种方法还 ...
 - 洛谷P3227 切糕
			
最小割模板. 题意:你要在一个三维点阵的每个竖条中删去一个点,使得删去的点权和最小. 且相邻(四联通)的两竖条之间删的点的z坐标之差的绝对值不超过D. 解: 首先把这些都串起来,点边转化,就变成最小割 ...
 - [应用篇]第二篇 JSP自带标签介绍
			
JSP 有以下三类标签: 指令:JSP Directive 指令标签用于设置与整个 JSP 页面相关的属性,非常常用. 下面的三种标签是我们使用频率最高的 标签 jsp标签 描述 <%@ pag ...