【图像算法】彩色图像分割专题五:提取彩色图像上特定色彩

【图像算法】彩色图像分割专题五:提取彩色图像特定色彩

    SkySeraph Jun 8th 2011  HQU

Email:zgzhaobo@gmail.com    QQ:452728574

Latest Modified Date:Jun 8th 2011 HQU

一 原理及说明:

1  RGB(red,green,blue)模式是一种与设备相关的色彩空间,最常用的用途就是显示器系统。RGB下,各分量关联性太大,每个通道都编入了亮度信息,容易受周围环境影响(光照等),其与人眼认知颜色的过程不太匹配,并不适合用来对彩色图像进行分析和分割,相比下HSV空间是从人的视觉系统除法的,更适于图像分析等。更多关于各种彩色空间模型请参考http://www.cnblogs.com/skyseraph/archive/2011/05/03/2035643.html

 国内很多关于车牌识别的论文中,当利用到颜色信息时,一般都是在HSV/YIQ/Lab模式下,根据特定的车牌颜色信息(常见车牌颜色有:白底黑字、黑底白字、蓝底白字、黄底黑字等),进行车牌分割进行的。 颜色的提取方法即本文所述。 这种方法只适合特定颜色的提取,用PR术语,类似"有监督学习";反之,无监督,对任意图像进行颜色分割,属于彩色分割领域。

3  关于HSV范围的划分:

<1> 论文:Car color recognition from CCTV camera image:http://www.docin.com/p-211572110.html 

作者采用的是如下方式:

<2>论文:利用支持向量机识别汽车颜色:http://www.cnki.com.cn/Article/CJFDTotal-JSJF200405018.htm

作者首先是在Lab空间下分出16类颜色,然后再HSV下进行样本空间分解,采用如下方式:

<3>本文根据实验,采取划分方式如源码所示,在这种方式下,测试结果较好。

二 源码:

