当前位置:  编程技术>移动开发
本页文章导读:
    ▪由RGB到HSV颜色空间的懂得        由RGB到HSV颜色空间的理解1. RGB模型 2. HSV模型 3. 如何理解RGB与HSV的联系 4. HSV在图像处理中的应用 5. opencv中RGB-->HSV实现 在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像.........
    ▪ 上载电驴屏蔽资源办法        下载电驴屏蔽资源办法最近发现了下载屏蔽掉的电驴资源下载办法,分享下: 比如说网址:http://www.verycd.com/topics/2864445/ 改为:http://www.verycd.gdajie.com/topics/2864445/ 即:在verycd.后面加gdajie就.........
    ▪ 应用AF_INET实现UDP点对点通信示例       使用AF_INET实现UDP点对点通信示例此示例程序实现AF_INET实现UDP点对点通信示例,即采用AF_INET协议,数据传送方式为UDP数据报方式,主要功能是发送方向接收方发送一条简单的消息“hello world!.........

[1]由RGB到HSV颜色空间的懂得
    来源: 互联网  发布时间: 2014-02-18
由RGB到HSV颜色空间的理解

1. RGB模型

2. HSV模型

3. 如何理解RGB与HSV的联系

4. HSV在图像处理中的应用

5. opencv中RGB-->HSV实现


在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,非常容易被理解。

而HSV模型,是针对用户观感的一种颜色模型,侧重于色彩表示,什么颜色、深浅如何、明暗如何。第一次接触HSV,书本里首先抛出的是一个圆锥模型,由于很少使用HSV,所以印象不深刻,但看一些资料时,HSV的概念时不时出来骚扰一些人的神经,所以,弄清楚HSV与RGB的关系,建立直观的印象是很有必要的。


1. RGB模型。

三维坐标:


原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。

用RGB来理解色彩、深浅、明暗变化:

色彩变化: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线

深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离

明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮


PS: 光学的分析

三原色RGB混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,与人的生理系统有关。

只能说“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。”


2. HSV模型

倒锥形模型:


这个模型就是按色彩、深浅、明暗来描述的。

H是色彩

S是深浅, S = 0时,只有灰度

V是明暗,表示色彩的明亮程度,但与光强无直接联系,(意思是有一点点联系吧)。




3. RGB与HSV的联系

从上面的直观的理解,把RGB三维坐标的中轴线立起来,并扁化,就能形成HSV的锥形模型了。

但V与强度无直接关系,因为它只选取了RGB的一个最大分量。而RGB则能反映光照强度(或灰度)的变化。

v = max(r, g, b)

由RGB到HSV的转换:


"  HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到淡蓝色,V=1 S=0.4 H=240度。" --百度百科


4. HSV在图像处理应用


HSV在用于指定颜色分割时,有比较大的作用。

H和S分量代表了色彩信息。

分割应用:

      用H和S分量来表示颜色距离,颜色距离指代表两种颜色之间的数值差异。
     Androutsos等人通过实验对HSV颜色空间进行了大致划分,亮度大于75%并且饱和度大于20%为亮彩色区域,亮度小于25%为黑色区域,亮度大于75%并且饱和度小于20%为白色区域,其他为彩色区域。

   对于不同的彩色区域,混合H与S变量,划定阈值,即可进行简单的分割。


HSV的去阴影算法:

Improving shadow suppression in moving object detection with HSV color information


5. RGB --> HSV中的opencv实现


struct RGB2HSV_f
{
    typedef float channel_type;
    
    RGB2HSV_f(int _srccn, int _blueIdx, float _hrange)
    : srccn(_srccn), blueIdx(_blueIdx), hrange(_hrange) {}
    
    void operator()(const float* src, float* dst, int n) const
    {
        int i, bidx = blueIdx, scn = srccn;
        float hscale = hrange*(1.f/360.f);
        n *= 3;
    
        for( i = 0; i < n; i += 3, src += scn )
        {
            float b = src[bidx], g = src[1], r = src[bidx^2];
            float h, s, v;
            
            float vmin, diff;
            
            v = vmin = r;
            if( v < g ) v = g;
            if( v < b ) v = b;       // v = max(b, g, r)
            if( vmin > g ) vmin = g;
            if( vmin > b ) vmin = b;
            
            diff = v - vmin;
            s = diff/(float)(fabs(v) + FLT_EPSILON);  // s = 1 - min/max
            diff = (float)(60./(diff + FLT_EPSILON));
            if( v == r )
                h = (g - b)*diff;
            else if( v == g )
                h = (b - r)*diff + 120.f;
            else
                h = (r - g)*diff + 240.f;
            
            if( h < 0 ) h += 360.f;  // h 求值
            
            dst[i] = h*hscale;
            dst[i+1] = s;
            dst[i+2] = v;
        }
    }
    