/
// Note:		颜色分割:提取特定颜色
// Version:	5/11/2011 skyseraph  zgzhaobo@gmail.com
/
void CColorSegDlg::ColorSegByHSV(IplImage* img) 
// 提取特定颜色
{//====================== 变量定义====================//int x,y; //循环//====================== 输入彩色图像信息====================//IplImage* pSrc = NULL;pSrc = cvCreateImage(cvGetSize(img),img->depth,img->nChannels);cvCopyImage(img,pSrc);int width = pSrc->width;			//图像宽度int height = pSrc->height;			//图像高度int depth = pSrc->depth;			//图像位深(IPL_DEPTH_8U...)int channels = pSrc->nChannels;		//图像通道数(1、2、3、4)int imgSize = pSrc->imageSize;		//图像大小 imageSize = height*widthStepint step = pSrc->widthStep/sizeof(uchar);    //相邻行的同列点之间的字节数: 注意widthStep != width*nChannels (有字节填零补充)uchar* data    = (uchar *)pSrc->imageData;int imageLen = width*height;		////=========================================//double B=0.0,G=0.0,R=0.0,H=0.0,S=0.0,V=0.0;IplImage* dstColorSegByColor = cvCreateImage(cvGetSize(pSrc),IPL_DEPTH_8U,3);IplImage* dstColorSegByColorGray = cvCreateImage(cvGetSize(pSrc),IPL_DEPTH_8U,1);//CvFont font = cvFont( 1, 1 );for (y=0; y<height; y++){for ( x=0; x<width; x++){// 获取BGR值B = ((uchar*)(pSrc->imageData + y*pSrc->widthStep))[x*pSrc->nChannels];G = ((uchar*)(pSrc->imageData + y*pSrc->widthStep))[x*pSrc->nChannels+1];R = ((uchar*)(pSrc->imageData + y*pSrc->widthStep))[x*pSrc->nChannels+2];//  RGB-HSVpMyColorSpace.RGB2HSV(R,G,B,H,S,V);	H = (360*H)/(2*PI);	//  黑白//黑色if(V<0.35)			{((uchar*)(dstColorSegByColorGray->imageData + y*dstColorSegByColorGray->widthStep))[x]= 0;  //灰度((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels] = 0;  //B((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+1] = 0;  //G((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+2] = 0;  //R}			//白色if(S<0.15 && V>0.75){((uchar*)(dstColorSegByColorGray->imageData + y*dstColorSegByColorGray->widthStep))[x]= 255;  //灰度((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels] = 255;  //B((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+1] = 255;  //G((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+2] = 255;  //R}//灰色if(S<0.15 && 0.35<V && V<0.75){((uchar*)(dstColorSegByColorGray->imageData + y*dstColorSegByColorGray->widthStep))[x]= 128;  //灰度((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels] = 128;  //B((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+1] = 128;  //G((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+2] = 128;  //R}//  彩色if(V>=0.35 && S>=0.15){//红色相近if((H>=0 && H<15) || (H>=340 && H<360)){((uchar*)(dstColorSegByColorGray->imageData + y*dstColorSegByColorGray->widthStep))[x]= 40;  //灰度((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels]= 0;  //B((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+1] = 0;  //G((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+2] = 255;  //R					}//黄色相近else if(H>=15 && H<75){((uchar*)(dstColorSegByColorGray->imageData + y*dstColorSegByColorGray->widthStep))[x]= 80;  //灰度((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels]= 0;  //B((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+1] = 255;  //G((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+2] = 255;  //R}//绿色相近else if(H>=75 && H<150){((uchar*)(dstColorSegByColorGray->imageData + y*dstColorSegByColorGray->widthStep))[x]= 120;  //灰度((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels]= 0;  //B((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+1] = 255;  //G((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+2] = 0;  //R					}///*//青色相近else if(H>=150 && H<185){((uchar*)(dstColorSegByColorGray->imageData + y*dstColorSegByColorGray->widthStep))[x]= 160;  //灰度((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels]= 255;  //B((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+1] = 255;  //G((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+2] = 0;  //R}//*///蓝色相近else if(H>=185 && H<270){((uchar*)(dstColorSegByColorGray->imageData + y*dstColorSegByColorGray->widthStep))[x]= 200;  //灰度((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels]= 255;  //B((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+1] = 0;  //G((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+2] = 0;  //R					}	//	/*	//洋红:270-340else if(H>=270 && H<340){((uchar*)(dstColorSegByColorGray->imageData + y*dstColorSegByColorGray->widthStep))[x]= 220;  //灰度((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels]= 255;  //B((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+1] = 0;  //G((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+2] = 255;  //R					}//*/else{((uchar*)(dstColorSegByColorGray->imageData + y*dstColorSegByColorGray->widthStep))[x]= 180;  //灰度((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels] = 128;  //B  //紫色Purple((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+1] = 0;  //G((uchar*)(dstColorSegByColor->imageData + y*dstColorSegByColor->widthStep))[x*dstColorSegByColor->nChannels+2] = 128;  //R}}}}//cvNamedWindow("src",1);//cvShowImage("src",pSrc);cvNamedWindow("dstColorSegByColor",1);cvShowImage("dstColorSegByColor",dstColorSegByColor);cvNamedWindow("dstColorSegByColorGray",1);cvShowImage("dstColorSegByColorGray",dstColorSegByColorGray);cvSaveImage(".\\dstColorSegByColor.jpg",dstColorSegByColor);cvSaveImage(".\\dstColorSegByColorGray.jpg",dstColorSegByColorGray);cvWaitKey(0);cvDestroyAllWindows();cvReleaseImage(&pSrc);cvReleaseImage(&dstColorSegByColor);cvReleaseImage(&dstColorSegByColorGray);}

三 效果:

(1)原图

(2)颜色分割后彩色图

(3)颜色分割后灰度图(利用不同灰度级显示)

  四 补充(RGB模式下,来源网络)

1 源码

void CFindRGBDlg::OnFind() 
{int color=m_colorList.GetCurSel();pic=cvCreateImage( cvSize(image->width,image->height), 8, 1 );cvZero(pic);for(int x=0;x<image->height;x++){for(int y=0;y<image->width;y++) {uchar* ptrImg = &CV_IMAGE_ELEM(image,uchar,x,y*3);//	uchar* ptrPic = &((uchar*)(pic->imageData + pic->widthStep*y))[x];//redif(color==0){if((ptrImg[0]-ptrImg[1])>200&&(ptrImg[0]-ptrImg[2])>200)CV_IMAGE_ELEM(pic,uchar,x,y)=255;}//Greenelse if(color==1){if((ptrImg[1]-ptrImg[0])>200&&(ptrImg[1]-ptrImg[2])>200)CV_IMAGE_ELEM(pic,uchar,x,y)=255;}//blueelse if(color==2){if((ptrImg[2]-ptrImg[0])>200&&(ptrImg[2]-ptrImg[1])>200)CV_IMAGE_ELEM(pic,uchar,x,y)=255;}}}cvNamedWindow("temp",-1);cvShowImage("temp",pic);cvWaitKey();storage = cvCreateMemStorage(0);contour = 0;mode = CV_RETR_EXTERNAL;cvFindContours( pic, storage, &contour, sizeof(CvContour), mode, CV_CHAIN_APPROX_SIMPLE);cvDrawContours(image, contour, CV_RGB(0,0,0), CV_RGB(0, 0, 0), 2, 2, 8);CRect rect; GetDlgItem(IDC_PICTURE)->GetClientRect(&rect); InvalidateRect(rect,true);	
}

2 效果:

 

More in  http://skyseraph.com/2011/08/27/CV/图像算法专题/ 

 

Author:         SKySeraph

Email/GTalk: zgzhaobo@gmail.com    QQ:452728574

From:         http://www.cnblogs.com/skyseraph/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果

转载于:https://www.cnblogs.com/skyseraph/archive/2011/06/08/2075599.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标记一下 两个Google Chrome 源码研究的网站

大坡3D软件开发&#xff1a; http://blog.csdn.net/caimouse/archive/2008/09/07/2893806.aspx Venus神庙&#xff1a; http://www.cnblogs.com/duguguiyu/archive/2008/10/02/1303095.html

k8s基础学习-存储卷

存储卷的几种类型&#xff1a; emptyDir -- 用于存储临时数据的简单空目录 hostPath -- 用于将目录从工作节点的文件系统挂载到pod中 gitRepo -- 通过检出Git仓库的内容来初始化的卷 nfs -- 挂载到pod中的NFS共享卷 configMap&#xff0c;secret&#xff0c;downwardAPI--用于将…

SharePoint里如何设置People picker值为当前登录用户值

摘要&#xff1a; 相信很多朋友都遇到过需要将某个People类型的字段值设置为当前登录用户的情况而且已经给出了解决方案&#xff0c;因此本文没有什么新意&#xff0c;算法上也比较冗余&#xff0c;仅仅在博客里算作知识的备份。 思路&#xff1a; 在画面的右上角有一个欢迎控件…

SQL存储过程的导入导出

转贴网址&#xff1a;http://haitao.javaeye.com/blog/782365 近日在研究SQL的存储过程&#xff0c;这里我陆续将我在使用存储过程中碰到的问题及解决办法发布到网上&#xff0c;请各位大虾指正。   SqlServer存储过程的导出导入   打开“企业管理器”&#xff0c;选择需要…

osg指定向量旋转指定角度

向量AB&#xff0c;沿着n旋转10度 osg::Vec3 left AB*osg::Matrix::rotate(osg::inDegrees(10), n); osg::Vec3 right AB*osg::Matrix::rotate(osg::inDegrees(-10), n);//right-left 特殊情况下&#xff0c;可以使用向量叉乘实现&#xff0c;例如旋转90度 osg::Vec3 left n…

android webservice 简单应用

http://www.cnblogs.com/ghj1976/archive/2011/04/26/2028904.html

《Linux内核完全注释》《完全剖析》 » 阅读本书所需的基础知识 -- 再次强调。

转贴网址&#xff1a;http://www.oldlinux.org/oldlinux/viewthread.php?tid2551&extrapage%3D1 [这个贴子最后由redgrid在 2006/08/09 00:45pm 第 17 次编辑]Linux 0.11虽然不是什么“珠穆朗玛峰”&#xff0c;但它肯定还是“华山”或“泰山”。虽然有路但你还是需要最基…

Linux 系统下载网址

网址&#xff1a;http://download.chinaunix.net/disc/linux/

Linux tp5伪静态设置

.htaccess文件写入下面规则 <IfModule mod_rewrite.c>Options FollowSymlinksRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]</IfModule> 转载于:https://www.cnblogs.com/d…

IT绩效管理消除IT与业务之间的隔阂

近日&#xff0c;惠普公司公布了一项针对亚太地区用户IT绩效考核方式的调查结果&#xff1a;91%的企业高管认为IT绩效考核是一个重要工具&#xff0c;但实际上只有50%的高管在做决策时参考了IT绩效考核数据。企业对IT绩效考核的期望值与考核的实际执行之间为何会有如此大的落差…

WinCE下监视设备插拔的参考代码

在一些项目中&#xff0c;系统需要实时监测U盘或SD卡的插入拔出。当文件系统加载成功后通知特定应用程序&#xff0c;启动自动播放功能。在U盘或其他外部存储设备移除时&#xff0c;也需要立即通知相应的程序&#xff0c;停止访问这些设备&#xff0c;如播放其中的音视频文件&a…

ubuntu命令行登录

网址&#xff1a;http://hi.baidu.com/tingphoon/blog/item/9f03b41c7973a58c86d6b635.html 方法一&#xff1a; 转到kubuntu之前曾经学习了一下&#xff0c;了解到ubuntu在6.10开始用upstart替代init&#xff0c;主要脚本都在/etc/event.d下面&#xff0c;默认情况下/etc下没…

圆桌论坛对话:互联网产业革命

2019独角兽企业重金招聘Python工程师标准>>> 圆桌论坛对话&#xff1a;互联网产业革命 2012年12月18日&#xff0c;2012中国互联网经济论坛即将召开在北京万豪酒店举行。本次大会以“得势者、得天下”为主题&#xff0c;着眼于网络广告与新媒体&#xff0c;深度聚焦…

__va_rounded_size

Linux内核STDarg.h 中 #define __va_rounded_size(TYPE) / (((sizeof (TYPE) sizeof (int) - 1) / sizeof (int)) * sizeof (int)) 求Type 类型所占有的字节数。以int为最小单元&#xff0c;

.net性能测试和优化1 基本概念

软件的性能问题是个绕不开的问题&#xff0c;最近看了这方面的一本书&#xff0c;把主要的内容笔记一下 Performance, load, and stress testing 性能测试 负载测试 压力测试 http://www.51testing.com/?uid-61747-action-viewspace-itemid-3036 性能测试的目的不是去找bugs,而…

Windows PowerShell:(2)基本操作

一、启动PowerShell 2.0 打开“开始”、“所有程序”、“附件”、“Windows PowerShell”程序组&#xff0c;点击“Windows PowerShell”。 二、基本操作 1、查看可用的命令的列表 Get-Command 注&#xff1a;PowerShell有自动补齐命令的功能。例如&#xff0c;在本例中只需要输…

Install Python3.6 on Amazon Linux/EC2 在Amazon Linux实例中安装使用Python3.6

本文转载自 https://gist.github.com/niranjv/f80fc1f488afc49845e2ff3d5df7f83b 由于Amazon Linux中预装的Python版本为2.7&#xff0c;该脚本教程很好地解决了在Amazon Linux中安装Python3.6的需求&#xff0c;遂转发记录至此 # install pre-requisites sudo yum -y groupins…

怎样从red hat linux图形登录改成从文本登录

修改 /etc/inittab id:5:initdefault: 把 5 改为 3 就是文本方式 需要用vi文件打开才可以保存&#xff01;

sicily 1012. Stacking Cylinders

//纯计算题,三角形内,已知两点坐标A(x1,y1),B(x2,y2)&#xff0c;求第三点的坐标C(x3,y3),其中顶点A,B到C距离都为2//由 (x3-x1)^2(y3-y1)^24 和 (x3-x2)^2(y3-y2)^24 //可得 2(x2-x1)*x32(y2-y1)*y3x2^2-x1^2y2^2-y1^2 (1)//设A,B距离为L,则顶点C到直线AB的距离 H2*sin<CAB…

CMDB小计1

1.web开发&#xff08;Django&#xff0c;flask&#xff0c; tornado&#xff09;。 2.自动化运维&#xff08;CMDB项目&#xff09;。 3.爬虫 和 数据分析。 4.自动化测试。 4.人工智能&#xff0c;机械学习&#xff0c; 算法 CMDB 项目&#xff1a; 自动化运维&#xff1a; 运…