    int srccn, blueIdx;
    float hrange;
};


RGB --> GRAY的实现 算法:

template<typename _Tp> struct RGB2Gray
{
    typedef _Tp channel_type;
    
    RGB2Gray(int _srccn, int blueIdx, const float* _coeffs) : srccn(_srccn)
    {
        static const float coeffs0[] = { 0.299f, 0.587f, 0.114f };  // 三分量系数不同,人眼对绿色最敏感,所以G分量系数较大
        memcpy( coeffs, _coeffs ? _coeffs : coeffs0, 3*sizeof(coeffs[0]) );
        if(blueIdx == 0)
            std::swap(coeffs[0], coeffs[2]);
    }
    
    void operator()(const _Tp* src, _Tp* dst, int n) const  // 运算
    {
        int scn = srccn;
        float cb = coeffs[0], cg = coeffs[1], cr = coeffs[2];
        for(int i = 0; i < n; i++, src += scn)
            dst[i] = saturate_cast<_Tp>(src[0]*cb + src[1]*cg + src[2]*cr);  // 结果
    }
    int srccn;
    float coeffs[3];
};



    
[2] 上载电驴屏蔽资源办法
    来源: 互联网  发布时间: 2014-02-18
下载电驴屏蔽资源办法

最近发现了下载屏蔽掉的电驴资源下载办法,分享下:


比如说网址:http://www.verycd.com/topics/2864445/

改为:http://www.verycd.gdajie.com/topics/2864445/

即:在verycd.后面加gdajie就可以了!

感兴趣的可以试下!!!!!



    
[3] 应用AF_INET实现UDP点对点通信示例
    来源: 互联网  发布时间: 2014-02-18
使用AF_INET实现UDP点对点通信示例

此示例程序实现AF_INET实现UDP点对点通信示例,即采用AF_INET协议,数据传送方式为UDP数据报方式,主要功能是发送方向接收方发送一条简单的消息“hello world!”.

服务器端要先运行,然后运行客户端程序

客户端程序代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <arpa/inet.h>
int main(int argc,char *argv[])
{
	struct sockaddr_in s_addr;
	int sock;
	int addr_len;
	int len;
	char buff[128];
	if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		perror("socket");
		exit(1);
	}
	else
		printf("sock init done\n");
	s_addr.sin_family = AF_INET;
	s_addr.sin_port   = htons(7838);
	if(argv[1])
		s_addr.sin_addr.s_addr = inet_addr(argv[1]);
	else
	{
		printf("input server ip\n");
		exit(0);
	}
	addr_len = sizeof(s_addr);
	strcpy(buff,"hello,world");
	len=sendto(sock,buff,strlen(buff),0,(struct sockaddr *)&s_addr,addr_len);
	if(len<0)
	{
		perror("sendto");
		exit(1);
	}
	printf("send sucess");
	return 0;
}


 

服务器端程序代码:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <arpa/inet.h>
int main()
{
	struct sockaddr_in s_addr;
	struct sockaddr_in c_addr;
	int sock;
	socklen_t addr_len;
	int len;
	char buff[128];
	if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		perror("socket");
		exit(1);
	}
	else
		printf("create socket\n");
	memset(&s_addr,0,sizeof(s_addr));
	s_addr.sin_family = AF_INET;
	s_addr.sin_port   = htons(7838);
	s_addr.sin_addr.s_addr=INADDR_ANY;
	if(bind(sock,(struct sockaddr *)&s_addr,sizeof(s_addr))==-1)
	{
		perror("bind");
		exit(1);
	}
	else
		printf("bind address to sock.\n\r");
	addr_len=sizeof(c_addr);
	while(1)
	{
		len = recvfrom(sock,buff,sizeof(buff)-1,0,(struct sockaddr *)&c_addr,&addr_len);
		if(len<0)
		{
			perror("recvfrom");
			exit(1);
		}
		buff[len]='\0';
		printf("receive come from %s:%d message:%s\n\r",
				inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port),buff);
	
	}

	return 0;
}





OVER!

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
IT科技资讯 iis7站长之家
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3